我刚写了以下代码:
if (++(data_ptr->count) > threshold) { /*...*/ } // example 1
我的意图是在count
与data_ptr
进行比较之前,在threshold
指向的数据结构中增加data_ptr
变量,这段代码可以正常工作。
如果我在进行比较之前想要增加if ((++data_ptr)->count > threshold) { /*...*/ } // example 2
,我会写这个:
if (++data_ptr->count > threshold) { /*...*/ } // example 3
出于好奇,我也尝试了这行代码:
if
发现它的行为与第一个完全相同。
第一个问题: 为什么示例#3与示例#1的工作方式相同?这是运营商优先考虑的问题吗?标准中的东西?我不得不写一个快速的测试程序,因为答案对我来说并不明显。
第二个问题:我应该以不同的方式撰写此{{1}}语句吗?我可以先在自己的行上执行增量,然后然后测试条件,以避免任何可能的混淆。这是必要的,或者前两个例子是否足够明显?
答案 0 :(得分:11)
1)优先权
2)偏好
答案 1 :(得分:5)
是的,这是运营商优先权的问题。箭头运算符has higher precedence比增量运算符。
为了回答你的第二个问题,我通常将这种类型的结构分成两个单独的陈述:
++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }
这强调了正在发生的事情并消除了可能的混淆。但是,这可能是一个偏好问题。
答案 2 :(得分:5)
例如:
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...
}
答案 3 :(得分:3)