C++ 中“<<”运算符如何与 #define 一起使用

0 c++ macros bitwise-operators

我有两个操作,我假设两个操作都在进行 ShiftLeft 按位操作。

#define TACH_MAX_OWN_ORDERS 1<<6
int myVal = 1<<6
cout<<"Value after operation|"<<myVal <<"|"<<TACH_MAX_OWN_ORDERS<<endl;
Run Code Online (Sandbox Code Playgroud)

价值的输出TACH_MAX_OWN_ORDERS总是让我惊讶。

Value after operation|64|16
Run Code Online (Sandbox Code Playgroud)

有没有人有任何线索,它是怎么来的???谢谢

Sta*_*nny 8

宏按原样替换文本,因此会导致

cout<<"Value after operation|"<<myVal <<"|"<<1<<6<<endl;
Run Code Online (Sandbox Code Playgroud)

<<不在于结果,(int)1<<6([...] << 1) << 6在于最深层次的[...]结果。std::cout这意味着您的宏在使用时将始终得到 16 std::cout,因为 1 和 6 被移入输出流 ( "1"+ "6"),而不是实际的数值64


您应该在语句两边加上括号以避免这种情况:

#define TACH_MAX_OWN_ORDERS (1<<6)
Run Code Online (Sandbox Code Playgroud)

甚至更好,因为您应该避免使用宏,如果可用,请尝试使用编译时常量:

constexpr int TACH_MAX_OWN_ORDERS = 1 << 6;
Run Code Online (Sandbox Code Playgroud)