C组合前增量和后增量

时间:2014-04-18 23:25:10

标签: c post-increment pre-increment

这是一个丑陋的代码,仅用于在采访中恐吓求职者...... 但我无法理解它背后的逻辑。 有人可以解释为什么用" b"不等于" a"?

#include <stdio.h>
void main(){
    int a = 1, b = 1, c = 1;
    printf("%d %d %d", ++a + a++ + 1, 1 + ++b + b++, ++c + c++); // displays 6 5 5
}

非常感谢。

3 个答案:

答案 0 :(得分:1)

逻辑很简单:

创建未定义的行为,让鼻子恶魔恐吓求职者。这就是所谓的工作保障。

如果写入变量,除了计算应写入的值外,不得在没有插入序列点的情况下再次访问变量。

第二个UB案例或至少实施定义行为

void main()

应该是

之一
int main(void)
int main(int argc, char* argv[])

答案 1 :(得分:0)

只是为了证明这是一个糟糕的想法,这是VS2012中的输出(我认为是技术上的C ++编译器):

5 5 4

GCC&amp; G ++:

6 5 5

显然,你的采访者在海湾合作委员会中试过了。

答案 2 :(得分:0)

阅读Undefined behavior and sequence points

这是一个略有不同但又相似的例子(感谢Zan):

2)此外,只能访问先前值以确定要存储的值。

C ++示例:

std::printf("%d %d", i,++i); // invokes Undefined Behaviour because of Rule no 2