Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结合指针解引用运算符正确使用预增量运算符_C_Operators_Increment_Dereference - Fatal编程技术网

C 结合指针解引用运算符正确使用预增量运算符

C 结合指针解引用运算符正确使用预增量运算符,c,operators,increment,dereference,C,Operators,Increment,Dereference,我刚刚编写了以下代码行: if (++(data_ptr->count) > threshold) { /*...*/ } // example 1 if (++data_ptr->count > threshold) { /*...*/ } // example 3 我的目的是在与阈值进行比较之前,增加data\u ptr指向的数据结构中的count变量,这一行代码起作用 如果我想在进行比较之前增加数据_ptr,我会这样写: if ((++data_ptr)->

我刚刚编写了以下代码行:

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1
if (++data_ptr->count > threshold) { /*...*/ } // example 3
我的目的是在与
阈值
进行比较之前,增加
data\u ptr
指向的数据结构中的
count
变量,这一行代码起作用

如果我想在进行比较之前增加
数据_ptr
,我会这样写:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2
出于好奇,我还尝试了以下代码:

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1
if (++data_ptr->count > threshold) { /*...*/ } // example 3
发现它的行为和第一个完全一样

第一个问题:为什么示例3的工作原理与示例1相同?这是一个操作人员提前的问题吗?标准中有什么?我不得不写一个快速测试程序,因为答案对我来说并不明显

第二个问题:如果语句不同,我是否应该编写此
?我可以先在自己的行上执行增量,然后测试条件,以避免任何可能的混淆。这是必要的,还是前两个例子本身就足够明显

  • ->运算符绑定比++更紧密
  • 它们都有很好的定义,我认为它们很容易阅读。如果在同一个表达式中有对data_ptr的额外引用,事情只会变得棘手

  • 是的,这是一个运算符优先级的问题。箭头运算符比增量运算符更重要

    为了回答你的第二个问题,我通常会将这种类型的构造分为两个单独的语句:

    ++(data_ptr->count);
    if(data_ptr->count > threshold) { /*...*/ }
    
    这强调了正在发生的事情并消除了可能的混淆。然而,这可能是一个偏好的问题。

    1)优先权

    2) 偏好

  • 运算符优先级指示您观察到的行为
  • <> LI>在这个例子中,如果将增量与比较值分开,不会有太大的伤害,但有时你希望在一系列条件的中间有一个递增的条件,然后尝试将增量与测试分离可能会引入嵌套,从而损害代码的可读性,否则这些嵌套是不必要的 例如:

    if (...1...)
        ...2...
    else if (++data_ptr->count > threshold)
        ...3...
    else
        ...4...
    
    与:

    if (...1...)
        ...2...
    else
    {
        ++data_ptr->count;
        if (data_ptr->count > threshold)
            ...3...
        else
            ...4...
    }