2009-07-19 9 views
0

Ich verstehe nicht, den folgenden Auszug aus Accelerated C++:Erklären Sie die folgenden von Accelerated C++ bitte

ab

Da || ist linksassoziativ und wegen der relativen Priorität von ||, == und -,

r == 0 || r == Zeilen - 1 || c == 0 || c == cols - 1 bedeutet das gleiche, wie es wäre, wenn wir alle seine Unterausdrücke in Klammern setzen waren:

((r == 0 || r == (Zeilen - 1)) || c == 0) || c == (cols - 1)

und gehen bis

Otherwise, it does something else, which we must now define. 

Ich verstehe das nicht. Wie würdest du mir das gleiche mit deinen eigenen Worten sagen?

+1

Für andere ist es Abschnitt 2.4.1.2, Seite 25 in meiner Kopie. –

Antwort

5

Wenn Sie eine Reihe von Bedingungen haben, die Sie auswerten möchten, sagen wir "wenn x 1 oder y 2 ist, dann rufen Sie die Funktion foo()" auf, dann ist der zweite Test nicht sinnvoll (y ist 2) wenn Sie bereits wissen, dass x 1 ist. Die || Betreiber arbeitet wie folgt aus:

i(x == 1 || y == 2) { 
    foo(); 
} 

Der Ausdruck y == 2 wird nicht, wenn x == 1 bewertet werden, weil es nicht notwendig ist. Dies wird kurzgeschlossene Auswertung genannt und kann viel Zeit sparen, wenn die Auswertung teuer ist.

Wenn dies nicht das ist, wonach Sie fragen, stellen Sie bitte Ihre Frage deutlicher.

+1

Ich denke, Sie sollten auch darauf hinweisen, dass dies bedeutet, dass keine Berechnung im zweiten Ausdruck ausgeführt wird, wenn der erste Ausdruck als wahr ausgewertet wird, da dies zu verwirrenden Fehlern führen kann. Oder irre ich mich? – pmr

+0

Ich dachte das war was ich sagte | –

+0

Ich dachte über etwas wie x == 1 || nach ++ y == 2. Wenn x gleich 1 ist, wird y nicht inkrementiert. – pmr