【问题标题】:Expected output for this code [duplicate]此代码的预期输出[重复]
【发布时间】:2011-03-16 15:19:51
【问题描述】:
int a=5;
printf("%d %d %d\n",a++,a++,++a);

在 Gcc 上的输出: 7 6 8

谁能解释一下答案。 如果这个问题被重复了,我很抱歉,但我找不到它。

谢谢!!

【问题讨论】:

  • 两个字:未定义的行为

标签: c gcc increment


【解决方案1】:

行为未定义,因为增量运算符之间没有sequence points

解释为什么代码做它做的事情是一个毫无意义的练习。你不应该编写具有未定义行为的代码,即使它看起来对你有用。

解决 cmets 中提出的问题:comma operator 确实充当序列点,但是这里的逗号不是逗号运算符。来自维基百科:

将逗号标记用作运算符不同于它在函数调用和定义、变量声明、枚举声明和类似构造中用作分隔符。

【讨论】:

  • 是不是因为我们在一个语句中有多个增量操作?在这种情况下,操作员也不能正确执行。
  • @The Stig:首先,这是因为代码在序列点之间不止一次修改了a。其次,逗号运算符确实有一个序列点,但函数调用中的逗号不是逗号运算符。令人困惑,但确实如此。
  • @David Thornley:是的。我已将此添加到我的答案中。谢谢。
  • 我的主要困惑是“,”作为序列点。因此,在 func(foo(),bar()) 之类的代码中,“,”逗号运算符不是序列点,但在 if(foo(),bar()) 之类的代码中,逗号充当序列点跨度>
  • @The Stig:没错,除了迂腐:在您的第一个示例中,逗号不是“逗号运算符”,它只是一个逗号标记。
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多