C代码中的Post增量给出意外答案

C代码中的Post增量给出意外答案,c,C,可能重复: 请解释以下输出的原因 #include <stdio.h> int main() { int i = 0, j = 0; int val1 = 0; int val2 = 0; val1 = i+++i+++i++ ; val2 = ++j+++j+++j ; printf("value = %d\n", val1); printf("value = %d\n", val2); return 0; }

可能重复:

请解释以下输出的原因

#include <stdio.h>

int main()
{
    int i = 0, j = 0;
    int val1 = 0;
    int val2 = 0;

    val1 = i+++i+++i++ ;
    val2 = ++j+++j+++j ;

    printf("value = %d\n", val1);
    printf("value = %d\n", val2);
    return 0;
}

没有中间序列点的变量多重变化是未定义的行为

这意味着规范中没有关于应该发生什么的定义。编译器可以自由地做任何它想做的事情——任何事情


序列点仅出现在
&&
|
,以及
(逗号运算符,不要与函数调用中的逗号分隔参数混淆)。

在没有插入序列点的情况下多次修改同一变量,这是未定义的行为
未定义的行为仅仅意味着对程序的行为可能有也可能没有任何可行的解释

读得好:

。首先,你期待什么?这是一种未定义的行为。意识到这类代码的行为非常重要,以防您遇到它。等等:)?val1=i+++i+++i++;val2=++j+++j+++j;嘿,但我在我的Ubuntu11.04电脑上成功编译了它。它执行时没有任何错误。未定义的行为不一定会导致错误或编译失败。根据ISO C规范,它可以编译,理论上可以做任何事情。是的,它可以工作,但不能保证在其他版本或平台上的结果是相同的,即使在使用其他遵循该标准的编译器时也是如此(因为这超出了标准)。如果你想比较一下,这就像拿一根电源线得出结论,左边的电线总是很热。@Sen:问题是表达式的求值顺序和副作用的应用顺序没有确定;编译器可以按照它想要的任何顺序计算这些表达式。因此,不同的编译器(甚至同一个编译器具有不同的优化设置)的结果会有所不同。语言标准没有定义行为,因此编译器没有义务检测这些情况并发出诊断。就语言定义而言,任何结果都是“正确的”。
value = 0  
value = 7