可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
#include<stdio.h>
void main()
{
int a=5;
printf("%d\t%d\t%d\n",a,a++,++a);
}
上述程序的输出显示gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)中的7 6 7。它为什么显示而不是7 6 6?
答案 0 :(得分:4)
您的程序可以显示任何喜欢的内容,输出也是正确的。
行为未定义;任何事都可以发生。
什么是未定义的?
a
两次递增到printf()
。 void main()
的行为充其量是实现定义的。 main()
的返回类型应为int
。
§6.5表达式
¶2如果相对于不同的副作用,对标量对象的副作用是无效的 在相同的标量对象上或使用相同标量的值进行值计算 对象,行为未定义。如果有多个允许的排序 表达式的子表达式,如果这样一个未经测序的一方,则行为是不确定的 效果发生在任何排序中。 84)
84)此段落呈现未定义的语句表达式,例如
i = ++i + 1; a[i++] = i;
允许
i = i + 1; a[i] = i;
答案 1 :(得分:1)
在C中未定义的一个语句中多次修改同一个变量。你应该避免这样做,因为结果是不可预测的,并且可能在编译器之间。
答案 2 :(得分:-1)
“a ++”和“++ a”之间区别的简单解释是:
使用“a ++”时,在操作之后增量不是,在操作之前完成“++ a”。
例如:
a = 0; print("%d ", a++); printf("%d ",a);
会给你0 1
。
a = 0; print("%d ", ++a); printf("%d ",a);
会给你1 1
。