2013-06-19 79 views
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。

编辑:添加()到代码中,仍然是相同的行为。

+2

'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

+0

@jogojapan @jprofitt它不是一个eveluation ordening问题,因为当我做这样的事情时结果是一样的'char c =((foo [i])|(foo [(++ i)]));' – TheVTM

+2

@TheVTM括号不会改变这种情况。你仍然有两个参数给'|' - 操作符,操作符参数的评估顺序(以及函数参数)不是由标准规定的。 – jogojapan

回答

0

表达式的顺序(格式不正确的公式)未在C++标准中记录。它取决于编译器的行为。例如:

push(pop() * pop()); 

C++没有记录调用pop()的顺序。所以MSVC和GCC的结果是不同的。您应该分步拨打foo[i]foo[++i]