为什么这个C程序会产生意外的输出?

时间:2010-09-06 17:33:39

标签: c operator-precedence

  

可能重复:
  C programming: is this undefined behavior?

#include<stdio.h>
main()
{
 int i=5;
 printf("%d%d%d",i,i++,++i);
}

我的预期输出是556。 但是当我执行它时,结果是767。 如何?

4 个答案:

答案 0 :(得分:1)

您无法确定增量是否按预期顺序执行,因为参数内的指令是按编译器选择的顺序执行的。

答案 1 :(得分:1)

您正在访问和更改sequence point内的值(更改它两次,实际上),在序列点内您无法确定操作的顺序。

即。当您从左到右读取函数调用时,无法保证表达式按该顺序计算。可以首先评估第一个i,得到5.可以首先评估i ++,在评估++ii之前递增到6,依此类推。

答案 2 :(得分:0)

有趣的是,问题是你不止一次使用同一个变量。如果您将代码更改为:

int i, j, k;
i=j=k=5;
printf("%i%i%i",i,j++,++k);

它按预期工作。我认为,当你使用相同的变量时,操作的顺序会搞砸。

答案 3 :(得分:-1)

$ gcc -Wall arst.c  
arst.c:2:1: warning: return type defaults to ‘int’

arst.c: In function ‘main’:

arst.c:5:27: warning: operation on ‘i’ may be undefined

arst.c:5:27: warning: operation on ‘i’ may be undefined

arst.c:6:1: warning: control reaches end of non-void function

就是这样。