Re: Тест по базовому C++ -- интересно ваше мнение
От: Went  
Дата: 20.10.15 16:42
Оценка: 10 (2) +6
Здравствуйте, Tilir, Вы писали:
T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.
Я бы этот тест завалил — просто скомкал бы бумажку и ушел домой. Почему-то у меня за 10 лет работы с С++ никогда вопросов, связанных с тестовыми, не возникало. Возможно, потому что мне практически никогда не приходилось копаться в чужом говнокоде, вместо этого я писал программы для людей.
1. Тут все режет глаза. Не хочу разбираться в этом спагетти.
2. Здесь написана дичь, за такие записи нужно увольнять.
3. Оба варианта полезны по-своему, но первый устарел, потому что есть enum class.
4. Такие макросы в топку.
5. Запустить компилятор и проверить.
Re[5]: Тест по базовому C++ -- интересно ваше мнение
От: Ops Россия  
Дата: 22.10.15 11:45
Оценка: +7
Здравствуйте, Tilir, Вы писали:

T>Первая (нетривиальная) проблема -- это убедить их, что C++ вообще нужен. Для этого переход должен быть as smooth as possible. Сразу ошарашивать их контейнерами и итераторами -- создастся впечатление вообще другого языка. А это не так. Язык тот же, только с бубенцами.


Вообще-то язык другой, только с общими элементами и частично похожим синтаксисом. И убедить, что плюсы нужны, тренируя на кастах в С-стиле и макросах, это и правда сложная задача, уважаю.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: Тест по базовому C++ -- интересно ваше мнение
От: Went  
Дата: 20.10.15 20:07
Оценка: +4
Здравствуйте, Tilir, Вы писали:
T>Знаете, а по жизни в общем всем все равно на что вы надеетесь. В настоящем промышленном коде таких мест куда больше и они куда страшнее и не документировано обычно ничего. Почитайте код qemu, например. Какой-нибудь, скажем, армовский его фронтенд. И не готовить к этому студентов -- преступление перед юношеством. К тому же, конкретно на этот вопрос правильно ответили почти все.
Да, такие вещи бывают, я не спорю. Но тогда вам следовало назвать курс "чтение устаревшего С/С++ кода без использования компилятора", а уж никак не "базовый С++". Но это мое мнение, вы его просили — вы его получили
Re: Тест по базовому C++ -- интересно ваше мнение
От: Pavel Dvorkin Россия  
Дата: 21.10.15 14:24
Оценка: 5 (1) +1
Здравствуйте, Tilir, Вы писали:

Я когда-то сдавал тест по С на brainbench (когда он еще был tekmetriks, а тест был бесплатный). Давно это было, в прошлом веке. Опыт программирования на С на от момент — лет 5-7.

Весьма похоже. Та же попытка ловить на всяких buffer overrun, других видах UB , знании мельчайших подробностей синтаксиса, хитроумных конструкциях и т.п.

Основной вопрос — на кого это рассчитано ? Если на человека,который давно уже программирует на С, то этот тест имеет право на существование. Пусть он сам себя проверит, в состоянии ли он найти тут подвох. Он во все эти ситуации, несомненно, и сам не раз попадал, и из них выпутывался, ну вот пусть и оценит.

А вот дл обучения — ИМХО совершенно не годится. Так можно только всякий интерес отбить. Учить надо, как тут уже писали, тем средствам, которые в языке реально применяются.
With best regards
Pavel Dvorkin
Re[4]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.10.15 19:38
Оценка: +2
Здравствуйте, Went, Вы писали:

W> И я очень надеюсь, что все такие места в промышленном коде будут структурированы и тщательно документированы, мол "мы делаем эту дичь потому-то и потому-то, тут делается то-то, а там — то-то."


Знаете, а по жизни в общем всем все равно на что вы надеетесь. В настоящем промышленном коде таких мест куда больше и они куда страшнее и не документировано обычно ничего. Почитайте код qemu, например. Какой-нибудь, скажем, армовский его фронтенд. И не готовить к этому студентов -- преступление перед юношеством. К тому же, конкретно на этот вопрос правильно ответили почти все.
Re: Тест по базовому C++ -- интересно ваше мнение
От: mavrii  
Дата: 22.10.15 22:14
Оценка: +2
Странный тест — весь о том как делать не надо. В первом вопросе очень вольные допущения об архитектуре. И конечно студенты не будут знать как надо делать чтобы все работало везде. Из второго примера — врядли он нужен. Опять пример как не надо. Я с такими crazy определениями не разу не встречался. Можете еще написать определение фу-ии на два экрана — и спросить а что там написано. Все вопросы про то как делать не надо. Я бы задавал вопросы по типу чем printf формат лучше хуже cout. Объясните в каких случаях что лучше использовать. Почему?
Re: Тест по базовому C++ -- интересно ваше мнение
От: 0BD11A0D  
Дата: 24.10.15 08:00
Оценка: :))
Здравствуйте, Tilir, Вы писали:

T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.


Прэлэстно. Поискал глазами правильный вариант «Разборчивый пишет докладную на .удаков директору Жопоразрываеву», но не нашел.
Re: Тест по базовому C++ -- интересно ваше мнение
От: Abyx Россия  
Дата: 20.10.15 19:07
Оценка: 8 (1)
Здравствуйте, Tilir, Вы писали:

T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.


Очень режет глаза "main(void)" — в отличе от Си, в С++ так не пишут.
Также там есть
template <typename T, typename U> void 
swap (T& t, U& u)

вот зачем ставить тип возвращаемого значения после template<> ? это не Си где тип результата не входит в сигнатуру функции


1) правильный ответ — "разыменование d — это UB".
Можно сделать каст к [unsigned] char* и разыменовать, но не к short*.
Даже если сделать unsigned char, и d[0] + 256*d[1] + 65786*..., то будет implementation defined, хотя бы изза существования big endian

2) ок

3) не надо учить разбирать такой код, для этого есть http://cdecl.org
достаточно знать что в 1й строчке массив[], а во второй функция()

4) ок

5) тут бы не enum , а enum class

6, 7) зачем этот ад?

8) зачем знать есть ли op< у указателя на функцию, или его нет?

9, 10) в чем смысл этого вопроса? что нельзя слепо кастовать всё подряд? или что массивы не присваиваются?


Вобщем это какой-то очень странный выбор вопросов по "базовому С++". Базовый С++ гораздо больше.
In Zen We Trust
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Abyx Россия  
Дата: 20.10.15 20:57
Оценка: 8 (1)
Здравствуйте, Tilir, Вы писали:

