2015-10-05 7 views
-3

, пожалуйста, как вы объясните, почему P =2, а не P=3. (Я попробовал это на Geany, и он имеет значение 2).Значение oF P неожиданно

int main() 
{ 
    int N = 10, P = 5, Q = 10; 
    N = 5; 
    P = 2; 
    Q = ++N == 3 && P++ != 3; 
    printf ("N=%d P=%d Q=%d\n", N, P, Q); 
    return 0; 
} 

благодарит за ваш ответ.

+0

В чем проблема с &&? Как я могу объяснить кому-то новичку в этой проблеме? Я попытался сделать обратное, как это Q = ++ N! = 3 && P ++ == 3 , поэтому я получил 3 в P. – OntoBLW

ответ

1
Q = ++N == 3 && P++ != 3; 

Первое выражение (++N == 3) ложно, таким образом, программа никогда даже не выполняет второе выражение. Это явление называется Short Circuit Evaluation

2

Потому что в этом случае (P++ != 3) вы просуммировать значение (++) после того, как из реализации сравнения между P и 3.

Если вы используете этот тип сравнения (++P != 3) сумма перед сравнением.

Дело в том, что это не то же самое, что и у (P++ != 3) и (++P != 3).

+0

Хотя правильно, это неправильный ответ на вопрос. Я имею в виду, что тот же результат получается при замене '(P ++! = 3;)' на '(++ P! = 3;)' Смотрите другие ответы по этой причине. –

1

C11 standard состояния:

6.5.13 Логический оператор И

4 В отличие от побитового двоичного & оператора, то оператор & & гарантии влево-вправо оценки; есть точка последовательности после оценки первого операнда. Если первый операнд сравнивается с 0, второй операнд не оценивается.

Так, в основном только ++N == 3 выполняется. И это результат обречен всегда быть false. Итак, правая часть вашей операции AND просто пропущена.

Как отмечено в комментариях, такое поведение называется оценкой Short-circuit.

0
/* 
because in line 
*/ 
Q = ++N == 3 && P++ != 3; 

/* 
you are not affecting any thing to P; 

because true= true && true; 
false= either both false or one of them is false 
the compiler if it find any of the arguments false then it stops there and returns false. 
it is mater of speed so if : 
*/ 
Q=++N==3 && DoSomeThing(); 
/* 
the function DoSomeThing() will never be called 
because ++N (which is now 6) do not equals 3; 

but this will succeed obviously 
*/ 

Q=++N==6 && DoSomeThing(); 

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

  • Нет связанных вопросов^_^