2013-08-09 13 views
10

Znalazłem to w moim kodzie, było literówka z mojej strony, ale wciąż kompilowane. Ktoś wie dlaczego? Nie mam pojęcia.Ciąg konkatenacji, dlaczego to się kompiluje?

#include <string> 
#include <iostream> 

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

Firma Awesome pomoc chłopaki, dziękuję za wyjaśnienie tego za mnie –

+4

marginesie: Jeśli skompilować z ostrzeżeniami 'g ++ -Wall' tworzy' ostrzeżenie: prawy operand operatora przecinka nie ma żadnego efektu [-Wunused-value] ' – FDinoff

+1

Powinieneś otrzymać ostrzeżenie kompilatora, jeśli masz włączone ostrzeżenia. Kompilator może zauważyć, że ', x' nic nie robi, co oznacza, że ​​prawdopodobnie jest to błąd. –

Odpowiedz

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

Tutaj , jest w zasadzie operator, którego lewy argument jest analizowany najpierw, a następnie prawym argumencie. To takie proste.

Ponieważ Pierwszeństwo += i + jest większa niż , operatora staje się odpowiednikiem następująco:

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

tutaj:

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

Spróbuj Innym przykładem

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

f(), g(); 

Tutaj f() wil Nazywam się najpierw, a następnie g().

Nadzieję, że pomaga.

+0

Dlaczego '+ =' jest traktowane inaczej niż '=' tutaj? – mohit

+0

@mohit: Nie wiem, co masz na myśli przez "inaczej". Wciąż myślę, że chcesz to wiedzieć: '+ =' i '=' mają takie samo pierwszeństwo. Po prostu ',' ma niższy priorytet niż oba! – Nawaz

+0

Mam to. Miałem złe wrażenie, że 'a = 4, 5;' ustawiłoby 'a' na' 5'. Dzięki. – mohit

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

Jest to operator o przecinku, który ma najniższy priorytet. Wymaga dwóch argumentów, ocenia je od lewej do prawej. Oba operandy są całkowicie legalne w tym przykładzie:

Należy zauważyć, że operator przecinka ma wartość prawego argumentu, ale zwykle jest bezużyteczny, jak w tym przykładzie. Więc to samo z:

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

dlatego, że wyrażenie przed operatorem , trwa ona do skutku. Na przykład -

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

Powyższy nadal daje wynik |Bryan w programie.

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

ten sporządza ponieważ przecinek tu działając jako operatora (zamiast rozdzielacza), w którym operand prawy nie ma znaczenia.

Od Wikipedia:

w C i C++ języków programowania, operatora przecinek (reprezentowany przez token) jest operatorem, który ocenia swój pierwszy argument i odrzuca wynik, a następnie ocenia sekundę operand i zwraca tę wartość (i typ).

...

Operator przecinek najniższy priorytet każdego operatora C ...

W x += '|' + b, x; operator += ma wyższy priorytet niż , i operator + ma wyższy priorytet niż +=, co oznacza, że ​​jest to równoważne z (x += ('|' + b)), x;

Dodatkowo, jeśli skompilować kod z ostrzeżeniami na, będzie prawdopodobnie otrzyma ostrzeżenie podobne do tego:

warning: right-hand operand of comma has no effect 
Powiązane problemy