A>>1) правильный ответ — "разыменование d — это UB".

A>>Можно сделать каст к [unsigned] char* и разыменовать, но не к short*.

T>С чего бы это было UB? Приведение адреса к адресу, типы целочисленные, "An object pointer can be explicitly converted to an object pointer of a different type" (5.2.10-7) и так далее. Мне правда интересно. Я переформулирую вопрос на массивы если это и впрямь так.


потому что это нарушает правила aliasing'а.

В стандарте С++ это есть в [basic.lval] p10
> If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:
> — the dynamic type of the object,
> ...
> — a char or unsigned char type.
И внизу сноска
> *) The intent of this list is to specify those circumstances in which an object may or may not be aliased.

То есть конечно кастовать можно в любой тип. Но обращаться к члену нельзя (в вычисляемом контексте).

Ну и это не снимает проблему с implementation-defined представлением int.
In Zen We Trust
Отредактировано 20.10.2015 20:58 Abyx . Предыдущая версия .
Re[4]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 21.10.15 03:15
Оценка: 8 (1)
Здравствуйте, Abyx, Вы писали:

A>э? но в чем там разница?

A>decltype("Apple") a = "Apple"; // const char a[6] = "Apple";

Да, и поэтому Q10 даже не скомпилируется. Но при этом если бы там стояло

auto a = "Apple"; // const char *a = "Apple";

и то же для Pear, то ошибки бы не было. К ошибке компиляции тут приводит именно то, что decltype старается точно сохранить тип, а типы const char[6] и const char[5] не приводимы друг к другу.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: B0FEE664  
Дата: 21.10.15 16:18
Оценка: 8 (1)
Здравствуйте, Tilir, Вы писали:

BFE>>И, разумеется, вы понимаете, что в Q8 правильный ответ: "4) Даже не скомпилируется"?;

T>Очень интересно. По какой же причине это может не скомпилироваться?

У функции int foo() отсутствует return
И каждый день — без права на ошибку...
Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.10.15 14:46
Оценка: 5 (1)
Hi,

Продолжаю в свободное от работы время немножко преподавать.

Студенты написали (и довольно неплохо) первый в этом году тест, после шести первых лекций, посвященных базовому C++ (всё что можно рассказать человеку со знанием C, не рассказывая ничего про ООП -- включая простые шаблоны функций и decltype/auto).

В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.

UPD: Всем спасибо, как я понял, профессиональное коммьюнити сочло тест скорее неудачным. Я всех прочитал и скорее всего я учел ваше мнение, даже если по моему ответу вам кажется, что это не так. Я склонен свернуть дальнейшее обсуждение со своей стороны, поскольку в общем мне всё ясно по заданному вопросу.

---
With best regards, Konstantin
Отредактировано 24.10.2015 20:35 Tilir . Предыдущая версия .
Re[8]: Тест по базовому C++ -- интересно ваше мнение
От: Evgeny.Panasyuk Россия  
Дата: 24.10.15 13:19
Оценка: 3 (1)
Здравствуйте, enji, Вы писали:

E>Не, стоп. private — просто модификатор доступа. При чем тут вообще расположение? На расположение влияют наследование / виртуальные методы, но не квалификаторы доступа же


C++98:

Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of nonstatic data members separated by an access-specifier is unspecified

Re[10]: Тест по базовому C++ -- интересно ваше мнение
От: Evgeny.Panasyuk Россия  
Дата: 25.10.15 15:54
Оценка: 3 (1)
Здравствуйте, enji, Вы писали:

E>хм, а не знаешь, зачем так сделали?


Не знаю. Основное предположение: позволить компиляторам делать какие-нибудь оптимизации, например минимизацию потерь на alignment.
Re: Тест по базовому C++ -- интересно ваше мнение
От: ArtK  
Дата: 20.10.15 15:14
Оценка: 2 (1)
Здравствуйте, Tilir, Вы писали:

Моё ИМХО:
Кажется этот тест скорее по "Си с классами"
Много вопросов про указатели, макросы, printf-ы, но нет например вопросов специальные функции (конструкторы, деструкторы, операторы переноса или копирования), про STL алгоритмы, про безопасность исключений (хотя спорно), про RAII, и всего что про "современный C++".
Мне кажется этот доклад имеет смысл посмотреть:
http://www.youtube.com/watch?v=YnWhqhNdYyk
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Evgeny.Panasyuk Россия  
Дата: 21.10.15 08:01
Оценка: 2 (1)
Здравствуйте, sergz, Вы писали:

S>Если же это сродни абсрактному чтению Страуструпа (там тоже в конце каждой главы списочек занимательных вопросов), то это кошмар.


У Страуструпа есть книга для новичков — Programming -- Principles and Practice Using C++ — там никакого "C First". Например std::vector вводится на ~100 странице, а new/delete на ~500 — в середине книги.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Went  
Дата: 20.10.15 19:04
Оценка: +1
Здравствуйте, Tilir, Вы писали:
T>Мне просто интересно, как вы думаете, GCC это программа для людей или нет? =)
Ну, вы не совсем корректно ставите вопрос. GCC (если вы по GNU-компилятор) — это очень сложное, долго эволюционирующее приложение, в котором, наверняка, есть и более ужасные извраты, нежели те, что вы привели. И, думаю, часть из них даже оправдана — или вопросами производительности, или необходимостью поддержки старого кода. Но зачем это студентам? Я сомневаюсь, что даже специалист, вооруженный компилятором, глянув на эту лапшу, сразу сориентируется в происходящем. И я очень надеюсь, что все такие места в промышленном коде будут структурированы и тщательно документированы, мол "мы делаем эту дичь потому-то и потому-то, тут делается то-то, а там — то-то."
Re: Тест по базовому C++ -- интересно ваше мнение
От: Лось Чтостряслось СССР  
Дата: 21.10.15 09:38
Оценка: +1
Здравствуйте, Tilir, Вы писали:

T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.


имена у студентов зачетные — такие флотские
социализм или варварство
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 22.10.15 08:52
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Основной вопрос — на кого это рассчитано ? Если на человека,который давно уже программирует на С, то этот тест имеет право на существование. Пусть он сам себя проверит, в состоянии ли он найти тут подвох. Он во все эти ситуации, несомненно, и сам не раз попадал, и из них выпутывался, ну вот пусть и оценит.


У меня был, кстати, вариант теста по языку C, который я передумал давать студентам, потому что получилось действительно на профессионала (с моей точки зрения). Поэтому я могу вам показать как я себе представляю тест для профессионала. Как-то так.

