Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用增量运算符时未定义的行为_C_Pre Increment - Fatal编程技术网

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保证从左到右 这些保证是在已知的位置进行

我是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保证从左到右

这些保证是在已知的位置进行的,尽管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年才找到一个能做这些事情的编译器。看来我得自己写了。