C 使用增量运算符时未定义的行为
我是C语言的新手,我在C语言中有一个增量运算符程序C 使用增量运算符时未定义的行为,c,pre-increment,C,Pre Increment,我是C语言的新手,我在C语言中有一个增量运算符程序 #include<stdio.h> main(){ int a, b; a = 2; b = a + ++a + ++a; printf("%d", b); getchar(); } 输出是10,有人能告诉我输出是10吗。这是未定义的,++i可以按任何顺序发生 函数调用参数的计算也不明确,例如foo++i、++i 并非所有操作符链都是未定义的,例如,a | | b | c保证从左到右 这些保证是在已知的位置进行
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
输出是10,有人能告诉我输出是10吗。这是未定义的,++i可以按任何顺序发生
函数调用参数的计算也不明确,例如foo++i、++i
并非所有操作符链都是未定义的,例如,a | | b | c保证从左到右
这些保证是在已知的位置进行的,尽管C++0x中不推荐并澄清了这个术语
在您的示例中,奇怪的是没有发生2+3+4或4+4+3,因此编译器在一个步骤中首先计算左侧,在另一个步骤中首先计算右侧。这可能是一个优化,以使依赖关系图变得平坦
a + ++a + ++a;
这方面的行为尚未定义。
编译器可能会生成计算结果为2+4+4或3+3+4的代码,但递增和访问的任何组合/顺序都是有效的结果。未定义的行为。鼻魔。这类问题经常出现。为什么要投反对票?。。。o、 哦+1,作为补偿。不仅仅是++i可以以任何顺序出现:除了&、| |、?:和之外,运算符周围没有序列点,函数参数之间也没有分隔的序列点。参见例如§C和§5.1.2.3。如果一个对象在写入和读取时都没有中间的序列点,那么该行为是未定义的§6.5.16.3。难道它不能先是4+4+4增量吗?不仅如此,因为该行为是未定义的,所以打印42或错误的差异!没有饼干!是一种有效的行为,但在实践中极不可能。让电脑起火,或者按照经典公式,让恶魔从你的鼻子里飞过去。当然,任何命令都可以。我刚刚写了10个例子。@Giles行为不是未定义的,行为的顺序是未定义的。不允许打印42。然而,你纠正了我对“关联”一词的使用,这是对的。@Gilles:我等了10年才找到一个能做这些事情的编译器。看来我得自己写了。