这段文本是关于C编程中是否存在未定义行为的问题。如果您想了解更多相关信息,可以点击链接查看原问题。可能是重复问题:
C编程:这是未定义的行为吗?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
我的期望输出是556。但是当我执行时,结果却是767。怎么回事?
这段文本是关于C编程中是否存在未定义行为的问题。如果您想了解更多相关信息,可以点击链接查看原问题。可能是重复问题:
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
就是这样。
i
的操作可能是未定义的”。 - James McNellis
printf()
的额外参数是否会导致“未定义行为”。这绝对不是重复的问题。如果这个问题被关闭,我会投票重新打开它。 - NullUserException