Помогите понять разобраться с постр(пре)инкрементами
От: mcast  
Дата: 17.12.07 13:09
Оценка:
Есть вот такая задачка у некоторых работодателей в составе анкеты:
int a = 3;
int b = ++a++;
чему равно a? чему равно b?
--
Хотелось бы узнать корректность подобной записи ++a++?
Что возвращает ++a? (число?)
Что возвращает a++? (ссылку?)
В какой последовательности компилятор будет выполнять операторы в записи ++a++? (т.е. если слева на право, то компилироваться не должно, а если справа налево?)
Re: Помогите понять разобраться с постр(пре)инкрементами
От: Bell Россия  
Дата: 17.12.07 13:15
Оценка:
Здравствуйте, mcast, Вы писали:

Иди в поиск, и укажи строку "++i++" — ссылок на данную тему вполне достаточно.
Начать можно здесь
Автор: tacit_one
Дата: 02.06.04
Любите книгу — источник знаний (с) М.Горький
Re[2]: Помогите понять разобраться с постр(пре)инкрементами
От: mcast  
Дата: 17.12.07 13:36
Оценка: :)
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, mcast, Вы писали:


B>Иди в поиск, и укажи строку "++i++" — ссылок на данную тему вполне достаточно.

B>Начать можно здесь
Автор: tacit_one
Дата: 02.06.04


Посмотрел уже. Четкого ответа так и не нашел!
Re[3]: Помогите понять разобраться с постр(пре)инкрементами
От: Bell Россия  
Дата: 17.12.07 14:09
Оценка:
Здравствуйте, mcast, Вы писали:

B>>Иди в поиск, и укажи строку "++i++" — ссылок на данную тему вполне достаточно.

B>>Начать можно здесь
Автор: tacit_one
Дата: 02.06.04


M>Посмотрел уже. Четкого ответа так и не нашел!


Пример содержит неопределенное поведение. Результат выражения не определен. ИМХО достаточно четкий ответ

По исходным вопросам:

M>Хотелось бы узнать корректность подобной записи ++a++?

Она некорректна.

M>Что возвращает ++a? (число?)

Возвращается lvalue (ссылка). Подробнее — 5.3.2/1.

M>Что возвращает a++? (ссылку?)

Возвращается rvalue (копия оригинального значения) Подробнее — 5.2.6/1.

M>В какой последовательности компилятор будет выполнять операторы в записи ++a++? (т.е. если слева на право, то компилироваться не должно, а если справа налево?)

Поскольку пример сожержит UB, то этот вопрос лишен смысла.
Любите книгу — источник знаний (с) М.Горький
Re: Помогите понять разобраться с постр(пре)инкрементами
От: elcste  
Дата: 17.12.07 14:19
Оценка:
Здравствуйте, 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]: Помогите понять разобраться с постр(пре)инкрементами
От: Sergey Россия  
Дата: 17.12.07 14:24
Оценка:
> B>Здравствуйте, mcast, Вы писали:
>
> B>Иди в поиск, и укажи строку "++i++" — ссылок на данную тему вполне достаточно.
> B>Начать можно здесь
Автор: tacit_one
Дата: 02.06.04

>
> Посмотрел уже. Четкого ответа так и не нашел!

Вот четкий ответ — программа, содержащая такую конструкцию, некорректна
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Кто виноват ясно. Теперь что делать :)
От: Erop Россия  
Дата: 17.12.07 22:37
Оценка: 1 (1) :)
Здравствуйте, mcast, Вы писали:

M>Хотелось бы узнать корректность подобной записи ++a++?


Ты уверен, что это С/С++?

Если да, то подробности очень простые
1) Тот кто проводит это собеседование лох
2) Он считает, что ты тоже лох

ИМХО возможных адекватных реакций, для чувака знающего язык две:
1) Сказать, что это не скомпилируется, а если расставить скобочки, чтобы скомпилировалось, то может делать что угодно. Сообщить, что ты считаешь неуважением к себе подобного уровня вопросы и если он продолжит задавать подобные глупые вопросы, то к UB перейдёшь уже ты, например оденешь бумажку с собеседованием ему на голову. При повторении подобной провокации угрозу прийдётся воплотить в жизнь

2) Уточнить зачем это у тебя спросили, и если действительно потому, что они любят издеваться над сотрудниками, и считают их всех идиотами, поблагодарить за потраченное время и уйти. Бумажку на кумпол вопрошателя всё равно можно надеть
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.