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...
}