Почему это, если оператор дает вывод, несмотря на то, что условия && не выполняются?

Я пытался выполнить кусок кода с некоторыми условиями. Это простая версия этого.

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, так как если второе неравенство выполнено, то так должно быть и первое.)

Другие вопросы по тегам