Почему это, если оператор дает вывод, несмотря на то, что условия && не выполняются? - PullRequest
0 голосов
/ 10 апреля 2019

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

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 Ответ

0 голосов
/ 10 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...