2010-09-06 70 views
3

可能重复:
C programming: is this undefined behavior?这个C程序为什么会给出意想不到的输出?

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

我的预期输出为556 但是,当我执行它的结果是767 怎么样?

+0

重复的[C编程:这是未定义的行为?](http://stackoverflow.com/questions/3450582/c-programming-is-this-undefined-behavior)(该问题中的代码只是略有不同Jerry Coffin的回答非常清晰简明) – 2010-09-06 17:36:20

+0

您使用的编译器是什么? – bmargulies 2010-09-06 17:37:10

+0

@James这个问题实际上很不一样:printf()的额外参数是否导致“未定义的行为”。这*不是*重复的任何手段。如果关闭,我会投票重新开放。 – NullUserException 2010-09-06 17:41:33

回答

-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 

这就是这样。

+2

没有解释**为什么**“对'i'的操作可能是不确定的”,这个答案完全没有帮助。 – 2010-09-06 17:38:10

1

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

0

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

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

它按预期工作。我想,当你使用相同的变量时,操作的顺序会变得混乱。

1

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

即,当您从左向右阅读函数调用时,不能保证表达式按照该顺序进行评估。可以首先评估第一个i,得出5.可以首先评估i ++,在评估++ii之前递增到6,依此类推。

相关问题