首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输出(“%d %d %d\n",++a,a++,a)

输出(“%d %d %d\n",++a,a++,a)
EN

Stack Overflow用户
提问于 2009-08-13 06:35:21
回答 3查看 53.5K关注 0票数 4

可能重复:

Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

我无法理解这个程序的输出(使用gcc)。

代码语言:javascript
复制
main()
{
  int a=10;
  printf("%d %d %d\n",++a, a++,a);
}

输出:

代码语言:javascript
复制
12 10 12

另外,请解释printf()参数评估的顺序。

EN

回答 3

Stack Overflow用户

发布于 2009-08-13 10:05:12

编译器将按当时感觉的任何顺序计算printf的参数。这可能是优化的事情,但不能保证:计算它们的顺序不是由标准指定的,也没有定义的实现。没有办法知道。

但标准规定的是,在一个操作中修改同一变量两次是未定义的行为;ISO C++03,5 ISO/4:

在前一个序列点和下一个序列点之间的

标量对象应该通过表达式的计算来修改其存储值最多一次。此外,只能访问先前的值来确定要存储的值。对于一个完整表达式的子表达式的每一个允许的顺序,都应满足本款的要求;否则,该行为是不明确的。

printf("%d %d %d\n",++a, a++,a);可以做许多事情;按您的预期工作,或者以您永远无法理解的方式工作。

你不应该写这样的代码。

票数 10
EN

Stack Overflow用户

发布于 2009-08-13 06:38:34

对于函数调用的参数,AFAIK没有定义的计算顺序,每个编译器的结果可能不同。在这种情况下,我可以猜到中间参数是首先计算的,然后是第一个和第三个。

票数 6
EN

Stack Overflow用户

发布于 2009-08-13 06:50:53

正如haggai_e所暗示的,参数按以下顺序计算:中、左、右。要充分理解这些特定数字出现的原因,您必须了解增量是如何工作的。

a++的意思是“使用a做一些事情,然后在之后增加它”。++a的意思是“先增加一个值,然后用新值做一些事情”。

在您的特定示例中,printf首先计算a++,读取10并打印它,然后将其递增到11。printf然后计算++a,先递增它,然后读取12并打印出来。最后一个变量printf计算值被读取为(12),并被打印而不作任何更改。

虽然它们是按随机顺序计算的,但它们是按照您提到的顺序显示的。这就是为什么你得到121212而不是101212。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1270370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档