C语言中的后自增和前自增

3

可能是重复的问题:
有人能解释一下这些未定义行为吗?(i = i++ + ++i , i = i++,等等...)

下面有一段代码,我非常困惑如何理解它的逻辑。

#include <stdio.h>
#include <stdlib.h>

int main(void )
{
int i = 1 ;
printf("\n%d %d %d %d\n",++i,i++,i++,++i) ;
return 0 ;
}

我正在使用名为Mandriva的Linux发行版下的gcc编译器。在上述代码中,我在printf语句中使用了变量的前缀和后缀递增。我应该得到的输出是2 2 3 5,但实际输出与期望不同。请帮助我排查这段代码。
我对这段代码感到很困难。
1个回答

8

这是未定义行为。在i的增量之间没有序列点。

任何结果都是正确的结果(包括格式化硬盘)。


正在格式化的硬盘不是此代码的有效结果。它只是在评估顺序方面未定义。 - Emil Vikström
对于整数来说,如果我们使用 ++i 还是 i++,真的有关系吗?我认为这是一样的。只有在我们后增或前增一个对象时才有区别...然后在第一种情况下它被修改并评估,在第二种情况下它被复制然后修改。我错过了什么吗? - Maroun
K Grigore。我明白了。无论如何还是谢谢你。另外一个问题。这段代码在不同的编译器中会有所不同吗? - Rajan Chennai
@Raj89,你似乎不理解。即使在同一个编译器上,该代码也不能保证每次都会产生相同的结果。 - Luchian Grigore
@LuchianGrigore:我也在考虑同一个程序。你怎么确定它是未定义行为??? - Bhavik Shah
显示剩余6条评论

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