А исходный тестик в топике ни у кого интерес не отбивает. Как раз наоборот, студенты с энтузиазмом лезут в закоулки языка, ещё и оттаскивать приходится. И потом, когда начинаются действительно сложные вещи, связанные с ООП и шаблонами, где ловушек куда больше и они гораздо менее бесхитростны, у ребят уже накоплен опыт исследования, позволяющий разбираться в таких вещах и не бояться их.

Короче developers born brave, а тут на RSDN, как я погляжу, этот дух утерян.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Evgeny.Panasyuk Россия  
Дата: 22.10.15 10:07
Оценка: +1
Здравствуйте, Tilir, Вы писали:

T>А исходный тестик в топике ни у кого интерес не отбивает. Как раз наоборот, студенты с энтузиазмом лезут в закоулки языка, ещё и оттаскивать приходится. И потом, когда начинаются действительно сложные вещи, связанные с ООП и шаблонами, где ловушек куда больше и они гораздо менее бесхитростны, у ребят уже накоплен опыт исследования, позволяющий разбираться в таких вещах и не бояться их.


T>Короче developers born brave, а тут на RSDN, как я погляжу, этот дух утерян.


Основаная проблема в "C First" подходе (или подобных) не в том что изучаются какие-то тёмные закоулки, а в том что они изучаются с самого начла.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: T4r4sB Россия  
Дата: 22.10.15 11:28
Оценка: +1
Здравствуйте, Tilir, Вы писали:

T>У меня был, кстати, вариант теста по языку C, который я передумал давать студентам, потому что получилось действительно на профессионала (с моей точки зрения). Поэтому я могу вам показать как я себе представляю тест для профессионала. Как-то так.


Блин, он проще
Re[4]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 22.10.15 18:16
Оценка: :)
Здравствуйте, VTT, Вы писали:

VTT>Мне кажется, что пописав на С в ООП стиле (и осознав пользу от этого) переход на С++ с его встроенной поддержкой ООП сразу даст почувствовать комфорт (относительный).


Пописав на C в ООП-стиле (GTK и всё такое) можно только возненавидеть ООП, ничего больше. Я в лекциях (уже в разделе ООП) разбираю реализацию виртуальных функций на C, но в этом году я планирую выкинуть это место из лекций. Оно слишком ужасно даже на мой вкус.

C++ ради ООП (и я объясняю это своим студентам) приносит две жертвы, и это очень серьёзные жертвы.

Во-первых C++ жертвует гарантией сохранности имен в ассемблере целевой архитектуры. Это позволяет делать функции функциями-членами. А кроме того позволяет пространства имён, перегрузку, шаблоны функций и прочие вытребеньки.
Во-вторых C++ жертвует гарантиями по расположению полей структуры в памяти. Это позволяет вводить private и protected данные.

Обе эти жертвы можно не приносить, если ограничиваться extern "C" функциями и POD-типами.

Но если они принесены, мы должны осознавать что именно мы получаем взамен. Мы получаем полноценное ООП.

Именно поэтому, когда меня спрашивают что самое главное Строструп добавил в C, я всегда отвечаю: он не добавил. Он выкинул две важнейшие гарантии этого языка. Остальное после этого получилось само и ООП -- только частный случай того, что получилось.
Re: Тест по базовому C++ -- интересно ваше мнение
От: VTT http://vtt.to
Дата: 20.10.15 15:14
Оценка:
дежавю однако
Автор: VTT
Дата: 13.03.15


В целом в тесте почти везде намешан неприкрытый С. Первые два вопроса — чистый С, даже без намека на С++.

char *(*(**foo[][8])())[] = { 0 };
void myfunction(char *(*(**foo[][8])())[]);

После такого у студентов охота осваивать С++ не пропадает?

Да, и почему вы выделяете ООП как фичу С++? ООП и на чистом С можно успешно применять (хоть и не так удобно).
Человек со знанием С, но без знания ООП, наверняка начнет пилить тот самый "С с классами".

ЗЫ

не специфицирован

лучше писать "не определен"
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 20.10.2015 15:25 VTT . Предыдущая версия . Еще …
Отредактировано 20.10.2015 15:21 VTT . Предыдущая версия .
Re: Тест по базовому C++ -- интересно ваше мнение
От: T4r4sB Россия  
Дата: 20.10.15 16:18
Оценка:
Здравствуйте, Tilir, Вы писали:

программировать? с typedef, забил которой хренатень, читать Как умение улиточную автор зачем-то на связано умением

  Скрытый текст
читать по правилу улитки
Отредактировано 20.10.2015 16:18 T4r4sB . Предыдущая версия .
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.10.15 18:49
Оценка:
Здравствуйте, ArtK, Вы писали:

AK>Кажется этот тест скорее по "Си с классами"


Вы неправы с точностью до наоборот. Это "C++ БЕЗ классов".
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.10.15 18:52
Оценка:
Здравствуйте, Went, Вы писали:

W>Возможно, потому что мне практически никогда не приходилось копаться в чужом говнокоде, вместо этого я писал программы для людей.


Мне просто интересно, как вы думаете, GCC это программа для людей или нет? =)
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.10.15 18:56
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>дежавю однако
Автор: VTT
Дата: 13.03.15


Да, я имею обыкновение выкладывать свои материалы здесь. И что? Хороший форум, всегда можно услышать много интересного =))

VTT>Да, и почему вы выделяете ООП как фичу С++?


Не выделяю. Но им никто никогда не читал ООП. Вот я и начну. Но сначала заполировать то C-подмножество которое они уже знают, научить использовать enum и const, шаблоны и inline, отучить от препроцессора -- полезная грунтовка холста.
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.10.15 19:55
Оценка:
Здравствуйте, Abyx, Вы писали:

A>вот зачем ставить тип возвращаемого значения после template<> ? это не Си где тип результата не входит в сигнатуру функции


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

A>1) правильный ответ — "разыменование d — это UB".

A>Можно сделать каст к [unsigned] char* и разыменовать, но не к short*.

С чего бы это было UB? Приведение адреса к адресу, типы целочисленные, "An object pointer can be explicitly converted to an object pointer of a different type" (5.2.10-7) и так далее. Мне правда интересно. Я переформулирую вопрос на массивы если это и впрямь так.

A>5) тут бы не enum , а enum class


Там упомянута возможность enum class в одном из аргументов. Увы, штука это пока малоизвестная, в реальной жизни редко встречающаяся, и я решил разобрать лучше просто enum'ы. Возможно тут надо пересмотреть скорее сам курс, чем тест.

