![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Вот сходил я, С++-ник, на собеседование по .NET
И задали мне вопрос:
C точки зрения С++ получается 1, что я и скачал, но правильный ответ - 0 Я не совсем понимаю, почему. Был бы рад услышать объяснение СУВ, Kuvaldis Это сообщение отредактировал(а) Kuvaldis - 2.10.2007, 16:36 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 3 Всего: 149 |
Kuvaldis, ИМХО: сразу посылаешь их наф с таким вопросом и говоришь, что как захотели разработчики компилятора, так и будет!
Как получить ноль?.. Могу предположить, что в i += i++: 1) Берется сначала значение i (ноль) 2) Происходит инкремент (i=1) 3) Выполняется операция увеличения i (шарп собака, сохраняет старое значение i и берет его) на значение справа (ноль из первой строки). В общем еще один пример UB Удачи ;-) |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 3 Всего: 149 |
Еще момент:
эта строчка ведь эквивалентна строчке:
В результате которой никто не сомневается.... |
|||
|
||||
tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 36 Всего: 170 |
немного не так. - берется значение ноль (i) и к нему прибавляется ноль (временное значение, прочитанное из i). Результат сохранается в i (ноль) - инкрементируется временное значение, прочитанное из i (получается единица). т.е.
i=0 ![]() -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 3 Всего: 149 |
Пусть будет так ;-) (у меня есть вопросы и к твоему и к моему объяснению ![]() Это выражение можно и без дебагера подсчитать (о чем я и говорил) |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
tol05,
А откуда здесь временная переменная? Я пытаюсь разницу с С++ понять в данном вопросе. -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
NikeDeForest |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 15.9.2007 Репутация: 1 Всего: 2 |
[offtopic]
А там из спичек ничего не просили собрать? Чем они обоснуют такой вопрос? Тем, что такое можно встретить в коде их разработчиков? Тогда беги от туда, таким го*но месить, а не код писать. ![]() [/offtopic] Это сообщение отредактировал(а) NikeDeForest - 2.10.2007, 19:02 --------------------
Еще один вопрос ... |
|||
|
||||
tol05 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 36 Всего: 170 |
выражение
для меня означает: 1. возьми i 2. увеличь его на значение, равное i 3. присвой результат тому же i 4. после увеличения, инкрементируй "значение, равное i" (но не i) здесь смешались понятия постфиксной формы инкремента и операндов операций (все-таки то, что стоит слева от знака "=" - не то же самое, что стоит справа ![]() Непонятно? у меня тоже ![]() Проще всего разобраться как будут выглядеть операции в ассемблере. В ячейку, содержащую i, записывается результат сложения двух регистров. В регистр А записывается значение из ячейки i, в регистр В - такое же значение. Происходит сложение значений двух регистров, результат записывается в ячейку i и только потом значение регистра В инкрементируется. если бы было написано так:
тогда да, было бы увеличение i через правый операнд (который в данный момент равен i, но им не является). А потом - инкремент i. Потому что компилятор расшифровывает одинокое выражение i++ как i=i+1. Kuvaldis, я думаю, тебе стоит почитать стандарт ECMA-334, раздел 14.5.9 (postfix) и 14.6.5 (prefix) Там написано, что могут хотеть , а чего - нет ![]() NikeDeForest, это прекрасный вопрос, для проверки глубины понимания синтаксических конструкций. Я как-то на похожем вопросе засыпался. Тем более, ИМХО, бежать нужно не "оттуда", а "туда". Нужно считать расход памяти на операции потому что... В моем коде такое тоже можно встретить, и чем больше проходит времени, тем все чаще и чаще ![]() -------------------- На хорошей работе и сны хорошие снятся. |
||||||
|
|||||||
NikeDeForest |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 15.9.2007 Репутация: 1 Всего: 2 |
Код не должен содержать в себе такие конструкции, код должен быть легко и удобочитаемым.
Это микрооптимизация, которая должна быть обоснованна и документирована. При этом оптимизацию не проводят на первоначальном этапе конструирования, она проводится не на протяжении всего кода, а на критическом участке. А что по поводу того, что у тебя это почти везде подряд попадается, то без обид конечно, но имхо, это пижонство, которое не оценит тот, кто будет читать твой код. К тому же оптимизация на .НЕТ - это штука ненадежная. Хочу привести пример, но пора уже бежать. Через пару часов попробую, если не забуду. --------------------
Еще один вопрос ... |
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 1 Всего: 25 |
эээ ну в С++ стандарте насчет подобных примеров было ясно сказано, что будет неопределенность
и все на форумах давно обматерили тех, кто на собеседовании задает подобные вопросы. есть у кого ссылка на шарповский "стандарт", где эта ситуация обговорена? ато и здесь может стать анекдотичный вопрос. чему будет равно i:
Это сообщение отредактировал(а) Alek86 - 3.10.2007, 07:30 |
|||
|
||||
Kuvaldis |
|
||||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Alek86,
Как раз по поводу С++ здесь все понятно ИМХО По приоритету операции сначала идет ++ а потом +=. Причем никаких временных переменных нет. Поэтому и получается 1 Если проверять код
то получим 2, что говорит о том, что используется одна область памяти А вот про это
![]() tol05, Сиба за ссылку и объяснения, буду читать. Мое ИМХО: так писать низзя Еще в "Практике программирования" Керниган сказал, что размер в ущерб понятности ставить не желательно ![]() -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||||
|
|||||||
tol05 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 36 Всего: 170 |
я не виноват, если читать мой код посадят человека, не знающего синтаксиса языка. Это проблема тех, кто принял его на работу. Без обид.
Нужно читать любой код и читать правильно. Поэтому я "за" за существование таких вопросов в тесте. Нельзя так писать? а так
или
можно? Это читаемо? Просто инкремент и декремент выполняются быстрее, чем присваивание. Но вряд ли это кого-от беспокоит, кроме меня. Вряд ли Керниган имел в виду простейшие констукции ![]()
Да... И напишите письмо в команду разработчиков .Net 2.0, чтобы убрали из новой версии анонимные методы, итераторы и генерики. ![]() Это сообщение отредактировал(а) tol05 - 3.10.2007, 10:08 -------------------- На хорошей работе и сны хорошие снятся. |
||||||||||
|
|||||||||||
Rodman |
|
|||
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: нет Всего: 122 |
||||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 1 Всего: 25 |
я бы так не утверждал категорично... в сях есть такая вещь, как "точка следования", и по стандарту += не входит в те операторы, после которых она (точка) ставится. в С++ результат этого i += ++i; выражения неопределен потому и нужно посмотреть на стандарт C#, что там насчет этого говорится. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
про точки следования
а где можно посмотреть стандарт по С#? Не подскажешь? |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |