使用条件?:表达式,后缀操作在什么时候发生?

时间:2011-11-21 19:19:52

标签: c

例如,这两个陈述之间的区别:

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?

也许它是特定于编译器的。 应该在条件表达式中出现?

3 个答案:

答案 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。第一个表达式在其他两个中选定的一个之前被完全评估,包括副作用。这不依赖于编译器,除非某些编译器可能被破坏。