A>6, 7) зачем этот ад?


Идея в том, чтобы наглядно продемонстрировать, что препроцессор в этом случае -- плохая замена шаблонам.

A>8) зачем знать есть ли op< у указателя на функцию, или его нет?


Важно понимание что вообще такое указатель на функцию физически и что функции могут как угодно лечь при линковке.

A>9, 10) в чем смысл этого вопроса? что нельзя слепо кастовать всё подряд? или что массивы не присваиваются?


В том чтобы понять разницу вывода типов auto и decltype.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Abyx Россия  
Дата: 20.10.15 21:05
Оценка:
Здравствуйте, Tilir, Вы писали:

A>>9, 10) в чем смысл этого вопроса? что нельзя слепо кастовать всё подряд? или что массивы не присваиваются?


T>В том чтобы понять разницу вывода типов auto и decltype.


э? но в чем там разница?
decltype("Apple") a = "Apple"; // const char a[6] = "Apple";
swap(a, p); // вызывается void swap(const char (&t)[6], const char (&u)[5])
auto tmp = t; // const char* tmp = t; // происходит двойное преобразование T(&)[] -> T[] -> T*
t = (T) u; // t = (const char[5]) u;
тут я уже не знаю что будет, никогда так не делал. наверное каст не скомпилируется
In Zen We Trust
Re: Тест по базовому C++ -- интересно ваше мнение
От: sergz  
Дата: 21.10.15 00:08
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Hi,


T>Продолжаю в свободное от работы время немножко преподавать.


T>Студенты написали (и довольно неплохо) первый в этом году тест, после шести первых лекций, посвященных базовому C++ (всё что можно рассказать человеку со знанием C, не рассказывая ничего про ООП -- включая простые шаблоны функций и decltype/auto).


T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.


T>---

T>With best regards, Konstantin

Что пользователи этого форума могут сделать, чтобы спасти студентов? Вообще говоря, первые два задания могут сильно деморализовать.

А если серьезно, то недостаточно информации. С одной стороны тест несложный, но с другой стороны это может быть кошмар.

Не зная деталей и рассчитывая на самое худшее, я бы сказал так:

Этот тест вместе с вариантами ответов можно показывать и как учебный материал, а не давать как тест. Видите, дорогие студенты, сколько тут вопросов сложных появляется, значит это говнокод, и так писать не надо. Скорее надо поднять вопрос о том где взять ресурсы, чтобы это исправить и как впредь такого в проекте не допускать.

Для контроля знаний и чтобы показать, что стандарт и всякие толстые книги типа Страуструпа не так уж и страшны, лучше дать каждому по более-менее реальной задачке и потом побеседовать по коду, что там не так или так, провести ревью, показать куда копать с примерами ссылок (на стандарт, а так же на что-нибудь интересное, например, http://www.viva64.com/) и попросить улучшить. Скорее всего, это легче сделать в формате семинаров.
Если же это сродни абсрактному чтению Страуструпа (там тоже в конце каждой главы списочек занимательных вопросов), то это кошмар. Немного попрактиковавшись под руководством хорошего программиста любой нормальный человек и вопросы такие не придумает.

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

Так же боюсь, что все просто всё забудут через пару лет. Те, кто не работает на С++ просто забудут, а те, кто работает все равно полезут проконсультироваться со стандратом и т.п.

Ну и на последок, а вообще говоря, есть ли тут правильные ответы, и если есть, то сколько их? Во-первых, существуют разные стандарты C++, разные компиляторы, которые как правило отдельно оговаривают некоторые подобные случаи, об этом ничего не сказано в задании. Во-вторых, существуют разные стандарты по качеству и оформлению кода, там тоже всякое бывает.
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 21.10.15 03:04
Оценка:
Здравствуйте, sergz, Вы писали:

S>Для контроля знаний и чтобы показать, что стандарт и всякие толстые книги типа Страуструпа не так уж и страшны, лучше дать каждому по более-менее реальной задачке и потом побеседовать по коду, что там не так или так, провести ревью, показать куда копать с примерами ссылок


Это называется домашняя работа и она тоже есть. Но контроль знаний она не обеспечивает. Я всё-таки преподаю язык а не программирование. Разница -- примерно как между изучением русского языка и русской литературы. Вас же не смущают тесты по русскому языку со всякой упоротой расстановкой запятых и странным написанием гласных/согласных в неожиданных местах ( пример: http://www.examen.ru/add/tests/test )? Ну вот и это такой тест, только по С++.

S>Ну и на последок, а вообще говоря, есть ли тут правильные ответы, и если есть, то сколько их?


Вот это уже может быть началом интересной беседы. Например ув. Abyx высказал серьёзную правку по Q1, где оказывается (возможно) притаилось UB, которого я не заметил, поскольку по новому стандарту сделали более строгие требования к strict aliasing. Отличное замечание и я конечно поправлю тест, чтобы это убрать. Но так вообще я старался тщательно использовать нормативные документы при составлении вопросов и ответов. Так что если что заметили -- то смело говорите =)
Re[4]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 21.10.15 03:09
Оценка:
Здравствуйте, Abyx, Вы писали:

A>потому что это нарушает правила aliasing'а.


Очень интересно, спасибо. Я всегда думал о SA как о способе дать понять, что существенно разные типы (такие как int и float) не могут алиасится указателем, что позволяет компилятору двигать код вокруг таких обращений, но не int и short же. Боюсь такое ужесточение делает UB из половины работающего в этом мире кода, но ок, учту.
Re: тестировать надо с помощью acm.mipt.ru/judge или им подобном
От: Salih  
Дата: 21.10.15 07:27
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Hi,


T>Продолжаю в свободное от работы время немножко преподавать.


T>Студенты написали (и довольно неплохо) первый в этом году тест, после шести первых лекций, посвященных базовому C++ (всё что можно рассказать человеку со знанием C, не рассказывая ничего про ООП -- включая простые шаблоны функций и decltype/auto).


T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.


T>---

T>With best regards, Konstantin

проверка знания теории, да ещё по тестам с вариантами ответов, это ничто,
по сравнению с решениями конкретных задач
http://acm.mipt.ru/judge/problems.pl?lang=ru&amp;CGISESSID=504ef02531f1c6e7db5f27f76ce7bcaf
Re[2]: тестировать надо с помощью acm.mipt.ru/judge или им подобном
От: Tilir Россия http://tilir.livejournal.com
Дата: 21.10.15 07:52
Оценка:
Здравствуйте, Salih, Вы писали:

S>проверка знания теории, да ещё по тестам с вариантами ответов, это ничто,

S>по сравнению с решениями конкретных задач
S>http://acm.mipt.ru/judge/problems.pl?lang=ru&amp;CGISESSID=504ef02531f1c6e7db5f27f76ce7bcaf

Для решения любой конкретной задачи такого уровня достаточно базового знания C. Проверить знание конкретных особенностей языка, причём особенностей нетривиальных ("как отличается вывод типа auto от decltype"), таким образом нельзя.

P.S. И зачем пользоваться этим самопальным ужасом, если есть, скажем, project euler, если уж хочется набрать задачек поинтересней.
Re: Тест по базовому C++ -- интересно ваше мнение
От: B0FEE664  
Дата: 21.10.15 09:56
Оценка:
Здравствуйте, Tilir, Вы писали:

T>В связи с чем хочу выложить этот тест для местной общественности. Может будут какие-нибудь предложения, замечания, всё такое.


Текст у вас какой-то не связный. Например: "Примечание: в принципе его можно заставить работать для всех этих типов серией промежуточных typedef. "
Пропущено 'с помощью'?

"заголовочник" — это официальный термин?

И, разумеется, вы понимаете, что в Q8 правильный ответ: "4) Даже не скомпилируется"?;


И вообще, примеры кода настолько ужасны, что их хочется не решать, а просто выкинуть.
И каждый день — без права на ошибку...
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 21.10.15 13:40
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>И, разумеется, вы понимаете, что в Q8 правильный ответ: "4) Даже не скомпилируется"?;


Очень интересно. По какой же причине это может не скомпилироваться?
Re[4]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 22.10.15 04:35
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>У функции int foo() отсутствует return


Отличное наблюдение, спасибо =) Исходно там была main, return не был нужен и я забыл поставить, когда переделал на foo. Поправлю.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: VTT http://vtt.to
Дата: 22.10.15 06:54
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Да, я имею обыкновение выкладывать свои материалы здесь. И что? Хороший форум, всегда можно услышать много интересного =))


