可能重复:
C 编程:这是未定义的行为吗?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
我的预期输出是 556。但是当我执行它时,结果是 767。怎么样?
可能重复:
C 编程:这是未定义的行为吗?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
我的预期输出是 556。但是当我执行它时,结果是 767。怎么样?
您不能确定增量是否按您期望的顺序执行,因为参数中的指令是按照编译器选择的顺序执行的。
您正在访问和更改序列点内的值(实际上更改了两次),在序列点内您无法确定操作的顺序。
即,当您从左到右阅读函数调用时,不能保证表达式按该顺序计算。第一个i
可能首先被评估,产生 5。 i++ 可能首先被评估,在两者++i
和i
被评估之前递增到 6,依此类推。
有趣的是,问题是您不止一次使用同一个变量。如果您将代码更改为:
int i, j, k;
i=j=k=5;
printf("%i%i%i",i,j++,++k);
它按预期工作。我认为,当您使用相同的变量时,操作顺序会变得混乱。
$ 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
这就是如何。