Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что получится в результате i++ + ++i + ++i, Вопрос на собеседовании 
:(
    Опции темы
azesmcar
Дата 12.3.2013, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения




Цитата(ZZZkoderZZZ @  12.3.2013,  11:41 Найти цитируемый пост)
Так есть ли конкретный ответ на все эти вопросы, или это всё таки undefined behavior?

Это UB, толко вот UB в данном случае этоо unspecified (не undefined, а unspecified) behavior. Другого ответа нет (по крайней мере правильного).

Разница все таки есть.
Цитата

unspecified behavior
behavior, for a well-formed program construct and correct data, that depends on the implementation.


Цитата

undefined behavior
behavior, such as might arise upon use of an erroneous program construct or erroneous data, for which this
International Standard imposes no requirements.

PM   Вверх
borisbn
Дата 12.3.2013, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону




Цитата(ZZZkoderZZZ @  12.3.2013,  11:41 Найти цитируемый пост)
Как ответить правильно? 

смотри мой самый первый ответ.

а если точнее, то (6.5 clause 2 of C language standard - обрати внимание - не Си++, а Си. В первом дольше искать)
Цитата
Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression.  Furthermore, the prior value
shall be read only to determine the value to be stored.

This paragraph renders undefined statement expressions such as
i = ++i + 1;


Ессно, никто в здравом уме не будет требовать от тебя знание номера раздела стандарта и точной формулировки, но если ты своими словами объяснишь, что это - UB, то ИМХО, этого д.б. достаточно


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 12.3.2013, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения




Цитата

Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual
expressions, and the order in which side effects take place, is unspecified.53) Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined. [Example:

Код

i = v[i++]; // the behavior is unspecified
i = 7, i++, i++; // i becomes 9
i = ++i + 1; // the behavior is unspecified
i = i + 1; // the value of i is incremented

PM   Вверх
ZZZkoderZZZ
Дата 12.3.2013, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 11.3.2013




Цитата(azesmcar @ 12.3.2013,  11:55)
Код

i = ++i + 1; // the behavior is unspecified

Здесь кажется всё ясно. Всё равно сначала инкрементировать, а потом прибавить 1, или сначала прибавить 1, а потом инкрементировать. Поэтому i в этой строке увеличится на 2.
PM MAIL   Вверх
azesmcar
Дата 12.3.2013, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения




Цитата(ZZZkoderZZZ @  12.3.2013,  12:10 Найти цитируемый пост)
Здесь кажется всё ясно

Вот именно, что нет.

Цитата(azesmcar @  12.3.2013,  11:55 Найти цитируемый пост)
the order of evaluation of operands of individual operators and subexpressions of individual
expressions, and the order in which side effects take place, is unspecified


PM   Вверх
ZZZkoderZZZ
Дата 12.3.2013, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 11.3.2013




Цитата(azesmcar @ 12.3.2013,  13:13)
Цитата(ZZZkoderZZZ @  12.3.2013,  12:10 Найти цитируемый пост)
Здесь кажется всё ясно

Вот именно, что нет.

Порядок выполнения не ясен, но при этом однозначный результат.
Код

int i=0;
i=++i+1;

При каком ходе выполнения здесь получится не 2 ?
PM MAIL   Вверх
bsa
Дата 12.3.2013, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия




Цитата(ZZZkoderZZZ @  12.3.2013,  14:49 Найти цитируемый пост)
При каком ходе выполнения здесь получится не 2 ?
Компилятор умеет оптимизировать код. Таким образом, фактическая запись i+1 после операции ++i может произойти после операции i = (i+1) + 1. В итоге результат будет i+1, например:
Код
mov ax,_i
inc ax
mov dx,1
add dx,ax
mov _i,dx
mov _i,ax

По стандарту, так писать нельзя. если ты так пишешь, то все риски берешь на себя.
PM   Вверх
sergioK1
Дата 12.3.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011




Цитата(ZZZkoderZZZ @ 12.3.2013,  10:41)
Цитата(sergioK1 @ 12.3.2013,  11:28)
Стандартный вопрос на интервью для жуниорской позиции,

Так есть ли конкретный ответ на все эти вопросы, или это всё таки undefined behavior?
Может быть будущий младший кодер-эникейщик должен привести ответы для MS и gcc со всеми комбинациями ключей? А далее при правильном ответе его спросят что будет, если в программе 100 потоков.
Как ответить правильно?
А если немного усложнить
Код

int i=0;
int array[3]={1,2,3};
std::cout <<  i << array[i++] << array[++i] << std::endl;
i=0;
std::cout <<  i << array[++i] << array[i++] << std::endl;
Выведутся одинаковые строки или разные, и почему?

читай про prefix/postfix, это то что требуют чтобы жуниор знал,
в той фирме и в других , 
если ты не знаешь это то дальше говорить c тобой никто не станет,




PM MAIL   Вверх
ZZZkoderZZZ
Дата 12.3.2013, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 11.3.2013




sergioK1

Я знаю что такое prefix/postfix.
 
Но должен ли я знать что выдаст приведенный некорректный пример и от чего зависит получение разных результатов?

Результатов там может быть много, и они зависят от компилятора, ключей компиляции, и еще много от чего. Даже в разных местах одной и той же программы этот пример может дать разные результаты - читайте http://lurkmore.to/%2B%2Bi_%2B_%2B%2Bi.
Код

int i=5,j=5;
i=++i+ ++i;
printf("i=%i  j=%i" ,i,++j+ ++j); //Вывод: i=14  j=13
 
И значит младший кодер-эникейщик должен рассмотреть все варианты? 
Какие же тогда требования к старшему кодеру?

Это сообщение отредактировал(а) ZZZkoderZZZ - 12.3.2013, 15:22
PM MAIL   Вверх
sQu1rr
Дата 12.3.2013, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london




Цитата(ZZZkoderZZZ @  12.3.2013,  15:16 Найти цитируемый пост)
Но должен ли я знать что выдаст приведенный некорректный пример и от чего зависит получение разных результатов? 

пример некорректен, но не потому что UB а потому что ты выходишь за пределы массива: 0 2 3 3 - запрашиваемые индексы

Извеняюсь, не заметил i = 0; в таком случае пример корректен, но строки будут разные, индексы: 0 2, 1 1. Забавно, что читал про постфикс/префикс и всеравно не знаешь что выведет программа.

Это сообщение отредактировал(а) sQu1rr - 12.3.2013, 15:23
PM MAIL Skype GTalk   Вверх
baldina
Дата 12.3.2013, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва




Цитата(ZZZkoderZZZ @  12.3.2013,  15:16 Найти цитируемый пост)
И значит младший кодер-эникейщик должен рассмотреть все варианты? 

нет. он просто не должен так писать. не говоря уже о старшем
PM MAIL   Вверх
azesmcar
Дата 12.3.2013, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения




Цитата(sQu1rr @  12.3.2013,  15:19 Найти цитируемый пост)
Забавно, что читал про постфикс/префикс и всеравно не знаешь что выведет программа.

А ты знаешь?
Ну и что выведет
Код

int i = 0;
std::cout << i++ << i++ << std::endl;

PM   Вверх
sQu1rr
Дата 12.3.2013, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london




Цитата(azesmcar @  12.3.2013,  15:52 Найти цитируемый пост)
А ты знаешь?
Ну и что выведет
код C++
1:
2:
int i = 0;
std::cout << i++ << i++ << std::endl;

Да, 01

Цитата

In C++, overloaded operators act like functions, and thus operators that have been overloaded introduce sequence points in the same way as function calls

ссылка

Стоп
Я что-то пропустил? Перечитываю

Это сообщение отредактировал(а) sQu1rr - 12.3.2013, 16:33
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 12.3.2013, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения




sQu1rr

Ну и что это нам дает?
Цитата

the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take  place, is unspecified

PM   Вверх
bsa
Дата 12.3.2013, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия




Цитата(sQu1rr @  12.3.2013,  17:32 Найти цитируемый пост)
Да, 01

странно. А у меня gcc при любых опциях компиляции выдает 10... Почему бы это?  smile 
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила раздела «Флейм»
Sneg0k

Добро пожаловать в «Флейм».

В разделе не действуют многие правила:

  • Можно оффтопить(умеренно)
  • Можно общаться на темы, не только связанные с программированием.

Строго запрещено:

  • Размещать рекламу
  • Обсуждать политику
  • Оскорблять друг-друга и переходить на личности
  • Наезжать, провоцировать других участников форума
  • Материться
  • Троллить

Напоминаем о существовании волшебной кнопочки "Репорт". Если вы увидели сообщение, несовместимое с жизнью, просьба подвести на нее курсор и клацнуть левой клавишей мышки. Тем самым вы сможете призвать злого, но жутко справедливого джина-модератора, который нашлет порчу на злостного нарушителя. Кстати - счётчик сообщений здесь не растёт.


Глас Винграда:


Глас Философии:


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Sneg0k

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Флейм | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.