Cout 宏值未按预期工作 [已关闭]

cout macro value doesn't work as expected [closed]

提问人:dollydollydon 提问时间:7/29/2022 最后编辑:Yksisarvinendollydollydon 更新时间:7/29/2022 访问量:78

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

去年关闭。

#include<iostream>
using namespace std;

#define C 1<<(8*1)



int main(){
  if(C==256){
    int a=C;
    cout<<a;
  }
}

我的期望是 256,但它打印了 18。这是怎么回事?谢谢!

C++ 打印 IOstream COUT

评论

5赞 Giogre 7/29/2022
不对,它的工作原理是 charm 返回 256 onlinegdb.com/0mVb8VhEy
4赞 Paul Sanders 7/29/2022
始终将宏完全括起来,.永远,永远,永远。#define C (1<<(8*1))
8赞 paddy 7/29/2022
您声称它打印“18”意味着您尝试过,而不是您的问题中实际显示的代码。宏将扩展为 。你看到问题了吗?请确保在询问有关行为的问题时,使用导致该行为的代码来支持该问题cout << Ccout << 1 << 8
0赞 Yksisarvinen 7/29/2022
与您的问题无关,但读起来不错:为什么“使用命名空间 std”被认为是不好的做法?

答:

7赞 Yksisarvinen 7/29/2022 #1

我假设你的问题是关于,而不是关于.std::cout << C;std::cout << a;

宏是简单的复制和粘贴文本替换。当预处理器遇到宏名称时,它会将其替换为文本定义,而不进行任何分析。所以,发生的事情是

std::cout << C;

替换为

std::cout << 1<<(8*1);

这确实应该打印.18


这是不使用宏的一个很好的理由。相反,请使用常量(或 constexpr)变量:

constexpr int C = 1 << (8 * 1);

这是类型安全的,在任何上下文中使用时都不会让您感到惊讶。

如果出于某种原因确实必须使用宏,请确保将其包装在额外的参数中:

#define C (1 << (8 * 1)) // but seriously, don't use macros