Условия слияния в операторе if

У меня есть два условия для оператора if. Я обнаружил, что они разные, но я не знаю причину.

1: if ((local != -1) || (fall_back == 1))
2. if ((local != -1) || ((local != -1) && (fall_back == 1)))

Эти двое разные. Но в математике у нас есть A V (B ^ C) = (A V B) ^ (A V C). Если я воспользуюсь этим уравнением и реорганизую утверждение 2, оно окажется таким же, как и 1. Есть ли что-то фундаментальное, что я упускаю? Как упростить утверждение 2? Это не выглядит хорошо.


person Community    schedule 22.08.2014    source источник
comment
На самом деле это не вопрос C; это основной логический вопрос.   -  person user3553031    schedule 22.08.2014
comment
Во втором случае, если условие (local != -1) не выполняется, то нет смысла проверять второе условие, оно также не будет выполнено.   -  person Jayesh Bhoi    schedule 22.08.2014
comment
Утверждение 2 на самом деле не A V (B ^ C) = (A V B) ^ (A V C); это A V (A ^ B) = (A V A) ^ (A V B)   -  person user3553031    schedule 22.08.2014


Ответы (4)


Оценка короткого замыкания выполняется для оптимизации. Таким образом, в таком выражении, как (A!=B) || (A!=C), если A!=B оказывается истинным, вторая часть A!=C вообще не оценивается, потому что независимо от второй части выражение окажется истинным.

person Kishore    schedule 22.08.2014

Рассмотреть возможность

A -> local != -1
B -> fall_back == 1

Ваше первое условие сводится к

A V B

И второе утверждение сводится к

A V (A ^ B)  =>  A ^ (1 V B)  => A

Таким образом, ваше первое утверждение требует, чтобы условие A или B было истинным, а второе утверждение проверяется только в том случае, если A истинно.

Рассмотрим тестовый пример, где local = 0 и fall_back = 1

Statement 1 => True as fall_back == 1
Statement 2 => False as local != 0

Значит условия не те

person sujithvm    schedule 22.08.2014

Это просто. Если вы возьмете local != -1 = true и fall_back == 1 = false, то в обоих случаях результат будет истинным, потому что значение local != -1 = true

но если взять local != -1 = false и fall_back == 1 = true, то в первом случае результат будет истинным, а во втором случае - ложным.

person RahulKT    schedule 22.08.2014

В логическом ИЛИ, если первое условие истинно, второе не будет оцениваться! Но в логическом И первое условие false означает, что оно не будет оценивать второе!

if ((local != -1) || (fall_back == 1))

В этом случае, если какое-либо из условий истинно, local != -1 или fall_back == 1, оно будет оценивать тело if.

if ((local != -1) || ((local != -1) && (fall_back == 1)))

Но здесь оба должны быть истинными, тогда только он будет оценивать выражение. иначе local != -1 означает, что оба условия не выполняются. Потому что логическое И(&&) должно быть истинным!

Учтите, что local != -1 неверно, а fall_back == 1 верно

if ( false || true ) -> if(0 || 1) -->true

if ( false || (false && true)) -> if(0 || (0 && 1)) -> if(0 || 0) --> false
person Sathish    schedule 22.08.2014