Суть в том, что мой комментарий к вашему предыдущему тесту по большей части можно отнести и к этому. Снова "представьте, что вы — компилятор" и переменные из 1 буквы.

VTT>>Да, и почему вы выделяете ООП как фичу С++?


T>Не выделяю. Но им никто никогда не читал ООП. Вот я и начну. Но сначала заполировать то C-подмножество которое они уже знают, научить использовать enum и const, шаблоны и inline, отучить от препроцессора -- полезная грунтовка холста.


Мне кажется, что пописав на С в ООП стиле (и осознав пользу от этого) переход на С++ с его встроенной поддержкой ООП сразу даст почувствовать комфорт (относительный).
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[4]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 22.10.15 10:37
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Основаная проблема в "C First" подходе (или подобных) не в том что изучаются какие-то тёмные закоулки, а в том что они изучаются с самого начла.


Язык C гораздо проще и студенты ему уже научены, написали на C много программ и вообще он им нравится. И, кстати, мне сишечка тоже очень нравится.

Первая (нетривиальная) проблема -- это убедить их, что C++ вообще нужен. Для этого переход должен быть as smooth as possible. Сразу ошарашивать их контейнерами и итераторами -- создастся впечатление вообще другого языка. А это не так. Язык тот же, только с бубенцами.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Pavel Dvorkin Россия  
Дата: 22.10.15 11:08
Оценка:
Здравствуйте, Tilir, Вы писали:

T>А исходный тестик в топике ни у кого интерес не отбивает. Как раз наоборот, студенты с энтузиазмом лезут в закоулки языка, ещё и оттаскивать приходится. И потом, когда начинаются действительно сложные вещи, связанные с ООП и шаблонами, где ловушек куда больше и они гораздо менее бесхитростны, у ребят уже накоплен опыт исследования, позволяющий разбираться в таких вещах и не бояться их.


Я с самой концепцией вполне согласен. С++ — не C# и не Ява, чтобы писать только с помощью STL, а от указателей шарахаться как черт от ладана. Писать без указателей, конечно, можно, и можно философствовать о том, что с голыми указателями сейчас не пишут, но если все же эти указатели не понимать, и не знать основ С, то эти указатели однажды все равно вылезут боком для этого С++ — программиста.

T>Короче developers born brave, а тут на RSDN, как я погляжу, этот дух утерян.


Не на RSDN. Гораздо шире.

Когда я читаю порой то, что пишут о безопасности средств языка — у меня складывается впечатление, что основной задачей является не написать программу, а , упаси бог, не сделать ошибку.
With best regards
Pavel Dvorkin
Re[6]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 22.10.15 18:26
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Вообще-то язык другой, только с общими элементами и частично похожим синтаксисом. И убедить, что плюсы нужны, тренируя на кастах в С-стиле и макросах, это и правда сложная задача, уважаю.


Вообще-то C включен в C++ по нормативной ссылке. Увы для ваших фантазий, но это по определению ISO тот же язык, только с некоторыми дополнительными возможностями. И человеку, который до этого год писал на макросах, нужно внятно объяснить чем шаблоны лучше макросов -- для этого сравнив их с макросами. Также объяснить чем константы и перечисления лучше макросов, объяснить зачем нужны пространства имён (и убедить что они вообще нужны, помню самого себя мне пришлось в этом убеждать около года), etc.

Что до кастов, то тут работает моя привычка объяснять вещи цельными кусками, чтобы не сбиваться на мелочи. Я объясняю все касты сразу -- но только к тому моменту, когда студенты готовы понять что такое dynamic_cast (самый сложный из всех). Так что это в будущем. Недельки через три-четыре доползем, я полагаю. Аналогично new/delete вместо malloc/free/realloc я объясняю не раньше, чем студенты становятся способны осознать все десять отличий первого от второго.
Re[7]: Тест по базовому C++ -- интересно ваше мнение
От: T4r4sB Россия  
Дата: 22.10.15 18:46
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Увы для ваших фантазий, но это по определению ISO тот же язык, только с некоторыми дополнительными возможностями.


Меня к фантазёрам добавь. Это разные языки. В топку определения, важно то, что на них пишется всё по-разному.
Re[7]: Тест по базовому C++ -- интересно ваше мнение
От: Ops Россия  
Дата: 22.10.15 20:19
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Вообще-то C включен в C++ по нормативной ссылке.

Ага, только по общему подмножеству языков 20 страниц несовместимостей. Непосредственно включена только библиотека, и то, с другими именами заголовков.
T>Увы для ваших фантазий, но это по определению ISO тот же язык,
Можно пункт стандарта? А то

