Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> int i = 0; i += i++; Вопрос на собеседовании 
:(
    Опции темы
Kuvaldis
Дата 2.10.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

Репутация: 1
Всего: 61



Вот сходил я, С++-ник, на собеседование по .NET
И задали мне вопрос:
Код

 int i = 0;
 i += i++;    
// i = ?

C точки зрения С++ получается 1, что я и скачал, но правильный ответ - 0
Я не совсем понимаю, почему.
Был бы рад услышать объяснение

СУВ, Kuvaldis

Это сообщение отредактировал(а) Kuvaldis - 2.10.2007, 16:36


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
ivashkanet
Дата 2.10.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 3
Всего: 149



Kuvaldis, ИМХО: сразу посылаешь их наф с таким вопросом и говоришь, что как захотели разработчики компилятора, так и будет!

Как получить ноль?.. Могу предположить, что в i += i++:

1) Берется сначала значение i (ноль) 
2) Происходит инкремент (i=1)
3) Выполняется операция увеличения i (шарп собака, сохраняет старое значение i и берет его) на значение справа (ноль из первой строки).

В общем еще один пример UB 

Удачи ;-)

PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 2.10.2007, 17:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 3
Всего: 149



Еще момент:
эта строчка ведь эквивалентна строчке:
Код
i = i + i++;

В результате которой никто не сомневается....

PM MAIL WWW ICQ   Вверх
tol05
Дата 2.10.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Цитата(ivashkanet @  2.10.2007,  16:20 Найти цитируемый пост)
1) Берется сначала значение i (ноль) 
2) Происходит инкремент (i=1)
3) Выполняется операция увеличения i (шарп собака, сохраняет старое значение i и берет его) на значение справа (ноль из первой строки).

немного не так.
- берется значение ноль (i) и к нему прибавляется ноль (временное значение, прочитанное из i). Результат сохранается в i (ноль)
- инкрементируется временное значение, прочитанное из i (получается единица).

т.е.
Код

int i = 0;     //i=0
i += i++;      //i=i + tempInt, где  tempInt=0
               //tempInt = 1
// i = ?       //i=0

Код

i = i + i++;

i=0 smile можно в дебаггере посмотреть


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ivashkanet
Дата 2.10.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 3
Всего: 149



Цитата(tol05 @  2.10.2007,  17:35 Найти цитируемый пост)
немного не так.

Пусть будет так ;-) (у меня есть вопросы и к твоему и к моему объяснению smile )
Цитата(tol05 @  2.10.2007,  17:35 Найти цитируемый пост)
можно в дебаггере посмотреть 

Это выражение можно и без дебагера подсчитать (о чем я и говорил)
PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 2.10.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

Репутация: 1
Всего: 61



tol05
Цитата

 временное значение, прочитанное из i

А откуда здесь временная переменная?
Я пытаюсь разницу с С++ понять в данном вопросе. 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
NikeDeForest
Дата 2.10.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 2



[offtopic]
А там из спичек ничего не просили собрать? 
Чем они обоснуют такой вопрос? Тем, что такое можно встретить в коде их разработчиков? Тогда беги от туда, таким го*но месить, а не код писать. smile
[/offtopic]

Это сообщение отредактировал(а) NikeDeForest - 2.10.2007, 19:02
--------------------
Еще один вопрос ...
PM   Вверх
tol05
Дата 2.10.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Цитата(Kuvaldis @  2.10.2007,  18:42 Найти цитируемый пост)
А откуда здесь временная переменная?
Я пытаюсь разницу с С++ понять в данном вопросе.  

выражение 
Код

i += i++; 

для меня означает: 
1. возьми i
2. увеличь его на значение, равное i 
3. присвой результат тому же i
4. после увеличения, инкрементируй "значение, равное i" (но не i)

здесь смешались понятия постфиксной формы инкремента и операндов операций (все-таки то, что стоит слева от знака "=" - не то же самое, что стоит справа smile ).

Непонятно? 
Цитата(ivashkanet @  2.10.2007,  17:48 Найти цитируемый пост)
(у меня есть вопросы и к твоему и к моему объяснению smile )
у меня тоже  smile 
Проще всего разобраться как будут выглядеть операции в ассемблере.
В ячейку, содержащую i, записывается результат сложения двух регистров. В регистр А записывается значение из ячейки i, в регистр В - такое же значение. Происходит сложение значений двух регистров, результат записывается в ячейку i и только потом значение регистра В инкрементируется. 

если бы было написано так:
Код

i += i;
i++;

тогда да, было бы увеличение i через правый операнд (который в данный момент равен i, но им не является). А потом - инкремент i. Потому что компилятор расшифровывает одинокое выражение i++ как i=i+1.

Kuvaldis, я думаю, тебе стоит почитать стандарт ECMA-334, раздел 14.5.9 (postfix) и 14.6.5 (prefix)
Там написано, что могут хотеть 
Цитата(ivashkanet @  2.10.2007,  16:20 Найти цитируемый пост)
разработчики компилятора
, а чего - нет  smile 

NikeDeForest, это прекрасный вопрос, для проверки глубины понимания синтаксических конструкций. Я как-то на похожем вопросе засыпался. 
Цитата(NikeDeForest @  2.10.2007,  19:01 Найти цитируемый пост)
Тем, что такое можно встретить в коде их разработчиков? 
Тем более, ИМХО, бежать нужно не "оттуда", а "туда". Нужно считать расход памяти на операции потому что... 
В моем коде такое тоже можно встретить, и чем больше проходит времени, тем все чаще и чаще smile



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
NikeDeForest
Дата 3.10.2007, 05:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 2



