bitand:C++ 中的关键字与函数

bitand : keyword vs function in C++

我尝试在下面的简单代码中使用替代按位运算符 'bitand'。看来我可以使用 bitand 作为关键字以及 Visual C++ 中的函数,两者都会产生不同的结果,谁能解释这种差异?

int d = 12, e = 37;
std::cout << (d & e) << std::endl; //4
std::cout << (d bitand e) << std::endl; //4
std::cout << *bitand(d, e) << std::endl; //37
int* bit_and = bitand(d, e);
std::cout << *bit_and << std::endl; //37 (should it be 4?)

尽管出现,bitand(d, e) 并未调用名为 bitand 的函数并将参数 de 传递给它。 bitand 只是 another way of spelling &.

因此您的代码实际上与 &(d, e) 相同。 & 不是函数,逗号在这里做什么?就是lesser-knownbuilt-in comma operator。它计算并丢弃第一个参数,然后计算并 returns 第二个参数。所以 (d, e)e 相同,您的代码归结为 &e.

所以尽管代码说 bitand,这里没有按位和发生。它充当一元 address-of operator 并返回指向 e 的指针。这就是为什么你必须用一元 * 取消引用它,以及为什么取消引用后的值是 37 而不是 4.


顺便说一句,如果您使用 clang 或 gcc,如果您启用 -Wunused(包含在 -Wall 中),编译器将发出警告,表明您正在丢弃一个没有效果的值,像这样:

<source>:8:26: warning: left operand of comma operator has no effect [-Wunused-value]
    8 |     std::cout << *bitand(d, e) << std::endl; //37
      |               

这会给你一个 heads-up 这不像是函数调用,而是其他东西。

bitand 是 C++ 中的关键字,等同于具有相同行为的 operator &,根据使用上下文采用单个或两个参数。

*bitand(d, e)

等同于

*&(d, e)

括号中逗号运算符的结果是对最后一个变量的引用

*&e

获取变量的地址并取消引用显然 returns 变量值。