2013-04-29 3 views
-1

ли не отдельные выражения в композитном логической И/ИЛИ выражения, как предполагается, будет оцениваться, прежде чем логические операторы применяются к их результату Почему ++k нетронутой в состоянии m = ++i && ++j || ++k по следующей программе:Почему «k» не увеличивается в выражении «m = ++ i && ++ j || ++ k», когда «++ i && ++ j» оценивается как true? ?

#include<stdio.h> 

int main() 
{ 
     int i=-3, j=2, k=0, m; 
    m = ++i && ++j || ++k; 
    printf("%d, %d, %d, %d\n", i, j, k, m); 
    return 0; 
} 

выход: -2,3,0,1

Но я ожидаю, что выход -2,3,1,1

+4

Поскольку ** короткое замыкание ** гарантируется стандартом. Так как '++ i && ++ j' оценивается как' true', независимо от оценки '||' конечный результат будет оцениваться как 'true', и поэтому окончательная' || 'просто не оценивается. Это известно как короткое замыкание. Стандарт C & C++ гарантирует это поведение для операторов '||' и '&&'. –

+3

Я ответил, но я не понимаю, почему люди сначала спрашивают о StackOverflow перед тем, как погрузиться в их книгу на языке программирования C. –

+1

«Разве не индивидуальные выражения в составном логическом выражении AND/OR, которое должно оцениваться первым» - Нет, конечно, это не так, как вам скажут даже самые простые чтения на C. –

ответ

6

Вы должны избегать сотрудничества ding такой нечитаемый код. Это на самом деле разбирается как

m = (++i && ++j) || ++k; 

Так как только j >= 0 условие ++j всегда верно, так ++k не оценивается, так как && короткий резки , а затем но || является короткой резки или еще (поэтому они не могут оценить свой правый операнд).

Так && оцениваются следующим образом: левый операнд вычисляется, если оно ложно оно возвращается, и только тогда, когда оно истинно (т.е. не равно 0) правый операнд вычисляется и возвращается в качестве оцениваемого результата от &&. Аналогично || оценивается следующим образом: левый операнд оценивается. Если оно истинно (отличное от нуля), оно становится результатом ||; или же правый операнд оценивается и является результатом выражения ||.

В частности, при кодировании if (x > 0 && 20/x < 5) раздел не применяется к x==0.

Читайте также википедия operators in C & C++ & short circuit evaluation & lazy evaluation страницы; и, пожалуйста, пройдите несколько часов, чтобы прочитать хорошую книгу программирования C.

+0

Просьба подробно описать раздел «а затем» и «или еще». –

+0

Спасибо. Но я предполагаю, что в строке '' есть опечатка, тогда только тогда, когда она истинна (т. Е. Не равна 0), правильный оператор «'. Он должен быть «правильным операндом» –

+0

Спасибо. Типовое исправление –

0

Это ярлык для логических операторов, в вашем случае оператор ||. Когда первый операнд true, второй операнд не может повлиять на результат. Это всегда будет верно, неважно, что может дать второй операнд. Таким образом, второй операнд не оценивается.

То же самое касается логического оператора &&, если найден первый операнд false. Второй операнд не имеет значения, результат всегда будет false, а второй операнд для этого не будет оцениваться.

0

&& и || являются логическими операторами, и вы используете их из контекста, который является нечетным (ok для C/C++, но у вас бывают ошибки типа на Java или C#).

Вы только что обнаружили операторы короткого замыкания - вам не нужно оценивать все выражение, если вы «знаете», что это правда. то есть i и j не равны нулю, поэтому вам не нужно ничего делать с k, так как вы знаете, что выражение истинно.

1

Логические операторы имеют оценку короткого замыкания, то есть как только значение определено для выражения, остальная часть выражения не оценивается.

например. m = ++i && ++j || ++k; в этом ++ I -> истинный, ++ J -> истинно (не нулевое значение), следовательно, m = true && true || ++k;

Теперь истинная & & верно, то верно так

m = true || ++k 

Как и оператор ИЛИ, если 1 сторона истинна, другая не оценивается, поэтому результат верен.

Следовательно, k не увеличивается.

0

m = ++ i & & ++ j || ++ к;

Выше строка кода выполняет ++ i и ++ j сначала и не выполняет ++ k, поскольку она написана после || (OR)

Операторы логических цепей не выполняются, если ранее утверждение истинно уже в случае || и ложь в случае & &

Следовательно к нетронутым

Смежные вопросы