3

可能重复:
C 编程:这是未定义的行为吗?

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

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

4

4 回答 4

1

您不能确定增量是否按您期望的顺序执行,因为参数中的指令是按照编译器选择的顺序执行的。

于 2010-09-06T17:37:16.640 回答
1

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

即,当您从左到右阅读函数调用时,不能保证表达式按该顺序计算。第一个i可能首先被评估,产生 5。 i++ 可能首先被评估,在两者++ii被评估之前递增到 6,依此类推。

于 2010-09-06T17:40:44.293 回答
0

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

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

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

于 2010-09-06T17:40:02.470 回答
-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

这就是如何。

于 2010-09-06T17:36:54.567 回答