可能重复:
C programming: is this undefined behavior?这个C程序为什么会给出意想不到的输出?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
我的预期输出为556 但是,当我执行它的结果是767 怎么样?
可能重复:
C programming: is this undefined behavior?这个C程序为什么会给出意想不到的输出?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
我的预期输出为556 但是,当我执行它的结果是767 怎么样?
$ 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
这就是这样。
没有解释**为什么**“对'i'的操作可能是不确定的”,这个答案完全没有帮助。 – 2010-09-06 17:38:10
您无法确定增量是否按您期望的顺序执行,因为参数内部的指令是按编译器选择的顺序执行的。
有趣的是,问题在于你多次使用同一个变量。如果您将代码更改为:
int i, j, k;
i=j=k=5;
printf("%i%i%i",i,j++,++k);
它按预期工作。我想,当你使用相同的变量时,操作的顺序会变得混乱。
您正在访问和更改sequence point内的值(实际上更改它两次)。在顺序点内,您无法确定操作的顺序。
即,当您从左向右阅读函数调用时,不能保证表达式按照该顺序进行评估。可以首先评估第一个i
,得出5.可以首先评估i ++,在评估++i
和i
之前递增到6,依此类推。
重复的[C编程:这是未定义的行为?](http://stackoverflow.com/questions/3450582/c-programming-is-this-undefined-behavior)(该问题中的代码只是略有不同Jerry Coffin的回答非常清晰简明) – 2010-09-06 17:36:20
您使用的编译器是什么? – bmargulies 2010-09-06 17:37:10
@James这个问题实际上很不一样:printf()的额外参数是否导致“未定义的行为”。这*不是*重复的任何手段。如果关闭,我会投票重新开放。 – NullUserException 2010-09-06 17:41:33