2014-09-13 4 views
-2

Вот код, который мне нужен в онлайн-тесте. Рассмотрим этот код.Почему этот код печатает 1, -1

int i = -1, j = -1; 
(i=0)&&(j=0); 
(i++)&&(++j); 
printf("%d, %d\n", i, j); 

Приведенный выше код будет печатать

1, -1 

Может кто-нибудь объяснить, почему выход выходит, чтобы быть 1, -1 и не 1, 1.

+2

Google для «короткой оценки cicuit» – wildplasser

+0

объясните свой собственный анализ кода до сих пор –

+0

@afzalex вы уже знаете ответ? – thumbmunkeys

ответ

6

C выполняет оценку короткого замыкания на нескольких операторах. Один из них - &&. Это означает, что если левая сторона && оценивается как false, то правая сторона не будет оцениваться.

Кроме того, существует разница между ++i и i++. i++ вернет i и сохранит i+1. С другой стороны, ++i вернет i+1 и сохранит i+1.

Поэтому:

int i = -1, j = -1;  // i = -1, j = -1 
(i=0)&&(j=0);    // i = 0, j = -1 (right hand side not evaluated because lhs evaluated to 0) 
(i++)&&(++j);    // i = 1, j = -1 (right hand side not evaluated because lhs evaluated to 0) 
printf("%d, %d\n", i, j); 
return 0; 
+0

Почему этот ответ был отменен? Если вам не нравится эта тема, проголосуйте за закрытие. Лично мне не нравятся комментарии слишком много: я бы предпочел, чтобы я был 0 и т. Д. Вместо использования =. – Bathsheba

+0

Me - Не кормите плохих программистов –

+0

+1 Разве это не вопрос интересный, почему я получаю downvotes для него? Извините, но я разместил этот вопрос для обмена знаниями, и я думаю, что он не работает таким образом. Поэтому я собираюсь удалить этот вопрос. Я прошу прощения за это. @sharth – afzalex

3

Это вроде очевидно, если учесть порядок оценки. Первый & & выполняет только первый термин. i = 0 до & &. Второй & & также выполняет только первый член, поскольку постфиксирование i ++ оценивается в 0, но увеличивается на 1. Следовательно, i = 1 и j остается неизменным при j = -1. Лучшая точка обсуждения здесь никогда не пишет такой код, отладка и рационализация - это очень сложно.

+1

Вы получаете +1 за попытку ответить на глупый вопрос –

+0

@EdHeal Почему вы думаете, что это глупый вопрос. И я хочу понять, что я не поддержал его, и даже вопрос, который я задал, изначально не был создан мной. Меня попросили на хорошем веб-сайте, когда я сдавал тест на этом сайте. – afzalex

+0

@EdHeal Кто-то поддержал ревень, потому что нашел его полезным. Вы не должны говорить ему об этом. Но я хотел бы знать, почему вы рассматриваете этот вопрос как плохой? – afzalex

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