2015-05-05 8 views
6
if 1 | [] 
    disp('1 | []'); 
end 

if [] | 1 
    disp('[] | 1'); 
end 

Ergebnisse in 1 | []. Das erste if wird ausgeführt.Reihenfolge der Werte im logischen Ausdruck in if-Klausel

Wie kommt dieses Verhalten? Ich würde annehmen, beide haben das gleiche Ergebnis.

+0

einen Do schnelle Suche auf Yoda Bedingungen, können Sie einige der Verhaltensunterschiede auf der Wiki-Seite finden :-) –

+3

Interessant, da auf der Kommandozeile, beide Bedingungen zu '[]' – Jonas

+2

Ich wollte die gleiche Frage stellen, aber Sie sind schneller! –

Antwort

4

Ich würde sagen, dass dies höchstwahrscheinlich ein Interpreter-induzierter Fehler ist, obwohl MathWorks behaupten könnte, es sei undefiniert.

Auf der Kommandozeile, zu bewerten sowohl cond1 = 1|[]; und cond2 = []|1;-[], weil alle Operationen [] Rückkehr [] beteiligt sind. Da [] zu false ausgewertet wird, würde man erwarten, dass sich beide Fälle bei Verwendung in einer Bedingung gleich verhalten, wenn sie in einer if-Klausel verwendet werden.

Abgesehen von den Array-weise logischen Operatoren, Matlab bietet auch Kurzschlussbetreiber, wo die Auswertung der Bedingungen gestoppt wird, wenn das Ergebnis aus der Betrachtung Teilen der Bedingung nur klar ist. Der an der Befehlszeile ausgewertete arrayweise Vorgang 1|[] gibt [] zurück, während der Kurzschlussvorgang 1||[]1 zurückgibt. Beachten Sie, dass []||1 einen Fehler auslöst, da der Kurzschlussoperator nur mit skalaren Bedingungen arbeitet, es sei denn, er muss sie nie auswerten.

Bis jetzt ist alles wie erwartet. Was ich in unserem unerwarteten Fall vermute, ist, dass der Interpreter implizit 1|[] durch 1||[] innerhalb der if-Klausel ersetzt, möglicherweise weil die Operation mit einem Skalar beginnt und [] kein Array ist.

Wenn möglich, sollten Sie vermeiden, mit [] Berechnung und mögliche solchen Fällen mit isempty fangen.

+2

Der Spaß ist, dass ist nicht als falsch interpretiert * bis zum Ende *. Was bedeutet "([] | 1) | 1 'ist falsch. –

1

Da Matlab logische Operationen in if-Anweisungen nur interpretiert, wenn das Ergebnis davon abhängt. Interpretieren 1 | X ist in der Regel ganz gleich wahr, was der zweite Ausdruck ist, so dass der Dolmetscher die Abkürzung nehmen (zu Unrecht bei X = [].
[] | X falsch ist, egal was der zweite Ausdruck ist, so ist das Ergebnis falsch.

+0

Aber das Ergebnis von '[] | x 'ist nicht falsch, ist' [] '. Dann interpretiert die if-Anweisung es als "nicht wahr" –

+1

Dies wird eigentlich Kurzschluss genannt: http://www.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.html – brodoll

+0

Guter Punkt; Ich vermute, dass Matlab in diesem Fall irrtümlich kurzgeschlossen ist (Hinweis: Matlab hat explizite Kurzschlussoperatoren) – Jonas

Verwandte Themen