Цитата

NikeDeForest, это прекрасный вопрос, для проверки глубины понимания синтаксических конструкций. Я как-то на похожем вопросе засыпался

Код не должен содержать в себе такие конструкции, код должен быть легко и удобочитаемым.

Цитата

Тем более, ИМХО, бежать нужно не "оттуда", а "туда". Нужно считать расход памяти на операции потому что... 
В моем коде такое тоже можно встретить, и чем больше проходит времени, тем все чаще и чаще smile

Это микрооптимизация, которая должна быть обоснованна и документирована. При этом оптимизацию не проводят на первоначальном этапе конструирования, она проводится не на протяжении всего кода, а на критическом участке.
А что по поводу того, что у тебя это почти везде подряд попадается, то без обид конечно, но имхо, это пижонство, которое не оценит тот, кто будет читать твой код.
К тому же оптимизация на .НЕТ - это штука ненадежная. Хочу привести пример, но пора уже бежать. Через пару часов попробую, если не забуду.


--------------------
Еще один вопрос ...
PM   Вверх
Alek86
Дата 3.10.2007, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 1
Всего: 25



эээ ну в С++ стандарте насчет подобных примеров было ясно сказано, что будет неопределенность
и все на форумах давно обматерили тех, кто на собеседовании задает подобные вопросы.

есть у кого ссылка на шарповский "стандарт", где эта ситуация обговорена?

ато и здесь может стать анекдотичный вопрос. чему будет равно i:

Код

 i = 5;
 i = i++ + ++i;


Это сообщение отредактировал(а) Alek86 - 3.10.2007, 07:30


--------------------
user posted image    user posted image
PM MAIL   Вверх
Kuvaldis
Дата 3.10.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

Репутация: 1
Всего: 61



Alek86
Цитата

эээ ну в С++ стандарте насчет подобных примеров было ясно сказано, что будет неопределенность

Как раз по поводу С++ здесь все понятно ИМХО
По приоритету операции сначала идет ++ а потом +=. Причем никаких временных переменных нет. Поэтому и получается 1
Если проверять код 
Код

i = 0;
i += ++i; 

то получим 2, что говорит о том, что используется одна область памяти

А вот про это 
Цитата
i = i++ + ++i;
 я согласен smile


tol05
Сиба за ссылку и объяснения, буду читать. Мое ИМХО: так писать низзя 
Еще в "Практике программирования" Керниган сказал, что размер в ущерб  понятности ставить не желательно smile


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
tol05
Дата 3.10.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Цитата(NikeDeForest @  3.10.2007,  05:52 Найти цитируемый пост)
имхо, это пижонство, которое не оценит тот, кто будет читать твой код.

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

Цитата(Kuvaldis @  3.10.2007,  08:51 Найти цитируемый пост)
Еще в "Практике программирования" Керниган сказал, что размер в ущерб  понятности ставить не желательно

Нужно читать любой код и читать правильно. Поэтому я "за" за существование таких вопросов в тесте.
Нельзя так писать? 
а так
Код

for(int i=0; ; i++)

или
Код

for(int i=0; ; ++i)

можно?
Это читаемо? 
Просто инкремент и декремент выполняются быстрее, чем присваивание. Но вряд ли это кого-от беспокоит, кроме меня.

Вряд ли Керниган имел в виду простейшие констукции smile У меня нет его под рукой, но я думаю, что он имел в виду что-то вроде этого:
Код

if(((MyArray)MyObject.GetValues()[0]).[2][i])...

Да... И напишите письмо в команду разработчиков .Net 2.0, чтобы убрали из новой версии анонимные методы, итераторы и генерики.  smile 

Это сообщение отредактировал(а) tol05 - 3.10.2007, 10:08


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Rodman
Дата 3.10.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



i++ - инкремен происходит после использования переменной! тогда и получается что прибавляется 0, 
Цитата(Kuvaldis @  2.10.2007,  16:08 Найти цитируемый пост)
C точки зрения С++ получается 1, что я и скачал, но правильный ответ - 0

Код

        int i = 0;
        i += i++;
        ShowMessage(IntToStr(i));
я вот в Билдере сделал, у меня 1 получилась!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Alek86
Дата 3.10.2007, 11:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 1
Всего: 25



Цитата(Kuvaldis @  3.10.2007,  08:51 Найти цитируемый пост)
Как раз по поводу С++ здесь все понятно ИМХО
По приоритету операции сначала идет ++ а потом +=. Причем никаких временных переменных нет. Поэтому и получается 1


я бы так не утверждал категорично... в сях есть такая вещь, как "точка следования", и по стандарту += не входит в те операторы, после которых она (точка) ставится.
в С++ результат этого   i += ++i;    выражения неопределен

потому и нужно посмотреть на стандарт C#, что там насчет этого говорится.


--------------------
user posted image    user posted image
PM MAIL   Вверх
skyboy
Дата 3.10.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 1
Всего: 260



Цитата(Kuvaldis @  3.10.2007,  07:51 Найти цитируемый пост)
Как раз по поводу С++ здесь все понятно ИМХО

про точки следования
Цитата(Alek86 @  3.10.2007,  10:16 Найти цитируемый пост)
потому и нужно посмотреть на стандарт C#, что там насчет этого говорится.

а где можно посмотреть стандарт по С#? Не подскажешь?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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