【发布时间】:2011-03-16 15:19:51
【问题描述】:
int a=5;
printf("%d %d %d\n",a++,a++,++a);
在 Gcc 上的输出: 7 6 8
谁能解释一下答案。 如果这个问题被重复了,我很抱歉,但我找不到它。
谢谢!!
【问题讨论】:
-
两个字:未定义的行为
int a=5;
printf("%d %d %d\n",a++,a++,++a);
在 Gcc 上的输出: 7 6 8
谁能解释一下答案。 如果这个问题被重复了,我很抱歉,但我找不到它。
谢谢!!
【问题讨论】:
行为未定义,因为增量运算符之间没有sequence points。
解释为什么代码做它做的事情是一个毫无意义的练习。你不应该编写具有未定义行为的代码,即使它看起来对你有用。
解决 cmets 中提出的问题:comma operator 确实充当序列点,但是这里的逗号不是逗号运算符。来自维基百科:
将逗号标记用作运算符不同于它在函数调用和定义、变量声明、枚举声明和类似构造中用作分隔符。
【讨论】:
a。其次,逗号运算符确实有一个序列点,但函数调用中的逗号不是逗号运算符。令人困惑,但确实如此。