Почему это, если оператор дает вывод, несмотря на то, что условия && не выполняются?
Я пытался выполнить кусок кода с некоторыми условиями. Это простая версия этого.
X=100;Y=100;
if ((((X+1) && (Y+1))<=99) && (((X+1) && (Y+1))<=102))
disp(X);
end
Несмотря на то, что X и Y не удовлетворяют первому условию, я все равно получаю вывод как 100. Я попробовал все комбинации & и && для выполнения операций и в работе. Я проверил разницу между ними и обнаружил, что & является логическим побитовым оператором, а && является оператором короткого замыкания, который, вероятно, не сильно меняется в этом контексте. В чем ошибка с этим синтаксисом?
Конечно, код работает, когда я делаю это:
X=100;Y=100;
if (X+1)<=99 && (Y+1)<=99 && (((X+1) && (Y+1))<=102)
disp(X);
end
Но это так неэффективно, когда есть много условий, и каждое подусловие должно включать ограничения. Я уверен, что на этот вопрос нужно где-то ответить, и этот вопрос может быть дубликатом, поэтому, пожалуйста, укажите мне на ответ.
1 ответ
Похоже, вы понимаете, что (X+1)<=99 && (Y+1)<=99
делает. Давайте посмотрим на ((X+1) && (Y+1))<=99
:
&&
требует логического значения на каждой стороне. a && b
получится a
а также b
в логику, эффективно превращаясь a~=0 && b~=0
, Таким образом:
((X+1) && (Y+1) ) <= 99
((X+1)~=0 && (Y+1)~=0) <= 99
( true && true ) <= 99
1 <= 99
true
Конечно ценность истины (X+1)~=0
а также (Y+1)~=0
может быть другим, но здесь вы видите это. В MATLAB, true
равно 1
в нелогическом контексте, по сравнению с 99
,
Если вы хотите упростить это выражение, используйте max
вместо &&
:
X=100;Y=100;
if max(X+1,Y+1)<=99 && max(X+1,Y+1)<=102
disp(X);
end
Если максимум a
а также b
меньше чем 99
тогда оба a
а также b
меньше чем 99
,
(Очевидно, что утверждение может быть дополнительно упрощено до if max(X+1,Y+1)<=102
, так как если второе неравенство выполнено, то так должно быть и первое.)