C# warum wird erst das Ergebnis der 2. Bedingung ausgegeben?

7 Antworten

Wieso das so ist, wurde ja schon mehrfach geschrieben.
Aber ich glaube, hier hat noch niemand das tatsächliche "Warum" geschrieben - oder ich habe es übersehen.

Aber vorweg:
Was Xearox schreibt, ist falsch - oder zumindest unvollständig.
Das gilt nur für das binäre Oder, nicht für das logische Oder.

====================

Die beiden Operatoren sehen ähnlich aus und tun scheinbar das gleiche, unterscheiden sich tatsächlich aber grundlegend.

|| => Das "doppelte Oder-Zeichen" ist ein logisches Oder.
Das logische Oder wird so berechnet, wie Du es erwarten würdest: Erstes Ergebnis true, dann ist das gesamte Ergebnis auch true. Das ist eine rein logische Schlussfolgerung, das hat den schönen Namen "boolsche Algebra", da gibt's viele Formeln, die sehr komplex aussehen, aber eigentlich sehr simpel sind.
Und weil das so eindeutig ist, wird nach dem ersten true-Ergebnis nicht weiter ausgewertet, deshalb wird beim logischen Oder die Methode auch nicht ausgeführt.

| => Das "einfacher Oder-Zeichen" ist ein binäres Oder.
Der binäre Oder vergleicht aber die binäre Darstellung (die Bits) und nicht den Wert an sich. Die Bits werden übereinander gestellt (das erste Bit ist immer rechts) und das Ergebnis hat an den Stellen eine 1, bei denen einer der beiden anderen Werte auch eine 1 hat.
Du kannst auch Zahlen binär vergleichen, bei einem boolischen Wert (true/false) wird das im Grunde auch getan: Die Zahlenwerte (1=true, 0=false) werden verglichen. Bei boolischen Werten ist direkt klar, wenn ein Wert 1 ist, ist das Gesamtergebnis 1, aber das boolische Oder muss mit allen Werten umgehen können und da gibt es eben nicht nur ein Bit, es gibt viele und es kann sein, dass der zweite Wert auch 1en beisteuert.
Deshalb muss bei einem binären Order immer jeder Teil ausgewertet werden und bei dir muss daher auch die Methode ausgeführt werden, um das Ergebnis zu erhalten.

Das kann man ausnutzen und basierend darauf entsprechende Algorithmen umsetzen, die das ausnutzen, habe ich so auch schon gesehen. Das solltest Du aber grundsätzlich vermeiden, da beim Lesen der Unterschied zu leicht untergeht und Du dadurch später sehr leicht Zusammenhänge übersiehst, die man nicht übersehen sollte.

Woher ich das weiß:Berufserfahrung

Weil die Methode aufgerufen wird bei der Überprüfung. Der von dir geschilderte Fall würde eintreten wenn du den ||-Operator anstatt dem |-Operator verwenden würdest (in der If-Abfrage). Beide bedeuten "oder", aber bei dem einfachen Strich werden immer beide Fälle geprüft, auch wenn der erste Fall schon true ist. Bei zwei Strichen ist die gesammte Bedingung true sobald der erste Ausdruck true ist, der zweite wird dann nicht mehr überprüft...

Woher ich das weiß:Hobby – Programmiere seit eineinhalb Jahren

Der Ausdruck ((x != y) | DoSomething()) muss erst einen Wahrheitswert zurückgeben.
Schon während der Prüfung des Wahrheitswertes u.a. mittels der Funktion DoSomething() wird "in DoSomething" ausgegeben.

Woher ich das weiß:Studium / Ausbildung – Vor über 40 Jahren als Klassenkasper 10. Klasse absolviert.

kommt auf den compiler an --- dieser wird wohl zuerst den kompletten ausdruck auswerten und nicht bereits wenn ein teil eines ausdrucks erfüllt ist den aderen teil überspringen. und dann kommts auch noch hinzu ob der ausdruck von rechts nach links oder links nach rechts zuerst ausgewertet wird

kann in besseren compilern alles so eingestellt werden ...

Weil die Funktion DoSomething während der Auswertung der if-Bedingung bereits ausgeführt wird und die "Bedingung erfüllt" erst nach Auswertung der Bedingung ausgeführt wird.

PflanzenJoe 
Fragesteller
 18.09.2021, 23:12

Ah! Verstehe. Ich dachte, was in einer if-Abfrage steckt, wird dann evtl. in einen nicht ausgebenden Zwischenspeicher gelegt und überprüft :D

0