c++ - C/C++ 中的按位与和运算顺序

标签 c++

我目前正在剖析 ol' Doom 引擎源代码,并遇到了一条有趣的线:

counter = (++counter)&(MAX_VALUE-1);

看起来是一种在不超过某个数字的情况下增加计数器的方法,但是我在脑海中进行按位运算时遇到了棘手的时间,所以我快速启动了一个控制台项目来尝试这个,你瞧,它有效漂亮地。我推断上述方法比 if() 语句更有效,特别是如果代码快速执行时,例如,在循环中,实时游戏中的性能至关重要。我想弄清楚的是编译器用来执行这一行的操作顺序。如果增量“++”运算符放在“计数器”之后,它将始终保持为零。它仅在增量用作前缀(“++counter”)时才有效,但即便如此,如果我用笔和纸写出来,我会得到按位 AND 运算的任意结果,而不是递增的计数器。似乎计算了按位运算,然后执行了递增,但我很难弄清楚为什么,有什么想法吗?

最佳答案

虽然括号中有更高的precedence比运算符++ 或按位AND(运算符&),没有定义sequence points在你的右手边。所以你的代码表现出未定义的行为。

如果你删除运算符++,这意味着

(counter + 1)&(MAX_VALUE-1);

如果您将 MAX_VALUE 视为 32,则二进制形式的 MAX_VALUE-1

11111

因此,如果您的值大于该值并使用 &,第 5 位(从右边开始)左边的任何位都将被清除

0000011111   // assume this is MAX_VALUE - 1 
1100110110   // assume this is counter + 1
__________
0000010110

如果任何小于或等于 MAX_VALUE - 1 的位为 1,则结果将为 true

关于c++ - C/C++ 中的按位与和运算顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080714/

相关文章:

c++ - Win32 LB_GETTEXT 返回垃圾

c++ - 在目录中的文件子集上构建 visual studio 项目

c++ - 强制使用预定义宏的 gcc 标志

c++ - 后缀表达式求值

c++ - 服务器程序处于无限循环中。如何检查?

c++ - 在arm-linux-gnueabihf-g++交叉编译期间出错。无法识别共享库文件

c++ - 为什么时间测量有时会返回重复值(15.625 毫秒的倍数)?

Visual Studio 2012 中的 c++ std::thread 问题

C++ 编译器无法在 Steinberg VST SDK 文件中找到没有绝对路径的文件

c++ - 使用多种颜色为 macOS 中的标题栏着色