0

可能重复:
谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等……)

#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 ?

4

3 回答 3

4

您的程序可以显示它喜欢的任何内容并且输出是正确的。

行为未定义;任何事情都可以发生。

什么是未定义的?

  • 在参数列表中增加a两次到printf().

的行为void main()充其量是实现定义的。的返回类型main()应该是int.


ISO/IEC 9899:2011 (C 2011) 标准

§ 6.5 表达式

¶2 如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用相同标量对象的值的值计算是未排序的,则行为未定义。如果一个表达式的子表达式有多个允许的排序,则如果在任何排序中出现这种未排序的副作用,则行为是未定义的。84)

84)本段呈现未定义的语句表达式,例如

    i = ++i + 1;
    a[i++] = i;

同时允许

    i = i + 1;
    a[i] = i;
于 2012-06-29T18:24:15.507 回答
1

在 C 中 undefined 的一个语句中多次修改同一个变量。您应该避免这样做,因为结果是不可预测的,并且可能在编译器之间变化很大。

于 2012-06-29T18:26:07.807 回答
-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

于 2012-06-29T18:25:38.503 回答