C ++ is a general purpose programming language based on the C programming language

совсем о другом говорит.
T>только с некоторыми дополнительными возможностями.
Этих "некоторых дополнительных возможностей" больше половины.
T>И человеку, который до этого год писал на макросах, нужно внятно объяснить чем шаблоны лучше макросов -- для этого сравнив их с макросами.
А шаблоны не лучше макросов, шаблоны просто другие.
T>Также объяснить чем константы и перечисления лучше макросов, объяснить зачем нужны пространства имён (и убедить что они вообще нужны, помню самого себя мне пришлось в этом убеждать около года), etc.
Плохо с принятием новых идей и проекция этого на студентов?

T>Что до кастов, то тут работает моя привычка объяснять вещи цельными кусками, чтобы не сбиваться на мелочи. Я объясняю все касты сразу -- но только к тому моменту, когда студенты готовы понять что такое dynamic_cast (самый сложный из всех).

Там помимо синтаксиса есть интересные моменты. В целом в плюсах касты нужны реже, но это если не подходить к ним как к С.
T>Так что это в будущем. Недельки через три-четыре доползем, я полагаю. Аналогично new/delete вместо malloc/free/realloc я объясняю не раньше, чем студенты становятся способны осознать все десять отличий первого от второго.
Какие еще 10 отличий, зачем они? Такое впечатление, что не язык учат, а гномиков переворачивать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[8]: Тест по базовому C++ -- интересно ваше мнение
От: Ops Россия  
Дата: 22.10.15 20:24
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Меня к фантазёрам добавь. Это разные языки. В топку определения, важно то, что на них пишется всё по-разному.


Там и в определениях такого нет, сказано лишь, что плюсы основаны на С — но это бесспорно, ведь изначально так и было.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[8]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 22.10.15 20:41
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Можно пункт стандарта? А то

Ops>

Ops>C ++ is a general purpose programming language based on the C programming language

Ops>совсем о другом говорит.

Вы привели верный пункт и он говорит именно об этом. Вы просто оборвали цитату в удобном вам месте.

Ops>Какие еще 10 отличий, зачем они? Такое впечатление, что не язык учат, а гномиков переворачивать.


Ну только не говорите мне, что не знаете чем malloc/free отличается от new/delete. Понимаю всю вашу боль и всё такое, но это уже как-то неприлично толсто.
Re[9]: Тест по базовому C++ -- интересно ваше мнение
От: Ops Россия  
Дата: 22.10.15 21:32
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Вы привели верный пункт и он говорит именно об этом. Вы просто оборвали цитату в удобном вам месте.

Там нет в стандарте слов "одно и то же", это разные языки, один основан на другом и включает в себя некоторые его элементы, иногда измененные, но не более.

T>Ну только не говорите мне, что не знаете чем malloc/free отличается от new/delete. Понимаю всю вашу боль и всё такое, но это уже как-то неприлично толсто.

Тем, что это разного рода сущности, а их сравнение между собой некорректно. Даже глобальный new, несмотря на схожий с malloc функционал, с ним не сравним, ибо неявно затрагивает всю программу. Так что 10 отличий, я, пожалуй, не найду, т.к. не сторонник сравнивать ежа с ужом.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[10]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 23.10.15 07:38
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Там нет в стандарте слов "одно и то же", это разные языки, один основан на другом и включает в себя некоторые его элементы, иногда измененные, но не более.


"Утка++ включает в себя утку, в соответствии со стандартом на утку, а кроме того содержит фасетчатые глаза, рога и пушистый хвост". Это тот же самый язык с некоторыми расширениями именно постольку, поскольку он безоговорочно включает в себя C и дальше пляшет от этого. На самом деле это LSP в действии (отношения подкласс-суперкласс, где суперклассом является C) и мне кажется, что здесь определение в стандарте читается довольно однозначно.

Ops>Тем, что это разного рода сущности, а их сравнение между собой некорректно.


С самой практической точки зрения у вас всегда есть выбор: выделить память для объекта через new или выделить память через malloc и разместить там объект посредством new. В этом смысле пока неясно есть ли разница (см. ниже).

Ops>Даже глобальный new, несмотря на схожий с malloc функционал, с ним не сравним, ибо неявно затрагивает всю программу. Так что 10 отличий, я, пожалуй, не найду, т.к. не сторонник сравнивать ежа с ужом.


Ну вот разговор и приобретает конструктивный оттенок. Давайте посмотрим поближе на фасетчатые глаза и на хвост. В процитированном вами пункте 1.1 есть явное указание (списком!) того, что C++ существенно прибавляет к C:

In addition to the facilities provided by C, C++ provides additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store management operators, and additional library facilities.


Я выделил интересное. Попробуйте ответить:
1) Где именно выделяет память malloc и где именно выделяет память new?
2) В чём принципиальная фишка этого free store и почему его вдруг внесли отдельной строчкой вместе с классами и шаблонами в список самых существенных отличий, в первый пункт стандарта?
3) Какие ещё принципиальные отличия new от malloc вытекают из ответа на пункт 2?
Re[5]: Тест по базовому C++ -- интересно ваше мнение
От: VTT http://vtt.to
Дата: 23.10.15 08:24
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Пописав на C в ООП-стиле (GTK и всё такое) можно только возненавидеть ООП, ничего больше. Я в лекциях (уже в разделе ООП) разбираю реализацию виртуальных функций на C, но в этом году я планирую выкинуть это место из лекций. Оно слишком ужасно даже на мой вкус.


T>C++ ради ООП (и я объясняю это своим студентам) приносит две жертвы, и это очень серьёзные жертвы.


T>Во-первых C++ жертвует гарантией сохранности имен в ассемблере целевой архитектуры. Это позволяет делать функции функциями-членами. А кроме того позволяет пространства имён, перегрузку, шаблоны функций и прочие вытребеньки.

T>Во-вторых C++ жертвует гарантиями по расположению полей структуры в памяти. Это позволяет вводить private и protected данные.

T>Обе эти жертвы можно не приносить, если ограничиваться extern "C" функциями и POD-типами.


T>Но если они принесены, мы должны осознавать что именно мы получаем взамен. Мы получаем полноценное ООП.


T>Именно поэтому, когда меня спрашивают что самое главное Строструп добавил в C, я всегда отвечаю: он не добавил. Он выкинул две важнейшие гарантии этого языка. Остальное после этого получилось само и ООП -- только частный случай того, что получилось.


