2016-04-27 15 views
1

Der folgende Code:Ist es ok, ternären Operator in C++ - Streams zu verwenden?

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

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

auf gcc 4.7 mit c kompiliert ++ 11 gibt:

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

Ich verstehe nicht, warum, was auf richtige Art und Weise sein würde, es zu tun? Ich möchte die Nullkontrollen so kurz wie möglich halten, da ich davon ausgehe, dass sie sehr häufig sind.

+0

Der ternäre Operator hat für die meisten Leute eine überraschend niedrige Priorität (http://en.cppreference.com/w/cpp/language/operator_precedence). Mein Vorschlag: Vermeiden Sie es, wenn Sie nicht absolut sicher sind, was es tut: Ihre Kollegen werden es Ihnen danken. – Wolf

Antwort

3

Erstens: ja, können Sie den ternären Operator für eine std::ostream verwenden können, aber hüten Operator Vorrang. Wenn Sie dies tun werden, müssen Sie so etwas wie dies tun:

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

Mit anderen Worten, die ternären Ausdruck in Klammern einzukapseln.

Zweitens müssen der zweite und dritte Operand in den gleichen Typ konvertierbar sein. Mit anderen Worten: Ihr Beispiel funktioniert nicht, weil Sie versuchen, ein Zeichenfolgenliteral ("") einzufügen, wenn a null ist, oder die tatsächliche Zahl (a->number, die vom Typ int ist), wenn a nicht null ist.

Drittens müssen Sie die Syntax korrigieren. Aber @quamrana hat das schon angesprochen.

1

Sie stellen fest, dass der Operator << anders bindet, als Sie erwarten.

Verwendung:

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

(oder haben Sie nur einen Tippfehler gemacht und verpasste die : von ?:)

+0

ja, tut mir leid - es ist?: –

+0

Ich finde es ein bisschen irreführend, * zuerst * auf den linken Shift-Operator zu konzentrieren, während die Frage über den ternären Operator ist. Aber schließlich haben Sie Recht: Der "Komfort" von "<<' and '>>" ist auf die tägliche Mathematik beschränkt, wenn Ausdrücke für I/O im laufenden Betrieb berechnet werden. Aus diesem Grund ist es effizienter, die Verwendung von Klammern für die Stream-I/O zu erlernen und dann nur die extrem niedrige Priorität des ternären Operators zu betrachten ... – Wolf