2013-11-07 1 views
-1

У меня есть трудно понять, что делает этот код делать:If-statemenet состояние

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x = 0, y = 0; 
    if (x++ && y++) 
     y += 2; 
    cout << x + y << endl; 
    return 0; 
} 

Выход 1 на C++. Но я думаю, что это должно быть 2?

Почему? Потому что в выражении() if, я думаю, что нужно только проверить, истинно ли это/false, поэтому он не увеличивает/не уменьшает число целых чисел. И поскольку это верно по умолчанию, оно увеличивает y на 2? И выход должен быть 0 + 2 = 2, но он выводит только 1?

+1

Вместо того, чтобы убедить себя, что ваши собственные убеждения являются единственным источником истины, вы можете просто открыть учебник на C++ и узнать, что такое операто rs и statments ** фактически ** сделать. –

+0

ваше предположение не работает. – yngccc

+2

x ++ приращения после оператора if. Когда значение if проверено, 'x' равно 0, поэтому false. Когда инструкция if продолжается, x увеличивается. y + = 2 НЕ обрабатывается. Это оставляет 'cout << 1 + 0 << endl' – jeremy

ответ

6

if (x++ && y++) не будет делать y++, потому что условие слева от логического и оператора (&&) является false, поскольку x++ будет возвращать 0 и приращение x на 1.

Поскольку false && expression будет давать ложно для любого выражения, существует нет необходимости оценивать остальную часть.

Следовательно, вы получаете x = 1 и y = 0.

Это называется Short-circuit Evaluation.

+1

Хорошее объяснение! Ливан в силу. –

0

он сначала выполнить x++ и компилятор знает, что из-за того, что выражение x++ && y++ будет ложным и будет игнорировать y++

как результат, что х = 1 и у = 0 после;

это то же самое, что и написание if(false && do_something()), в этом случае do_something() никогда не будет называться.

1

Должность ++ Оператор имеет высокий приоритет и && Оператор имеет право на оценку короткого замыкания. Что происходит в if (x++ && y++), так это то, что сначала он оценивает x++. Результат равен 0 и приращениям x. Поскольку 0 ложно & & будет замыкать оценку y++ (не будет выполнен). Также if будет оценивать значение false и не будет выполнять y+=2.

Итак, теперь у вас есть x=1 и y=0.

Таким образом, результат равен 1.

0

Я совет вам взглянуть на оператора старшинства графике: http://en.cppreference.com/w/cpp/language/operator_precedence

//in a statement, x++ will evaluate x then increment it by 1. 
//in a statement, ++x will increment x by 1 then evaluate it. 

Если у вас есть трудное время, чтобы понять это, то попробуйте следующий код, чтобы лучше понимайте:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x = 0, y = 0; 
    if (++x && ++y) // in your case, with the previous code, it gives (0 && 0) 
    // instead of if statement you can try the following : cout << x++; then cout << ++x; 
    // and notice the difference 
     y += 2; 
    cout << x + y << endl; 
    return 0; 
} 
Смежные вопросы