zwei Wege, ist können Sie das Kurzschlussverhalten in C erhalten:
unsigned int bitwise_logical_or(unsigned int p, unsigned int q) {
return (p | (q & ((p != 0) - 1)));
}
unsigned int numerical_logical_or(unsigned int p, unsigned int q) {
return p + (p == 0) * q;
}
Wie in anderen Antworten erwähnt, der ||
Operator gibt true (0x01) oder falsch (0x00).
bitwise_logical_or
funktioniert wie folgt:
Wenn bit- oder auf ganze Zahlen p und q ausgeführt wird, wird es nur funktionieren, solange p Null ist. Wenn p nicht Null ist, bitweise oder wird p und q auf unvorhersehbare Weise vermischen. Wenn q auf Null gesetzt werden könnte, wenn p größer als Null ist, erhalten wir das gewünschte Ergebnis. Wenn p nicht Null ist, möchten wir daher bitweise und zwischen q und null durchführen. Der Trick ist, dass das einfache Testen von p == 0 (in 8 Bit) 0x00 oder 0x01 zurückgibt. Wir brauchen es, um 0xff oder 0x00 passend zurückzugeben. Wir erreichen dies, indem wir p! = 0 überprüfen, das wird 0x01 zurückgeben, wenn p> 0 und 0x00, wenn p == 0. Subtrahiere 1, und für den Fall, dass p> 0 ist, erhältst du 0x00 (falsch). Wenn p == 0 ist, haben Sie bereits 0x00 (alle Nullen), es gibt keinen Ort, an dem die Integer umgeht (Unterläufe) und Sie erhalten 0xff (alle Einsen).
Ihr Eindruck ist falsch. Wenn die LHS falsch ist, versucht es die RHS. –
'das bewertet nicht die rhs, wenn die lhs falsch ist, das macht überhaupt keinen Sinn. Es ist im Gegensatz zu dem, was ein logisches ODER sein soll. Ihre Aussage gilt für logisches UND. –
"* logischer ODER-Operator || ist ein Kurzschlussoperator, der die rhs nicht auswertet, wenn die lhs falsch ist *" Pause machen! ;-) – alk