2013-12-18 2 views
3
#include <iostream> 
using namespace std; 

int main() 
{ 
    int j=20; 
    int i=0; 
    for (int k=0; i<10 && j>10; i++ && j--) 
     cout<< "i is " <<i<< " and j is " <<j<<endl; 
} 

Итак, вот как я это вижу, первая i 0 и j составляет 20, как следует условие, следовательно, выход "0 20", то i увеличивается и j уменьшается, таким образом, выход должен быть "1 19" но следующий вывод: "1 20", как будто j не был уменьшен !. Зачем?Какова логика этого небольшого кода на C++?

ответ

11

Когда i==0, i++ && j--short-circuits в первый раз это называется, так что вы в конечном итоге с i==1 и j==20.

Вы можете исправить это с помощью оператора запятой: i++, j--.

Помните, что в C/C++ 0 считается ложным, поэтому 0 && x никогда не будет оценивать x, так как он знает, что это выражение ложно. См. Выше ссылку для более подробной информации.

+0

Почему это короткие цепи? как я могу изменить код, чтобы напечатать желаемый результат? – Aradhya

+0

@ user3051238 Замените 'i ++ && j -' на 'i ++, j -'. – Matt

3

Выражение (i ++ & & j ++) коротких замыканий, а J никогда не увеличивается, потому что (i) содержит (ложное) начальное значение. Я думаю, что вы хотите, чтобы выглядеть следующим образом:

for (int k=0; i<10 && j > 10; i++, j--) 

& & оператор проверяет левую сторону первой истины, и если оно ложно, (когда я это 0, это неверно) он даже не оценить правую сторону. Если левая сторона истинна, тогда и ТОЛЬКО, то она проверяет правильную сторону & &.
Инкрементная часть цикла for не должна оценивать логическое условие.

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