为什么这个C程序会产生意外的输出?

3

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

这段文本是关于C编程中是否存在未定义行为的问题。如果您想了解更多相关信息,可以点击链接查看原问题。
#include<stdio.h>
main()
{
 int i=5;
 printf("%d%d%d",i,i++,++i);
}

我的期望输出是556。但是当我执行时,结果却是767。怎么回事?


重复的问题:C编程:这是否是未定义行为?(该问题中的代码只是略有不同,Jerry Coffin的答案非常清晰简明) - James McNellis
@James,那个问题实际上非常不同:printf()的额外参数是否会导致“未定义行为”。这绝对不是重复的问题。如果这个问题被关闭,我会投票重新打开它。 - NullUserException
1
我在 Stack Overflow 上已经看到过这种问题不止一次了。 - Nyan
1
@NullUserException:问题是代码是否会导致未定义的行为,而这段代码与此问题中的代码非常相似。正如得票最高的答案所解释的那样,它确实会违反关于序列点之间变量访问和修改规则,因此会导致未定义的行为。我相信还有其他问题也在询问同样的事情;那只是我找到的第一个问题,并且它有一个很好的答案。 - James McNellis
这个问题被正确地关闭了。似乎每周都会出现同样愚蠢的问题... - R.. GitHub STOP HELPING ICE
4个回答

1

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


1

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

例如,当您从左到右读取函数调用时,并不能保证表达式按照那个顺序被计算。第一个i可能首先被计算,得出5。i++可能首先被计算,在++ii都被计算之前增加到6,等等。


0
有趣的是,问题在于你使用了同一个变量超过一次。如果你将代码更改为这样:
int i, j, k;
i=j=k=5;
printf("%i%i%i",i,j++,++k);

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


-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的操作可能是未定义的”。 - James McNellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接