2013-08-09 14 views
10

Ich habe das in meinem Code gefunden, war ein Tippfehler meinerseits, aber es kompiliert noch. Wer weiß warum? Ich habe keine Ahnung.String Verkettung, warum kompiliert dies?

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string x; 
    std::string b = "Bryan"; 
    x += '|' + b, x; 
    std::cout << x << std::endl; 
} 
+0

Ehrfürchtig Hilfe Jungs, vielen Dank für diese –

+4

Side Hinweis für mich Aufräumen: Wenn Sie kompilieren mit Warnungen 'g ++ -Wall' erzeugt 'warning: rechter Operand des Komma-Operators hat keine Wirkung [-Wunused-value]' – FDinoff

+1

Sie sollten eine Compiler-Warnung erhalten, wenn Sie Warnungen aktiviert haben. Der Compiler kann erkennen, dass ', x 'nichts tut, was bedeutet, dass es wahrscheinlich ein Fehler ist. –

Antwort

21
x += '|' + b, x; 

Hier , ist im Grunde ein Bediener, dessen linke Operand zuerst ausgewertet wird, mit der rechten Operanden gefolgt. So einfach ist das.

Da der Vorrang von += und + höher als , Betreiber wird es zu dieser äquivalent:

(x += '|' + b) , x; 

hier:

left operand => (x += '|' + b) 
right operand => x 

ein weiteres Beispiel Versuchen:

int f() { ... } 
int g() { ... } 

f(), g(); 

Hier f() wil Ich werde zuerst genannt, gefolgt von g().

Hoffe, dass hilft.

+0

Warum wird '+ =' anders als '=' hier behandelt? – mohit

+0

@mohit: Ich weiß nicht, was du mit "anders" meinst. Aber ich denke du willst das wissen: '+ =' und '=' haben die gleiche Priorität. Es ist nur das ',' hat niedrigere Priorität als beide! – Nawaz

+0

Verstanden. Ich hatte den falschen Eindruck, dass "a = 4, 5;" "a" auf "5" setzen würde. Vielen Dank. – mohit

2
x += '|' + b, x; 

Dies ist ein Komma-Operator, der die niedrigste Priorität hat. Es benötigt zwei Operanden, wertet sie von links nach rechts aus. Beide Operanden sind in diesem Beispiel vollkommen zulässig:

Beachten Sie, dass der Kommaoperator einen Wert des richtigen Operanden hat, aber es ist normalerweise sinnlos, wie in diesem Beispiel. So ist es das gleiche mit:

x += '|' + b; 
x; // no effect 
2
x += '|' + b, x; 

Es ist, weil der Ausdruck vor dem , Operator wirksam wird. Zum Beispiel -

std::string y("Hello"); 
x += '|' + b, y; 

Das oben würde immer noch das Ergebnis |Bryan in Ihrem Programm geben.

3
x += '|' + b, x; 

Dies kompiliert, da das Komma wird hier als Operator wirkt (statt einem Separator), wo der rechte Operand keine Wirkung.

Von Wikipedia:

Im C und C++ Programmiersprachen, die Komma-Operator (durch das Token dargestellten) ist ein binärer Operator, der seinen ersten Operanden auswertet und verwirft das Ergebnis, und wertet dann die zweite Operand und gibt diesen Wert (und Typ) zurück.

...

der Komma-Operator hat die niedrigste Priorität irgend C Operator ...

In x += '|' + b, x;, Betreiber += hat eine höhere Priorität als , und Betreiber + hat eine höhere Priorität als +=, was bedeutet, dass es zu (x += ('|' + b)), x gleichwertig ist;

Außerdem, wenn Sie Ihren Code mit Warnungen auf kompilieren, werden Sie wahrscheinlich eine Warnung ähnlich wie diese erhalten:

warning: right-hand operand of comma has no effect