beldmit: (Программизм)
[personal profile] beldmit
Вдогонку к этой
и немного этой записям. И еще немного к боковому хвосту у Витуса.

Один из типичных приемов собеседования с программистами - показ зубодробительной конструкции на языке, на котором собирается программировать соискатель, и вопрос, что она делает. Наиболее часто мне попадался C-шный пример, когда вместо переменной объявлялась функция.

Так вот, господа. Когда вам показывают такой пример (если он выходит за пределы разумного понимания языка и знания ключевых слов или общепринятых идиом), то скорее всего - одно из двух.

1. Собеседующий пытается срезать соискателя. То есть самоутвердиться. Вам нужен такой начальник?
2. Код реально используется в проекте? Вы действительно хотите это поддерживать?

Да, и главное, без чего пп.1-2 не действуют. Понимать, что предъявленный пример собой представляет - все-таки надо. Чтобы было ясно, что объявлена таки переменная, а не функция.

Date: 2009-03-04 05:37 pm (UTC)
From: [identity profile] slobin.livejournal.com
Компиляторы C существовали раньше стандарта. ;-)

Комментарий к проекту Американского Национального Стандарта по Информационным Системам. Язык программирования Си

3.3.2.4 Постфиксные операции увеличения и уменьшения

Комитет не одобрил практикующееся в некоторых реализациях рассмотрение выражений, построенных из префиксных и постфиксных операций, в качестве адресных значений.

Компилятор Turbo C 1.5 был именно таким, и я узнал, что это не соответствует стандарту, именно тогда, когда в Turbo C 2.0 это исправили. К сожалению, мне не удалось найти 1.5 ни в сети, ни в своих архивах, чтобы сейчас это подтвердить (2.0 валяется везде, 1.5 нигде нет).

... Нет, против жаворонков жабы - прелесть! ...

Date: 2009-03-04 07:48 pm (UTC)
From: [identity profile] gornal.livejournal.com
Хм.
Неужто правда?
Но всё равно пока верить не буду, это слишком разрушает мой мозг :-)

Date: 2009-03-04 08:43 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
а как вам такое:
int c=3;
int d=(++c)++;
printf("%d\n",d);

на C это не компилируется, зато на С++ - без проблем.

Date: 2009-03-04 09:08 pm (UTC)
From: [identity profile] slobin.livejournal.com
О! Пошли сравнения Си и плюсов! Тогда мой любимый вопрос: в конструкции

char s[] = "hello";

В плюсах (не в Си!) какого типа переменная s? Какого типа константа "hello"? Можно ли присваивать второе в первое? Почему компилятор не ругается?

... Жучки сами падают в него с дивной избирательностью ...

Date: 2009-03-04 09:20 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
тип s -- char[6]. никакого присваивания константы здесь нет, здесь инициализация массива (s[] = "foo" это шорткат для s[] = {'f', 'o', 'o'}). от С ничем не отличается.
чтобы получился вопрос про С vs С++ нужно написать char* s. (кстати, куда ставить пробел?)

Date: 2009-03-04 09:50 pm (UTC)
From: [identity profile] slobin.livejournal.com
Логично. Разница между s[] и *s -- это отдельная песня. Но ответ на исправленный вопрос меня всё равно восхищает.

... В Нуменор, в Арканар, в Зазеркалье, Заморье, Замостье ...

Date: 2009-03-04 09:00 pm (UTC)
From: [identity profile] slobin.livejournal.com
На тогдашнем уровне знания языка (двадцать лет назад) мне казалось естественным написать зацикленный счётчик вот так:

++ph %= 100;

И, пока программа собиралась полуторными турбо-сями, это работало! Сломалось только на вторых. Исходник даже сохранился (самая старая моя программа для PC платформы ;-), но, увы, в уже исправленном виде. Но я хорошо помню, что именно на этой строчке я научился, что так на самом деле делать нельзя.

... Оружие массовой победы ...

Date: 2009-03-04 09:29 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
это, однако, совсем не то же самое, что в исходном примере. там было ++(c++), а у вас (++ph) %= 100. последнее -- валиндый современный С++ (но не С).

Date: 2009-03-04 09:55 pm (UTC)
From: [identity profile] slobin.livejournal.com
Тоже правда. ++c -- lvalue, с++ -- нет. И даже понятно, почему. Что самое обидное в сях (в отличие от какого-нибудь лиспа) -- понимание таких вот тонкостей ничего не добавляет в плане практического написания программ.

... Зимой можно смелее учиться летать ...

Date: 2009-03-04 10:05 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
В сях (и особенно в плюсах) понимание таких вот тонкостей добавляет уверенности, что нужно писать на лиспе

Date: 2009-03-04 10:24 pm (UTC)
From: [identity profile] slobin.livejournal.com
На плюсах я писать просто не смог. Сломался, не справился, не осилил. А на чистых сях таких деталей не настолько много, чтобы они мешали жить. Даже если по глупости или незнанию написал непортабельный (на уровне языка) код, переделать его в правильный можно обычно одним локальным исправлением. На уровне библиотек или инклюдов -- хуже, но это совсем другая история.

P.S. Слышал историю, что идеальной проверялкой корректности сишных программ был советский ещё компилятор с сей для Эльбруса. Машина с аппаратной типизацией и аппаратным же контролем границ (никаких тупых указателей, только дескрипторы). Си строго по букве стандарта на ней реализовать можно, и это было сделано, но все сомнительные конструкции резались нещадно. Нашли массу ошибок в программах, годами работавших на более традиционных архитектурах.

... Прекрасный лунный день ...

Profile

beldmit: (Default)
Dmitry Belyavskiy

December 2025

S M T W T F S
 123456
78910111213
14151617181920
2122 2324252627
28 29 3031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 10th, 2026 02:52 pm
Powered by Dreamwidth Studios