|
|
Was ist der Unterschied zwischen |, || und OR ? |
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 25.08.2011, 11:14
Titel: Was ist der Unterschied zwischen |, || und OR ?
|
|
|
|
|
Hallo,
Die unterschiedlichen Operatoren für logische Verknüpfungen führen oft zu Verwirrungen. Man findet dazu viele Seiten im Netz, nun kommt noch eine weitere als goMatlab-Tutorial hinzu. Alle Erklärungen hier gelten auch equivalent für &, && und AND.
Der || Operator wird für Skalare eingesetzt, während | auch mit Arrays arbeitet:
Zusätzlich gibt es noch die Short-circuiting Eigenschaft: Wenn der erste Operand von || ein logisches TRUE (alles ausser 0) zurückgibt, wird der zweite Operand nicht ausgeführt. Bei einfachen Variablen macht das keinen Unterschied, aber wenn man es für Funktionen benutzt schon. Hilfreich ist das z.B. in:
Hier vermeidet es eine Division durch Null.
Ein weiteres Beispiel: FPRINTF gibt die Anzahl der geschriebenen Zeichen zurück, hier also jeweils 1. Dann:
Mit || wird also das zweite FPRINTF also erst gar nicht aufgerufen, weil der gesamte Ausdruck sowieso TRUE liefert.
Innerhalb einer IF-Bedingung wird allerdings auch für den | Operator Short-circuiting angewendet (seit Matlab 6.1, seit 6.5 ist das auch dokumentiert). Das wird dann allerdings nahezu (oder total?) undurchschaubar:
Hier kommt noch dazu, dass die IF-Bedingung ein Vektor ist und intern ein (ALL(Condition) && ~isempty(Condition)) ausgeführt wird. Wenn jemand zur obigen Zeile ohne Ausprobieren die Ausgabe ins Command-Fenster vorhersagen kann, bekommt er von mir den Anerkennungspreis der Woche.
Zudem gibt es noch die Funktionen OR und AND, bei denen kein Sort-circuiting ausgeführt wird, weder innerhalb noch ausserhalb von IF-Bedingungen.
Zusammenfassung:
|, || und OR liefern die gleichen Ergebnisse für skalare Variablen.
|| arbeitet nur mit skalaren Inputs.
Der || Operator benutzt Short-circuiting, während der | Operator dies nur innerhalb von IF und WHILE Bedingungen macht.
Short-circuiting kann sehr viele Nanosekunden Rechenzeit sparen und kostet meist nur ein paar Tage Debug-Zeit. Ich vermeide deshalb Funktionsaufrufe mit logischen Verknüpfungen in IF-Bedingungen komplett und benutze stattdessen temporäre Variablen, in denen ich die Ergebnisse der Funktionen zwischenspeichere.
Viel Erfolg, Jan
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 26.08.2011, 19:42
Titel:
|
|
Hallo,
in Ergänzung dazu:
- Schreibweisen wie a < x < b führen nicht zu den vermutlich erwarteten Ergebnissen und sollten daher nicht vermieden werden. Stattdessen:
- Ein weiteres Beispiel für sinnvolle Verwendung von Short-Circuit-Operatoren sind Abfragen wie "falls a existiert und gleich 1 ist":
Wenn die Variable a nicht existiert, wird der zweite Teil nicht mehr abgetestet. Wie Jan schon sagte, verwendet MATLAB automatisch Short-Circuiting; das ganze funktioniert also auch mit einfachem &
- Je nach benötigter Auswertungszeit kann Short-Circuiting zu ganz gehörigen Zeitersparnissen führen, wenn dadurch eine langwierige Berechnung nicht ausgeführt werden muss.
Grüße,
Harald
|
|
|
Arochan |
Forum-Newbie
|
|
Beiträge: 1
|
|
|
|
Anmeldedatum: 20.03.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.03.2012, 22:54
Titel:
|
|
Harald hat Folgendes geschrieben: |
und sollten daher nicht vermieden werden. |
Du meinst wohl:
und sollten daher vermieden werden.
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|