运算符优先级在一个编译器中不同,为什么?

时间:2014-12-06 22:34:41

标签: c++ operator-keyword

我将我的游戏移植到Android上,该游戏拥有大约20万行代码并遇到一个非常奇怪的错误,经过5个小时的挖掘后我将其破解为这一行:

// background info
short m = ((dwMask << 4) | dwMask) << ASTAR_OFFSET_VIS;
short zm = (~ASTAR_MASK_DISCOVERED) | (~dwMask);
short *b = (short*)tilecache.GetDataPtr() + index;

// unexpected behavior
*b++ = (*b&zm) | m;

// works
*b = ((*b)&zm) | m; b++;

我的猜测是这个编译器(GCC ARM)对待++运算符的方式不同于我构建此游戏的所有其他编译器,这看起来有点疯狂,但并不令人难以置信。此前该游戏专为Windows,Mac,iOS和Windows CE而构建,并且所有处理过的顶级版本都很好。

我认为它正在评估(* b&amp; zm)| m然后递增指针b ++然后进行赋值,因为每次评估时数据都会在我的数组中向左移动。

我在我的代码中找到了许多使用这种语法并更改它们的地方,但我想确保问题是我认为的问题,如果这是一个编译器选项我可以切换使其与我使用的其他编译器相同?如果我在其他地方的代码中有这样的其他语法。

1 个答案:

答案 0 :(得分:3)

未指定评估函数或运算符(包括内置运算符)的参数的顺序。一些编译器将从左到右评估表达式,其他编译器从右侧评估它们。对于某些运算符,例如,逗号,三元和逻辑运算符,参数的计算顺序以及何时发生的副作用:首先计算第一个操作数。

这与运算符优先级无关,运算符优先级决定运算符的计算顺序。除了在完整表达式结束时或在评估其中一个特殊运算符的第一个参数之后发生副作用时,它也未指定。