0
在我的代码中发现了一个奇怪的行为。Visual Studio预增值错误
代码:
char foo[] = {64, 1};
int i = 0;
char c = ((foo[i]) | (foo[(++i)]));
cout << "Text: " << c << " " << (int)c << endl;
结果:
Text: ☺ 1
我specting “文字:A 1”,而不是 “文字:☺1”。出于某种原因,编译器忽略了“| foo [++ i]”部分。
那么这个解决方案很简单,它只需要另一行,但我感兴趣的是是知道这是一个编译器错误还是只是C++怪异。
测试VC10和VC11。
编辑:添加()到代码中,仍然是相同的行为。
'foo [i] |中的评估顺序foo [++ i]'没有被指定。关于类似问题有很多问题,例如[未定义的行为和顺序点](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)。在你的特定情况下,我猜'i'是第一次递增的('++ i'),然后你得到'c = foo [1] | foo [1]',这是'c = 1 | 1',即'c = 1'。请注意,依赖于无序操作不仅会使结果难以预测,而且会导致未定义的行为。 – jogojapan
@jogojapan @jprofitt它不是一个eveluation ordening问题,因为当我做这样的事情时结果是一样的'char c =((foo [i])|(foo [(++ i)]));' – TheVTM
@TheVTM括号不会改变这种情况。你仍然有两个参数给'|' - 操作符,操作符参数的评估顺序(以及函数参数)不是由标准规定的。 – jogojapan