例如,这两个陈述之间的区别:
if ( ucNum++ >= 3 ) // ucNum incremented after comparing its value to 3, correct?
{
ucNum = 0;
}
VS
ucNum++ >= 3 ? ucNum = 0 : 1; // does incrementing it happen somewhere in the middle of the inline?
也许它是特定于编译器的。 应该在条件表达式中出现?
答案 0 :(得分:7)
规则是在选择要评估的替代方案之前评估条件。由于部分评估是++
,因此增量将在分配之前发生(如果分配完全发生)。
作为@caf注释,控制表达式后面有一个序列点。因此,虽然(正如David Thornley指出的那样)表达式评估的顺序可以由编译器重新排列(特别是副作用评估),但重新排列不能跨越序列点。
答案 1 :(得分:1)
好吧,我已经用以下方法测试了这个(好的东西printf返回int):
int ucNum = 4;
ucNum++ >= 3 ? printf("%d", ucNum) : 1;
由于条件为真,它会进入打印5的printf。所以绝对ucNum在条件评估和返回值选择之间递增。
答案 2 :(得分:1)
你正在寻找C标准中的6.5.15 / 4。第一个表达式在其他两个中选定的一个之前被完全评估,包括副作用。这不依赖于编译器,除非某些编译器可能被破坏。