2016-04-27 105 views
1

下面的代码:可以在C++流中使用三元运算符吗?

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

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

编译海合会4.7和C++ 11给出:

error: invalid operands of types 'int' and '' to binary 'operator <<'

我不明白为什么,会是正确的方式做到这一点呢?我希望尽可能缩短空值检查,因为我期望它们非常普遍。

+0

对于大多数人来说,三元运算符具有[令人惊讶的低优先级](http://en.cppreference.com/w/cpp/language/operator_precedence)。我的建议:避免它,只要你不确定它的作用:你的同事会感谢你。 – Wolf

回答

3

第一:是的,你可以使用三元运算为std::ostream,但提防运算符优先级。如果你要做到这一点,你需要做的是这样的:

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

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

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

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

1

您会发现运营商<<绑定的结果与您预期的不同。

用途:

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

(或者你只是做了一个错字,错过了:?:

+0

是的,对不起 - 这是?: –

+0

我觉得有一点误导,就是先关注左移运算符,而问题是关于三元运算符。但最终你是对的:在计算I/O表达式时,'<<' and '>>'的“舒适度”限于每天的数学计算。这就是为什么学习使用括号来实现流I/O,然后盯着三元运算符的极低优先级更高效的原因...... – Wolf