Die &
und |
Betreiber nicht tun, was Sie denken, sie tun. Betrachten Sie sie eher als "Schnittmengen" - und "Vereinigungs" -Operatoren für binäre Masken (d. H. Elementweise logische and
und logische or
Operationen für logische Arrays).
Vielleicht ist es am besten mit einem Beispiel zu illustrieren:
>> A = zeros(10,10); A(2:6,2:6) = 1;
>> B = zeros(10,10); B(4:8,4:8) = 1;
>> subplot(1,3,1); imagesc(A+B); axis image off; title('A + B', 'fontsize', 20);
>> subplot(1,3,2); imagesc(A&B); axis image off; title('A & B', 'fontsize', 20);
>> subplot(1,3,3); imagesc(A|B); axis image off; title('A | B', 'fontsize', 20);
Mit anderen Worten, diese normalen Operatoren sind, die auf logische Arrays arbeiten.
Im Gegensatz dazu &&
und ||
sind Programmierkonstrukte, bekannt als Verknüpfung Operatoren, entworfen Aussagen zu bewerten. &&
ausgewertet true
wenn zwei Aussagen beide wahr sind, und ||
ausgewertet true
wenn entweder von ihnen wahr ist.Der Grund, warum sie Verknüpfung Operatoren genannt werden, ist, dass sie eine programmatische Funktion von nicht die Auswertung der rechten Seite Operand, wenn die logische Auswertung der linken Seite garantiert das Ergebnis des Ausdrucks unabhängig von der rechten Hand Seite. Als solche müssen ihre Eingaben logische Ausdrücke sein, d. H. Etwas, das zu einem logischen Skalar Wert von 1 oder 0 (d. H. true
oder false
) auswertet.
Dies ist unglaublich nützlich für die Bewertung von Einschränkungen, die zu Fehlern führen würden, wenn sie ausgewertet werden, z. Division durch Null oder nicht definierte Variablen, z.B .:
>> condition1 = exist('MyVar') && MyVar == 0 % no error
condition1 =
0
>> condition2 = exist('MyVar') & MyVar == 0 % error
Undefined function or variable 'MyVar'.
Ein if
Block Aussagen logisch bewerten soll. d. h. "wenn die Aussage x logisch wahr ist, dann tun Sie y". Daher sollten Sie Shortcut-Operatoren und keine logischen Arrays verwenden.
Das if
Stichwort geschieht für Arrays überlastet werden (dh if [1,1]; disp(1); end
funktionieren wird), aber dies ist nur für syntaktische Bequemlichkeit und für strengere Programmierung sollten Sie wirklich explizit sein, was die resultierende logische Ausdruck sein sollte (zB if all([1,1]); disp(1); end
) .
Beachten Sie auch, dass, während if
überlastet ist, assert
ist nicht, so assert([1,1])
wird zu einem Fehler führen, weil [1,1]
nicht zu true
(das heißt einen skalaren logischen Wert 1) wertet. Wenn Sie versucht haben, &
und |
im Zusammenhang mit assert
zu verwenden, würden Sie es vermutlich durcheinander bringen.
Normalerweise ist '||' ein logisches OR und '|' ein bitweises ODER. Vielleicht sollten Sie [lesen Sie die Betreiber] (https://www.tutorialspoint.com/matlab/matlab_operators.htm) – musefan