Арифметические операторы C++

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

Вопрос был в следующем:

If

int i = -1, int j = -1, and int k = -1, 

и запускаем следующую строку:

++i && ++j && ++k

каковы будут новые значения i, j и k? Причина, по которой я был сбит с толку, заключается в том, что, поскольку мы ничему не присваиваем это выражение, кажется, что операторы и не должны иметь никакого значения (должны быть только операторы приращения). Однако запуск простой тестовой программы быстро показал, что я ошибался. Может ли кто-нибудь объяснить мне это, так как я никогда раньше не видел этого упражнения.


person John Roberts    schedule 19.10.2012    source источник
comment
Встречный вопрос: это зависит от типа i, j и k?   -  person Matthieu M.    schedule 19.10.2012
comment
Интервьюер упомянул, что это целые числа, я просто забыл об этом в вопросе. Я починю это.   -  person John Roberts    schedule 19.10.2012


Ответы (2)


Суть здесь в том, что && закорачивается.

Итак, ++i оценивается первым. Он увеличивает i и возвращает новое значение, равное 0, поэтому остальная часть выражения не оценивается.

Значения должны быть 0, -1, -1, если я не ошибаюсь.

person Luchian Grigore    schedule 19.10.2012
comment
Я вижу сейчас. Все, что интервьюер должен был упомянуть, — это фраза «короткое замыкание», и я бы понял. Спасибо. - person John Roberts; 19.10.2012
comment
@JohnRoberts хорошо ... это противоречит цели интервью, не так ли? :П - person Luchian Grigore; 19.10.2012
comment
@LuchianGrigore: ну... не обязательно. Короткое замыкание в логических операциях — это деталь, которую может не знать человек, плохо знакомый с языком. Но как только вы сказали, вы можете увидеть его способность рассуждать. Если задать этот вопрос таким образом, похоже, что вопрос больше касается проверки знания синтаксиса, чем способности решать проблемы. Сама по себе вещь неплохая, но, по крайней мере, об этом следует заявить, а не открывать. - person Emilio Garavaglia; 19.10.2012
comment
@EmilioGaravaglia, о, я согласен. ИМО это не хорошие вопросы интервью. Именно такие мелкие придирки совершенно бесполезны при оценке кого-либо. Моя точка зрения заключалась в том, что я думаю, что задавать этот вопрос все равно, что спрашивать, знаете ли вы, что такое короткое замыкание?, Только замаскированный в коде. - person Luchian Grigore; 19.10.2012
comment
Это плохой вопрос для интервью. И этот код тоже довольно плохой. - person John Dibling; 19.10.2012
comment
@EmilioGaravaglia: Что ж, в C и C++ активно используется короткое замыкание && и ||. Например, if (p && p->valid) является правильным только потому что p->valid не оценивается, когда p равно нулю. Вопрос плохой, но знать о поведении короткого замыкания обязательно. - person Matthieu M.; 19.10.2012
comment
Если вы укажете эксперта по C/C++ в своем резюме, это будет очень хороший вопрос для собеседования, поскольку все, кто сдавал CS101, будут знать о коротком замыкании, но распознать его в коде — это совсем другая история. !Иначе - person Andreas; 19.10.2012
comment
@Andreas Андреас, если вы укажете в своем резюме эксперта по C/C++, вы явно им не являетесь. :D - person Luchian Grigore; 20.10.2012
comment
Интервьюер ни в коем случае не должен сразу упоминать короткое замыкание. Если вы попытаетесь ответить на вопрос и получите неправильный ответ, интервьюер должен спросить, знаете ли вы, что такое короткое замыкание оператора? Если этот вопрос заставляет вас немедленно вернуться к проблеме и получить правильный ответ, вы получаете частичный кредит. - person Russell Borogove; 20.10.2012

В данном случае значение выражения ++i равно 0, то есть false, поэтому сочетания клавиш и и последние выражения никогда не оцениваются.

person dmckee --- ex-moderator kitten    schedule 19.10.2012