Warum werten logische Operatoren in C nicht den gesamten Ausdruck aus, wenn dies nicht erforderlich ist?
Ich habe gerade mein Lehrbuch für meinen Computerarchitekturkurs gelesen und bin auf diese Aussage gestoßen.
Eine zweite wichtige Unterscheidung zwischen dem @ der logischen Operator&&
' und '||
'im Vergleich zu ihren Gegenstücken auf Bitebene'&
' und '|
'bedeutet, dass die logischen Operatoren ihr zweites Argument nicht auswerten, wenn das Ergebnis des Ausdrucks durch Auswertung des ersten Arguments ermittelt werden kann. So kann zum Beispiel der Ausdrucka && 5/a
wird niemals eine Division durch Null verursachen, und der Ausdruckp && *p++
wird niemals die Dereferenzierung eines Nullzeigers verursachen. (Computersysteme: Die Perspektive eines Programmierers von Bryant und O'Hallaron, 3. Auflage, S. 57)
Meine Frage ist, warum sich logische Operatoren in C so verhalten. Am Beispiel des Autors vona && 5/a
, würde C nicht den ganzen Ausdruck auswerten müssen, weil&&
setzt voraus, dass beide Prädikate wahr sind? Ohne Einschränkung der Allgemeinheit gilt dieselbe Frage für sein zweites Beispiel.