Условия за сливане в оператор 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
Във втория случай, ако condtion (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

Така че първото ви твърдение изисква или условие А, или Б да е вярно, а второто твърдение тества само дали А е вярно

Помислете за тестов случай, където 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, тогава и в двата случая резултатът ще бъде true, защото стойността на local != -1 = true

но ако вземем local != -1 = false и fall_back == 1 = true, тогава в първия случай резултатът ще бъде верен, а във втория случай резултатът ще бъде false.

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