2010-12-13 13 views
2

Warum ist das ok:Erklärung als Bedingung - Hinzufügen von Klammern führt zu Fehlern

if(int i = 1) { 
} 

... während die folgenden Fehler erzeugt?

if((int i = 1)) { 
} 

Unter g ++ (4.4.5) letztere gibt: Seeing what class an object is

zu finden Ich versuche:

test.cpp:7: error: expected primary-expression before ‘int’
test.cpp:7: error: expected ‘)’ before ‘int’
test.cpp:9: error: expected ‘)’ before ‘else’
test.cpp:13: error: expected primary-expression before ‘}’ token
test.cpp:13: error: expected ‘;’ before ‘}’ token

übrigens der Grund, wegen dieser Antwort, die ich bin gefragt ist eine Möglichkeit, die Bedingung lesbarer zu machen. Normalerweise würde ich es vorziehen, zum Beispiel:

if((x = y) != 0) { 

zu

if(x = y) { 

... da es besser lesbar ist und Schweigen Compiler ‚Kommentare‘ was darauf hindeutet, ich hätte den falschen Operator verwendet. Wenn ich eine Deklaration als eine Bedingung verwende, erzeugt es nicht die Warnung, aber die Lesbarkeit scheint noch zu leiden.

+2

Warum würden Sie entweder von diesen zu tun? –

+0

@Robin Welch - Der Anwendungsfall und die Inspiration sind hier: http://stackoverflow.com/questions/4426476/seeing-what-class-an-object-is/4426485#4426485 – sje397

Antwort

4

Es ist wegen des C++ Standards, 6.4 p1.

Selection statements choose one of several flows of control.

Auswahl-Anweisung:

if (condition) statement 
if (condition) statement else statement 
switch (condition) statement 

Zustand:

expression 
type-specifier-seq declarator = assignment-expression 
+0

Ich habe den Anfang des Zitats aus dem Standard hinzugefügt. Das zusätzliche Bit, das fehlt, ist, dass es in der Definition von "Bedingung" zusätzliche Klammern erlaubt, aber keine Definition von Variablen. –

3

Dies ist keine Zuweisung. Es ist eine Erklärung. Sie können

if(int i = value) ...; 
for(...; int i = value; ...) ...; 
switch(int i = value) ...; 
while(int i = value) ...; 

Dies ist eine selten verwendete Form Erklärungen an anderer Stelle als Bedingungen, wie in den folgenden setzen, aber es ist kein Ausdruck dort angegeben. Was haben Sie dort getan wird eine Variable i deklarieren, die Sie in den Körper

// fire if get() returns non-null 
if(weapon *w = get()) { 
    w->fire(); 
} 

Und Klammern sind nicht erlaubt um eine solche Erklärung verwenden können. Ich denke, das würde keinen Sinn ergeben.

+0

Und ich sollte hinzufügen, nicht tun dieser EVER. Nur weil es syntaktisch korrekt ist, bedeutet das nicht, dass Ihre Kollegen von Ihnen deswegen mögen werden. – Neil

+0

@Neil - Siehe den Link in meinem Kommentar unter der Frage aus einem möglichen Grund. – sje397

+0

Zweifellos gibt es einen Grund dafür, wie Ihr Link zeigt. Obwohl es klarere Wege gibt, dasselbe zu tun, warum also Einfachheit opfern? – Neil

Verwandte Themen