需要解释输出

时间:2012-06-29 18:21:40

标签: c gcc undefined-behavior

  

可能重复:
  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?

3 个答案:

答案 0 :(得分: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;

答案 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