В одной книге по подготовке к программистским интервью попался следующий вопрос.
Дана программа:
#include <iostream> class A { int n1; int n2; public: A() : n2(0), n1(n2 + 2) {} void print() { std::cout << n1 << ", " << n2; } }; int main() { A a; a.print(); return 0; }Что будет распечатано?
Как братья и сестры программисты считают, это кошерный вопрос, или за такие вопросы надо сразу бить с ноги в щи?
- Current Mood:
mischievous
Comments
Вообще, язык программирования, как и всякий язык, призван служить для ясного выражения мыслей. С белибердой пусть разбираются психиатры и писатели компиляторов.
Автор книги завалил человека на интервью на этом вопросе и гордится этим.
Именно поэтому компилятор и ругается. Если не ругается, то начнет, если изменить порядок. Если по умолчанию это не ошибка, то -Werror is your friend.
сегодня сказано, а завтра не сказано
Не бывает.
Автор книги завалил человека на интервью на этом вопросе и гордится этим.
Логичен вопрос: должен ли человек при сдаче на водительские права мочь продемонстрировать базовое понимание механизма работы рулевого управления и пределов его возможностей?
Признаюсь в страшном, я не очень хорошо представляю себе механизм рулевого управления и пределы его возможностей. Это не мешает мне десятки лет водить машину без единой аварии. У меня надо отобрать права? ;)
Также поверхностное знание языка программирования можно уподобить поверхностному знанию родного языка, когда человек может дожить до седых волос и так и не уметь правильно склонять числительные, например.
Язык для человека, а не человек для языка. Правильный годный код должен быть простым и поверхностным (= использовать необходимый минимум языковых средств).
Edited at 2015-08-17 06:12 am (UTC)
Но сложным или недопустимым он от этого не становится.
Такой компилятор не даст написать хорошо читаемый код. Поскольку в объявлении класса поля, как правило, должны быть сгрупированы по смыслу, а в конструкторе, если поля инциализируются его параметрами, наиболее понятно пишется и читается такой код, в котором инициализаторы следуют в том порядке, в котором соответствующие параметры встречаются в вызове конструктора. Порядок инициализации полей при этом следует считать неопределенным - так точно никакой ошибки не случится. Если неопределенность порядка вызова конструкторов полей вызывает какие-то сложности, значит сам класс криво спроектирован.
Если неопределенность порядка вызова конструкторов полей вызывает какие-то сложности, значит сам класс криво спроектирован.
Компилятору все равно, как спроектирован класс. Логика языка требует разрушать поля в порядке, противоположном созданию, а накладные расходы на хранение информации, каким именно конструктором создавался каждый объект класса, были бы неоправданы, поэтому и было принято решение сделать так, как сделано.
Для интервью - кошерный вопрос. На него меадринно отвечать двумя вариантами.
В работе - треф ллё сафек
При всём вышесказанном, некоторые конструкции должны вызывать у опытного программиста условный рефлекс как у собаки Павлова. Скажем, инициализация мемберов в конструкторе. Или там доступ к элементу в map через оператор [] должен зажигать лампочку в мозгу что если элемента в контейнере нет, то он будет добавлен. Вызов printf с неправильными параметрами. И т.д. и т.п.. Такие вопросы очень часто задают на интервью.
При этом, правильный ответ на эти вопросы ещё не означает что кандидат - хороший программист.
Был в моем арсенале для интервью такой тест. :)