【发布时间】:2013-06-15 10:37:13
【问题描述】:
在我的代码中发现了一个奇怪的行为。
代码:
char foo[] = {64, 1};
int i = 0;
char c = ((foo[i]) | (foo[(++i)]));
cout << "Text: " << c << " " << (int)c << endl;
结果:
Text: ☺ 1
我看到的是“Text:A 1”而不是“Text:☺ 1”。由于某种原因,编译器忽略了“| foo[++i]”部分。
这个问题的解决方案很简单,只需要另外一行,但我感兴趣的是知道这是编译器错误还是只是 c++ 很奇怪。。 p>
在 VC10 和 VC11 中测试。
编辑:将 () 添加到代码中,仍然是相同的行为。
【问题讨论】:
-
foo[i] | foo[++i]中的评估顺序未指定。有很多关于类似问题的问题,例如Undefined behavior and sequence points。在您的特定情况下,我猜i首先递增(++i),然后您得到c = foo[1] | foo[1],即c = 1 | 1,即c = 1。请注意,依赖未排序的操作不仅会使结果难以预测,而且会导致未定义的行为。 -
@jogojapan @jprofitt 这不是一个评估排序问题,因为当我做这样的事情时结果是一样的
char c = ((foo[i]) | (foo[(++i)])); -
@TheVTM 括号不会改变这种情况。
|-operator 仍然有两个参数,并且标准未指定运算符参数(以及函数参数)的评估顺序。
标签: c++ visual-studio