std::cout<<"odd"
ist ein Ausdruck, der std::cout
zurückkehren wird (was warum können Sie tun std::cout << a << b << c
). Wenn im booleschen Kontext ausgewertet, gibt es einfach true zurück, wenn das Fehlerbit nicht gesetzt ist. Wenn also die Ausgabeoperation erfolgreich ist, wird sie als wahr ausgewertet.
Allerdings ist die Absicht dieses Code nicht, diesen Wert zu testen, sondern es ist ein kluger (und nicht sehr gut lesbar) Weg, dies auszudrücken:
if (remainder & 1) {
std::cout << "odd";
} else {
std::cout << "even";
}
Es nutzt die Kurzschlüsse Art der &&
und ||
Operatoren:
- In
a && b
, wenn a
falsch ist dann wertet es als a
(b
wird nicht ausgewertet!) ansonsten wird es als b
ausgewertet.
- In
a || b
, wenn a
wahr ist, dann wertet es als a
(b
nicht ausgewertet!) anders als b
auswertet.
Also, wenn remainder & 1
als falsch ausgewertet wird (in diesem Fall Null) dann std::cout << "odd"
ist nicht, weil die Expression &&
Kurzschlüsse ausgewertet, falsch zurück. Dies ist der linke Operand für den äußeren ||
Ausdruck, der bewirkt, dass seine b
(std::cout << "even"
) ausgewertet wird, schreibt "even" an den Ausgang.
Wenn remainder & 1
als wahr ausgewertet wird (in diesem Fall nicht Null), wird der rechte Operand für &&
ausgewertet, wobei "ungerade" angezeigt wird. Unter der Annahme, dass diese Operation erfolgreich ist, wird der linke Operand für die Operation ||
wahr sein, was dazu führt, dass er den rechten Operanden kurzschließt und nicht auswertet.
Erfahrene Programmierer sind wahrscheinlich genau wissen, was hier vor sich geht, aber wie Sie diese Technik gefunden haben, ist nicht die lesbar. Es ist besser (IMO), über die Absicht des Codes geradlinig zu sein, also würde ich einfach eine if
Bedingung verwenden - oder zumindest den ternären Operator verwenden: std::cout << (remainder & 1 ? "odd" : "even")
.
In anderen Sprachen (JavaScript kommt mir in den Sinn) (ab) die Verwendung der Kurzschlussoperatoren ist eine sehr verbreitete Technik. Normalerweise sehe ich nicht, dass sie in C++ so verwendet werden, und ich rate dringend davon ab.
Sie brauchen nicht die Klammern, die da sind, aber abhängig von der Vorrangstellung des Operators (ich kann mich nicht daran erinnern), brauchen Sie vielleicht Klammern um den 'Rest & 1'-Unterausdruck. –
Siehe [C++ Operator Precedence] (http://en.cppreference.com/w/cpp/language/operator_precedence) –