Вы о чем вообще?
ООП подход во множестве С библиотек и программ вполне хорошо себя зарекомендовал. И чем вам не угодили реализации виртуальных функций? Если делать без наворотов, то в них нет ничего сложного.
С каких это пор в ассемблере сохраняются какие-то имена? Или вы имеете ввиду assembly, то бишь сборки? Но по ним С ничего не говорит. А когда не нужен публичный C интерфейс, то хороший тон выкидывать эти имена или заменять на mangled имена. Но само их наличие — это просто атавизм бородатых времен. Функции-члены, пространства имен, перегрузка, шаблоны и прочее тут ни при чем.
Гарантий по расположению полей структур в памяти отродясь не было. Нет даже гарантий, что эти структуры вообще будут формироваться, если они никуда не экспортируются. Да и откуда взяться таким гарантиям, если размеры базовых типов определены весьма размыто?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[11]: Тест по базовому C++ -- интересно ваше мнение
От: Ops Россия  
Дата: 23.10.15 11:40
Оценка:
Здравствуйте, Tilir, Вы писали:

T>"Утка++ включает в себя утку, в соответствии со стандартом на утку, а кроме того содержит фасетчатые глаза, рога и пушистый хвост". Это тот же самый язык с некоторыми расширениями именно постольку, поскольку он безоговорочно включает в себя C и дальше пляшет от этого.

Annex C на 20 страниц, где в т.ч. принципиальные ломающие отличия — это безоговорочно?

T>С самой практической точки зрения у вас всегда есть выбор: выделить память для объекта через new или выделить память через malloc и разместить там объект посредством new. В этом смысле пока неясно есть ли разница (см. ниже).

Да дело не в памяти, new имеет функционал помимо этого.

T>Я выделил интересное. Попробуйте ответить:

T>1) Где именно выделяет память malloc и где именно выделяет память new?
Абсолютно пофигу.
T>2) В чём принципиальная фишка этого free store и почему его вдруг внесли отдельной строчкой вместе с классами и шаблонами в список самых существенных отличий, в первый пункт стандарта?
Пока устраивает базовое поведение — нет никаких принципиальных фишек, когда перестает устраивать, для new довольно просто описать свое. Как оно там внутри абсолютно не важно и зависит от реализации, мало того, в стандарте есть намек, что реализация new может дергать malloc.
T>3) Какие ещё принципиальные отличия new от malloc вытекают из ответа на пункт 2?
Никакие, принципиальные отличия в другом: bad_alloc, new_handler, в возможности перегрузки и в работе с объектами, а вовсе не в самой памяти.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: enji  
Дата: 24.10.15 07:44
Оценка:
Здравствуйте, Tilir, Вы писали:

T>У меня был, кстати, вариант теста по языку C, который я передумал давать студентам, потому что получилось действительно на профессионала (с моей точки зрения). Поэтому я могу вам показать как я себе представляю тест для профессионала. Как-то так.


Вот уж не знаю. Этот тест для меня проще

Местами бы больше конкретики. К примеру
"Для двух объектов, аллоцированных в разных местах, но имеющих одинаковое численное значение
указателей на них, при сравнении указателей на равенство"

Вполне может быть, в зависимости от платформы и компилятора
1) Указатели будут считаться равными (avr-gcc, указатели на flash и ram)
3) У двух указателей на объекты в разных местах не может быть одинакового значения (stm32 к примеру)
4) Такое сравнение просто не скомпилируется (iar-avr, разные типы указателей на flash и ram)
Re[5]: Тест по базовому C++ -- интересно ваше мнение
От: enji  
Дата: 24.10.15 07:46
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Во-вторых C++ жертвует гарантиями по расположению полей структуры в памяти. Это позволяет вводить private и protected данные.


а какая связь между private и расположением в памяти?
Re[11]: Тест по базовому C++ -- интересно ваше мнение
От: enji  
Дата: 24.10.15 07:56
Оценка:
Здравствуйте, Tilir, Вы писали:

T>1) Где именно выделяет память malloc и где именно выделяет память new?


Как в библиотеке написано, там и выделяет. В newlib к примеру дергает malloc.

T>2) В чём принципиальная фишка этого free store и почему его вдруг внесли отдельной строчкой вместе с классами и шаблонами в список самых существенных отличий, в первый пункт стандарта?

И в чем его основная фишка? ИМХО, это просто какая-то казуистика начинается. Возможно есть какая-то архитектура, где new ведет себя как-то очень хитро. Стандарт описан так, что "стандартная" программа будет выполняться и на этой хитрой архитектуре.

T>3) Какие ещё принципиальные отличия new от malloc вытекают из ответа на пункт 2?


Принципиальных отличий, имхо, два
а) вызов new помимо выделения памяти еще и зовет конструктор(ы), если тот есть
б) new можно переопределить для разных типов и хранилищ
Re[6]: Тест по базовому C++ -- интересно ваше мнение
От: Evgeny.Panasyuk Россия  
Дата: 24.10.15 11:46
Оценка:
Здравствуйте, enji, Вы писали:

T>>Во-вторых C++ жертвует гарантиями по расположению полей структуры в памяти. Это позволяет вводить private и protected данные.

E>а какая связь между private и расположением в памяти?

Смотри требования POD. В новых стандартах ещё появились standard-layout.
Re[7]: Тест по базовому C++ -- интересно ваше мнение
От: enji  
Дата: 24.10.15 12:46
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Смотри требования POD. В новых стандартах ещё появились standard-layout.


Не, стоп. private — просто модификатор доступа. При чем тут вообще расположение? На расположение влияют наследование / виртуальные методы, но не квалификаторы доступа же
Re[9]: Тест по базовому C++ -- интересно ваше мнение
От: enji  
Дата: 24.10.15 14:48
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>C++98:

EP>

EP>Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of nonstatic data members separated by an access-specifier is unspecified


хм, а не знаешь, зачем так сделали?
Re[12]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 24.10.15 20:06
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Annex C на 20 страниц, где в т.ч. принципиальные ломающие отличия — это безоговорочно?


Конечно. В месте включения никаких оговорок нет. Пункт 1.1 говорит "язык C включен полностью", чего вам сказать яснее? Что до поломок и несовместимостей, то все-таки C++ это очень пересмотренный C. Не могли же они ничего не сломать в процессе. Даже в пределах одного номера стандарта, нет-нет да и сломают что-нибудь.

T>>1) Где именно выделяет память malloc и где именно выделяет память new?

Ops>Абсолютно пофигу.

А ведь это очень важно. Представим, что malloc лезет в некий черный ящик. В стандарте явно указано: it is unspecified, лезет ли new в тот же черный ящик или берет память откуда угодно ещё. Это и только это вообще позволяет вам переопределить new.

