gpt4 book ai didi

c++ - 用于输出的流运算符 << 被编译器解释为二元运算符 << 用于按位左移?

转载 作者:行者123 更新时间:2023-11-30 03:24:57 25 4
gpt4 key购买 nike

尝试通过 Bjarne Stroustrup 书中的简单练习来完成我自然会发疯...

#include <iostream>
using namespace std;

#define smaller(a,b) ((a)<(b)) ? (a) : (b)
#define larger(a,b) ((a)<(b)) ? (a) : (b)

int main()
{
int a, b;
while (cin >> a >> b) {
cout << "The smaller value is: " << smaller(a,b)
<< "\nThe larger value is: " << larger(a,b);
}
}

当然,出了点问题,你猜怎么着?这里:

$ g++ -std=c++0x -o un4 un4.cpp
un4.cpp: In function ‘int main()’:
un4.cpp:13:17: error: invalid operands of types ‘int’ and ‘const char [23]’ to binary ‘operator<<’
<< "\nThe larger value is: " << larger(a,b);
^

欣赏,如果有人解释一下,有什么神奇的地方

最佳答案

宏不是函数,它们只是参数化的文本替换。因此,您需要防止使用不同优先级的运算符解析表达式。一个非常常见的模式是始终将完整的宏括起来,如:

#define smaller(a,b)    ( ((a)<(b)) ? (a) : (b) )
#define larger(a,b) ( ((a)<(b)) ? (a) : (b) )

-----编辑-----

当你写 something << smaller(x,y) << anotherthing编译器只是替换文本 smaller(x,y)具有精确的文本扩展(+宏参数替换),因此在您的情况下会导致:

something << ((x)<(y)) ? (x) : (y) << anotherthing

这不是你想要的,因为<<优先级高于三元 ?: ,这意味着(加上括号):

( something << ((x)<(y)) ) ? (x) : ( (y) << anotherthing )

在这个表达式中,问题是子表达式 (y) << anotherthing在您的情况下类似于 3 << "foo"这不是正确的表达方式。

更正宏后,示例表达式扩展为:

something << ( ((x)<(y)) ? (x) : (y) ) << anotherthing

并评估为:

( something << ( ((x)<(y)) ? (x) : (y) ) ) << anotherthing

这就是你想要的。

宏真的很奇怪,建议您不要使用它们。

关于c++ - 用于输出的流运算符 << 被编译器解释为二元运算符 << 用于按位左移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com