Есть вот такая задачка у некоторых работодателей в составе анкеты:
int a = 3;
int b = ++a++;
чему равно a? чему равно b?
--
Хотелось бы узнать корректность подобной записи ++a++?
Что возвращает ++a? (число?)
Что возвращает a++? (ссылку?)
В какой последовательности компилятор будет выполнять операторы в записи ++a++? (т.е. если слева на право, то компилироваться не должно, а если справа налево?)
Re: Помогите понять разобраться с постр(пре)инкрементами
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, mcast, Вы писали:
B>Иди в поиск, и укажи строку "++i++" — ссылок на данную тему вполне достаточно. B>Начать можно здесь
Пример содержит неопределенное поведение. Результат выражения не определен. ИМХО достаточно четкий ответ
По исходным вопросам:
M>Хотелось бы узнать корректность подобной записи ++a++?
Она некорректна.
M>Что возвращает ++a? (число?)
Возвращается lvalue (ссылка). Подробнее — 5.3.2/1.
M>Что возвращает a++? (ссылку?)
Возвращается rvalue (копия оригинального значения) Подробнее — 5.2.6/1.
M>В какой последовательности компилятор будет выполнять операторы в записи ++a++? (т.е. если слева на право, то компилироваться не должно, а если справа налево?)
Поскольку пример сожержит UB, то этот вопрос лишен смысла.
Любите книгу — источник знаний (с) М.Горький
Re: Помогите понять разобраться с постр(пре)инкрементами
Здравствуйте, mcast, Вы писали:
M>Есть вот такая задачка у некоторых работодателей в составе анкеты: M>int a = 3; M>int b = ++a++; M>чему равно a? чему равно b?
Правильный ответ: ничему. В этом случае бессмысленно говорить о значениях переменных a и b. Этот код ill-formed, реализация должна прервать трансляцию с выдачей диагностического сообщения.
M>Хотелось бы узнать корректность подобной записи ++a++?
Применительно к Вашему коду, эта запись некорректна.
M>Что возвращает ++a? (число?)
Результатом подвыражения ++a (если a имеет тип int) является lvalue.
M>Что возвращает a++? (ссылку?)
Результатом подвыражения a++ (если a имеет тип int) является rvalue.
M>В какой последовательности компилятор будет выполнять операторы в записи ++a++?
Это не имеет никакого отношения к последовательности выполнения. Речь идет только о лексическом анализе. В соответствии с грамматикой, подвыражение ++a++ будет разобрано как ++(a++). Т.к. операндом прединкремента должно быть modifiable lvalue, то код ill-formed.
M> (т.е. если слева на право, то компилироваться не должно, а если справа налево?)
Если в Ваш пример добавить скобки: (++a)++, то такой код будет well-formed. Но это ничего не изменит в плане его корректности, т.к. он будет иметь undefined behavior (подробности обсуждаются по приведенной здесь ссылке).
Re[3]: Помогите понять разобраться с постр(пре)инкрементами
Здравствуйте, mcast, Вы писали:
M>Хотелось бы узнать корректность подобной записи ++a++?
Ты уверен, что это С/С++?
Если да, то подробности очень простые
1) Тот кто проводит это собеседование лох
2) Он считает, что ты тоже лох
ИМХО возможных адекватных реакций, для чувака знающего язык две:
1) Сказать, что это не скомпилируется, а если расставить скобочки, чтобы скомпилировалось, то может делать что угодно. Сообщить, что ты считаешь неуважением к себе подобного уровня вопросы и если он продолжит задавать подобные глупые вопросы, то к UB перейдёшь уже ты, например оденешь бумажку с собеседованием ему на голову. При повторении подобной провокации угрозу прийдётся воплотить в жизнь
2) Уточнить зачем это у тебя спросили, и если действительно потому, что они любят издеваться над сотрудниками, и считают их всех идиотами, поблагодарить за потраченное время и уйти. Бумажку на кумпол вопрошателя всё равно можно надеть
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском