【问题标题】:Is it ok to use ternary operator in C++ streams?在 C++ 流中使用三元运算符可以吗?
【发布时间】:2016-08-22 01:00:38
【问题描述】:

以下代码:

#include <iostream>
using namespace std;
struct A{int number=10;};

int main()
{
   A* a = new A();
   cout<<"A val: "<< a==nullptr?"":a->number<<endl;
}

使用 c++11 在 gcc 4.7 上编译给出:

错误:'int'和''类型的无效操作数到二进制'操作符

我不明白为什么,什么是正确的方法呢?我希望空检查尽可能短,因为我希望它们很常见。

【问题讨论】:

  • 对于大多数人来说,三元运算符有a surprising low precedence。我的建议:当你不确定它的作用时,避免使用它:你的同事会感谢你。

标签: c++11 ternary-operator cout


【解决方案1】:

首先:是的,您可以对std::ostream 使用三元运算符,但注意运算符优先级。如果你打算这样做,你需要做这样的事情:

cout << "My name is: " << (my != nullptr ? my->name() : "don't know") << '\n';

换句话说,将三元表达式封装在括号中。

其次,第二个和第三个操作数必须可以转换为相同的类型。换句话说,您的示例将不起作用,因为如果a 为空,则您尝试插入字符串文字(""),或者如果@ 为实际数字(a-&gt;number,其类型为int) 987654327@ 不为空。

第三,你需要修正语法。但是@quamrana 已经解决了这个问题。

【讨论】:

    【解决方案2】:

    您发现运算符 &lt;&lt; 的绑定方式与您预期的不同。

    用途:

    cout << "A val: " << (a==nullptr ? "" : a->number) << endl;
    

    (或者您刚刚打错字,错过了来自?::

    【讨论】:

    • 我发现将 first 重点放在左移运算符上有点误导,而问题是关于三元运算符。但最终你是对的:&lt;&lt; 和 '>>' 的“舒适性”仅限于动态计算 I/O 表达式时的日常数学。这就是为什么在流 I/O 中使用括号来学习比只盯着三元运算符的极低优先级更有效的原因......
    猜你喜欢
    • 2011-01-13
    • 2022-01-07
    • 1970-01-01
    • 2016-05-15
    • 2023-02-16
    • 2015-04-27
    • 2019-01-06
    • 2019-10-08
    • 2020-05-09
    相关资源
    最近更新 更多