可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
我无法理解这个程序的输出(使用gcc)。
main()
{
int a=10;
printf("%d %d %d\n",++a, a++,a);
}输出:
12 10 12另外,请解释printf()参数评估的顺序。
发布于 2009-08-13 10:05:12
编译器将按当时感觉的任何顺序计算printf的参数。这可能是优化的事情,但不能保证:计算它们的顺序不是由标准指定的,也没有定义的实现。没有办法知道。
但标准规定的是,在一个操作中修改同一变量两次是未定义的行为;ISO C++03,5 ISO/4:
在前一个序列点和下一个序列点之间的
标量对象应该通过表达式的计算来修改其存储值最多一次。此外,只能访问先前的值来确定要存储的值。对于一个完整表达式的子表达式的每一个允许的顺序,都应满足本款的要求;否则,该行为是不明确的。
printf("%d %d %d\n",++a, a++,a);可以做许多事情;按您的预期工作,或者以您永远无法理解的方式工作。
你不应该写这样的代码。
发布于 2009-08-13 06:38:34
对于函数调用的参数,AFAIK没有定义的计算顺序,每个编译器的结果可能不同。在这种情况下,我可以猜到中间参数是首先计算的,然后是第一个和第三个。
发布于 2009-08-13 06:50:53
正如haggai_e所暗示的,参数按以下顺序计算:中、左、右。要充分理解这些特定数字出现的原因,您必须了解增量是如何工作的。
a++的意思是“使用a做一些事情,然后在之后增加它”。++a的意思是“先增加一个值,然后用新值做一些事情”。
在您的特定示例中,printf首先计算a++,读取10并打印它,然后将其递增到11。printf然后计算++a,先递增它,然后读取12并打印出来。最后一个变量printf计算值被读取为(12),并被打印而不作任何更改。
虽然它们是按随机顺序计算的,但它们是按照您提到的顺序显示的。这就是为什么你得到121212而不是101212。
https://stackoverflow.com/questions/1270370
复制相似问题