c - 这2段代码的区别

标签 c

这里有 2 段代码,一段是宏,一段是函数。他们似乎做同样的事情,但运行后似乎表现出不同的行为,我不知道为什么。有人可以帮我吗?谢谢!

#define ROL(a, offset) ((((Lane)a) << ((offset) % LANE_BIT_SIZE)) ^ (((Lane)a) >> (LANE_BIT_SIZE-((offset) % LANE_BIT_SIZE))))

Lane rotateLeft(Lane lane, int rotateCount)
{
    return ((Lane)lane << (rotateCount % LANE_BIT_SIZE)) ^ ((Lane)lane >> (LANE_BIT_SIZE - (rotateCount % LANE_BIT_SIZE))) ;
}

注意:Lane 类型只是一个无符号整数,LANE_BIT_SIZE 是一个数字,以位数表示 Lane 的大小。

最佳答案

将使用宏视为将宏的主体替换到您正在使用它的位置。

举个例子,假设您要定义一个宏:#definequadruple(a) ((a) * (a) * (a) * (a))

...那么你就可以像这样使用该宏:

int main(void) {
    int x = 1;
    printf("%d\n", quadruple(x++));
}

您希望这里发生什么?将宏替换到代码中会产生:

int main(void) {
    int x = 1;
    printf("%d\n", ((x++) * (x++) * (x++) * (x++)));
}

事实证明,这段代码使用了未定义的行为,因为它在同一表达式中多次修改 x 。这样可不行啊!您认为这可以解释您的行为差异吗?

关于c - 这2段代码的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15194419/

相关文章:

c++ - OpenGL 中的可视化问题(glOrtho 和投影)

c - 如何停止读取输入并分析C中的数据

c - 链接列表反向显示

c - 如何在 C 中读取具有不同格式的多行 TXT 文件?

C/为什么列表改变

c - 就性能和共享库文件而言, "compiled for an architecture"与 "compiled on a machine"一样好吗?

c - 为什么 strcat 连接两个字符串失败?

c - 如何将 ceil() 返回的内容存储在变量中(C 编程)

c++ - 如何将 C++ 库静态链接到 OSX 中的 C 应用程序?

c - 使用 DLL 调用 Modelica 外部 C 函数