T>>3) Какие ещё принципиальные отличия new от malloc вытекают из ответа на пункт 2?

Ops>Никакие, принципиальные отличия в другом: bad_alloc, new_handler, в возможности перегрузки и в работе с объектами, а вовсе не в самой памяти.

Прекрасно. Три отличия вы указали. Ещё одно -- new в отличии от malloc можно перегрузить -- я вам привел выше. Осталось найти ещё шесть =)
Re[6]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 24.10.15 20:19
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>С каких это пор в ассемблере сохраняются какие-то имена?


В языке C, если вы пишете

int foo (int x)


то в ассемблере вы получите метку

foo:


Вы получите её всегда. Имена функций в C не манглируются. В C++ для этого используется extern "C".

VTT> Функции-члены, пространства имен, перегрузка, шаблоны и прочее тут ни при чем.


Без манглирования имён перечисленное невозможно. Подумайте почему.

Вообще я пришёл сюда спрашивать о тесте, а не заниматься ликбезом. Ваше мнение я услышал, спасибо. Про структуры и прочее может быть где-нибудь прочитаете. А может и нет, вам, судя по всему, не надо.
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: Tilir Россия http://tilir.livejournal.com
Дата: 24.10.15 20:28
Оценка:
Здравствуйте, mavrii, Вы писали:

M> Я с такими crazy определениями не разу не встречался


Это характеризует решаемые вами задачи.

Скажем в стандарте POSIX, функция signal имеет следующую сигнатуру:

void ( *signal(int signum, void (*handler)(int)) ) (int);


И это не самый хардкор, какой я встречал.
Я учу студентов писать простой код и читать любой код.

M> Я бы задавал вопросы по типу чем printf формат лучше хуже cout. Объясните в каких случаях что лучше использовать. Почему?


Он лучше =) С вариабельными шаблонами вы можете сделать его безопасным относительно типов. Большинство языков спроектированных позже C++ имеют вывод больше похожий на printf, чем на cout. Вот скажем питон:

print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)

Re[13]: Тест по базовому C++ -- интересно ваше мнение
От: Ops Россия  
Дата: 24.10.15 21:41
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Конечно. В месте включения никаких оговорок нет. Пункт 1.1 говорит "язык C включен полностью", чего вам сказать яснее?

Можно цитату? Я хоть убей "язык C включен полностью" там не вижу.

T>А ведь это очень важно. Представим, что malloc лезет в некий черный ящик. В стандарте явно указано: it is unspecified, лезет ли new в тот же черный ящик или берет память откуда угодно ещё. Это и только это вообще позволяет вам переопределить new.

В большинстве случаев разработчику абсолютно пофиг откуда память, и так же пофиг на перегрузку new, а уж перегрузка глобального вообще случай довольно редкий, ибо легко отстрелить ногу.

T>Прекрасно. Три отличия вы указали. Ещё одно -- new в отличии от malloc можно перегрузить -- я вам привел выше. Осталось найти ещё шесть =)

Только как эти "отличия" вытекают из п.2?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Тест по базовому C++ -- интересно ваше мнение
От: uncommon Ниоткуда  
Дата: 24.10.15 23:47
Оценка:
Здравствуйте, Abyx, Вы писали:

A> есть http://cdecl.org


Ну, наконец-то!
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Poopy Joe Бельгия  
Дата: 26.10.15 08:31
Оценка:
Здравствуйте, Tilir, Вы писали:

T>А исходный тестик в топике ни у кого интерес не отбивает. Как раз наоборот, студенты с энтузиазмом лезут в закоулки языка, ещё и оттаскивать приходится. И потом, когда начинаются действительно сложные вещи, связанные с ООП и шаблонами, где ловушек куда больше и они гораздо менее бесхитростны, у ребят уже накоплен опыт исследования, позволяющий разбираться в таких вещах и не бояться их.


Т.е. вместо того, что бы писать понятный, поддерживаемый код, студенты с энтузиазмом начинают учится расставлять ловушки, потому что они не боятся их?
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: B0FEE664  
Дата: 27.10.15 13:41
Оценка:
Здравствуйте, Tilir, Вы писали:

A>>8) зачем знать есть ли op< у указателя на функцию, или его нет?

T>Важно понимание что вообще такое указатель на функцию физически и что функции могут как угодно лечь при линковке.

Вы так пишите, что можно подумать, что есть гарантии, что код:
void foo () { printf ("%d%d\n", max(one, two)(), max(one, two)()); }

выдаст либо 11, либо 22, но не 21 и не 12. А ведь таких гарантий нет, не так ли?
И каждый день — без права на ошибку...
Re[7]: Тест по базовому C++ -- интересно ваше мнение
От: VTT http://vtt.to
Дата: 28.10.15 21:04
Оценка:
T>В языке C, если вы пишете

T>
T>int foo (int x)
T>


T>то в ассемблере вы получите метку


T>

T>foo:


T>Вы получите её всегда. Имена функций в C не манглируются. В C++ для этого используется extern "C".


VTT>> Функции-члены, пространства имен, перегрузка, шаблоны и прочее тут ни при чем.


T>Без манглирования имён перечисленное невозможно. Подумайте почему.


T>Вообще я пришёл сюда спрашивать о тесте, а не заниматься ликбезом. Ваше мнение я услышал, спасибо. Про структуры и прочее может быть где-нибудь прочитаете. А может и нет, вам, судя по всему, не надо.


Вы только перед студентам такие "познания" не вываливайте.
К вашему сведению сопоставление адресов методов (и данных) с символическими именами в виде ASCII-строчки — это тяжелое наследие прежних времен, бремя совместимости с которым приходится волочить до сих пор. И, соответственно, mangled имена в С++ — это самый обыкновенный костыль чтобы избежать необходимости править формат исполняемых файлов. В свое время кто-то просто срезал угол и вместо нормальных метаданных запилил name mangling чтобы сложные наименования с пространствами имен, перегрузками и прочим могли были представлены в виде все тех же ASCII строчек.
Метки в ассемблере могут иметь место только если имеется сопоставление адреса с символическим именем, которое может браться например из таблиц импортов / экспортов или из дебаг информации. Когда есть исходники — то это вообще не проблема. Но если исходников нет, а таблицы содержат mangled имена (или не содержат их вообще), то никаких толковых меток вы в ассемблере не увидите при всем желании.
Импортируемыми именами методов что в С, что в С++ можно достаточно свободно манипулировать. Достаточно написать свой .def файл. Советую поупражняться на досуге.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.