wie ist x&&y||z ausgewertet?
Gegeben
int x=1,y=2,z;
Könnten Sie erklären, warum das Ergebnis:
x && y || z
ist 1?
x && y = 1
x && y || z = 1
- Was zur Hölle ist das Kopfgeld für? Die Frage geht wirklich bleiben unbefriedigend beantwortet?
- Wenn Sie unsicher sind, ob der code wirklich das macht, was Sie beabsichtigt, es zu tun, verwenden Sie Klammern. Sie machen den code lesbarer zu gestalten. Es ist nicht "cool" zu Stopfen alles, was Sie können in einer einzigen Anweisung, kann nur analysiert werden, wenn Sie wissen, je Ecke der Sprache.
- Re: "Was zur Hölle ist das Kopfgeld für?" -- Oft Menschen bieten ein Kopfgeld auf zufriedenstellend beantwortet Fragen als ein Mittel, um eine zusätzliche Belohnung für die Beantworter. Das ist explizit erlaubt, wenn die person, die die bounty hat immer noch eine Wartezeit, bevor Sie vergeben.
- das kann sein, aber ich dachte, das war nicht die Art von Frage... 🙂
- Es stellt sich auch heraus, dass die person, die die bounty ist ein Beantworter :))
- Ausgehend von den upvotes könnte es dies sein => meta.stackexchange.com/questions/105275/... obwohl, die Antwort ist nicht wirklich alles gut. Sieht fischig zu mir.
- Bietet eine bounty ist ein wirklich lahmer Weg, um zu verhindern, dass deine Frage geschlossen wird, um ein Duplikat/off-topic/etc... Dies ist der wahrscheinlichste Grund, denke ich...
- Ich glaube nicht, denn die OP ist nicht die ein Angebot der bounty
- Bitte stoppen Sie bietet Kopfgelder auf Fragen, die ohne ersichtlichen Grund.
- In C (ich weiß nicht, ob es das gleiche in C++), das Ergebnis der logischen Operationen (
!
,&&
,||
) ist einint
- Typ mit dem Wert0
oder1
Du musst angemeldet sein, um einen Kommentar abzugeben.
entspricht
wenn
x=1
undy=2
dann
x&&y
ist1 && 2
dietrue && true
dietrue
.ist immer
true
.z
gar nicht ausgewertetx && y || z
=>(x && y) || z
=>1 || z
=>1
Nicht initialisierte int-bezieht sich auf Daten, die im Arbeitsspeicher gespeichert, wo es platziert wird auf stack... und es selten ist
0x00000000
, und selbst wenn es war,true || false = true
.Den
&&
- operator hat eine höhere Priorität als die||
Betreiber. Siehe, z.B., diese Operatoren Vorrang-Tabelle, Nummern 13 und 14.Ihrem Beispiel wird als
(x && y) || z
. Dank der Kurzschluss-Regelz
ist nie ausgewertet, da das Ergebnisx && y
ist schontrue
.Können Sie denken
x && y || z
als äquivalent zu:Da beide
x
undy
fixiert sind, um nicht-null-Werte der ersten return-Anweisung ist immer ein hit.Auf IA32, ohne Optimierung
x && y || z
wird:Sowie
func
wird:Mit Optimierungen aktiviert
func()
sieht sogar noch mehr wie der Ausdruck (der Rückgabewert wird nur geladen, von einem Ort, obwohl es ist verdeckt von x86-isms), aber der Ausdruckx && y || z
im Grunde verschwindet, da der compiler in der Lage ist, ableiten, dessen Wert zur compile-Zeit.Weil
x && y
wird ausgewertet, wie(x != 0) && (y != 0)
, was gleichbedeutend ist mit1 && 1
resultierende 1. Und1 || 0
1 ist, egal, was der y-Wert ist.Den && - operator hat eine höhere Priorität als die || Betreiber
Gibt es 2-Komponenten hier:
Wenn es Ihnen hilft, denken Sie daran, in Bezug auf mathematische Operatoren, || kann ersetzt werden mit dem plus-Zeichen "+", die darin besteht, 2 bars und als && ersetzt werden kann, die mit einem "." und hat die Vermehrung der Vorrang vor "+" 🙂
In C++ und C, wenn ein boolescher Ausdruck wird ausgewertet und das Ergebnis kann logisch hergeleitet werden, die von einem bestimmten Begriff, werden die folgenden Bedingungen nicht bekommen, ausgewertet:
false && (expr2) ist falsch UND expr2 nicht bewertet.
true || (ausdr3) wahr ist, UND ausdr3 nicht bewertet.
Ich hoffe, das hilft =)