2016-04-27 104 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