Pzz>Мой любимый пример: x = (flag ? sin : cos)(y); Опыт показывает, что эта простая конструкция приводит многих собеседователей в тупик, в диапазоне от "а что это значит?" и до "а что, так можно?".
Конечно, это потрясение основ!
Ведь всегда во всех книжках написано, что y — слева!
y = (flag ? sin : cos)(x)
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
Pzz>>Мой любимый пример: x = (flag ? sin : cos)(y); Опыт показывает, что эта простая конструкция приводит многих собеседователей в тупик, в диапазоне от "а что это значит?" и до "а что, так можно?". LVV>Конечно, это потрясение основ! LVV>Ведь всегда во всех книжках написано, что y — слева!
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, alpha21264, Вы писали:
A>>Ну вот... фигня. A>>Нормальный программист знает, что не надо менять входные параметры, и как правило не меняет. A>>Поэтому с моей точки зрения нужно маркировать не константные аргументы, а изменяемые аргументы. A>>Таким образом в правильно написанной программе хлама не будет. A>>А сейчас хлама столько же, сколько полезной информации или даже больше. A>>Это не правильно.
M>Можно случайно напортачить. const же не даст это сделать.
M>И входные параметры не менять? Это очень спорно.
Marty!
Ты читать не умеешь.
У меня написано, что нужно маркировать изменяемые параметры, а не константные.
Прочти эту фразу ещё раз.
Вот если сделать так, то при этом контроль будет. А хлама будет гораздо меньше.
Здравствуйте, alpha21264, Вы писали:
A>У меня написано, что нужно маркировать изменяемые параметры, а не константные. A>Вот если сделать так, то при этом контроль будет. А хлама будет гораздо меньше.
Это можно сделать только в новом языке забив на совместимость. Например, в Rust-е так и поступили.
Но ведь вы говорите о C++, а в C++ вот так. И вы можете либо забить на наличие const и отгрести приключений, либо принять тот факт, что в C++ через const отмечаются неизменяемые параметры и получать от этого бенефиты.
И что-то мне подсказывает, что на Rust вы просто так не перейдете.
Здравствуйте, alpha21264, Вы писали:
M>>Можно случайно напортачить. const же не даст это сделать.
M>>И входные параметры не менять? Это очень спорно.
A>Marty! A>Ты читать не умеешь. A>У меня написано, что нужно маркировать изменяемые параметры, а не константные. A>Прочти эту фразу ещё раз. A>Вот если сделать так, то при этом контроль будет. А хлама будет гораздо меньше.
А раз сделано наоборот, то чтобы "не захламлять" код, положим на это болт.
Здравствуйте, Marty, Вы писали:
M>По тому, как сделано — все претензии к сишечке
ЕМНИП, const сперва появился в C++, а потом его уже назад в Си забрали.
Но да, т.к. C++ включал в себя большую часть Си как подмножество, то синтаксис передачи параметров был унаследован из Си. А там const-а не было
Здравствуйте, alpha21264, Вы писали:
A>У меня написано, что нужно маркировать изменяемые параметры, а не константные.
Прикинь, сам Страуструп высказывался примерно в этом же ключе. Только вот наследие Си помешало этому. Но, как справедливо заметил Марти, это ж не повод, чтоб вообще забить.
P.S. Ты вот не поленись, потрать несколько минут на прочтение: 15. Активно используйте const. Возможно, слова авторитетов покажутся тебе более убедительными, чем наши.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, so5team, Вы писали:
M>>По тому, как сделано — все претензии к сишечке
S>ЕМНИП, const сперва появился в C++, а потом его уже назад в Си забрали. S>Но да, т.к. C++ включал в себя большую часть Си как подмножество, то синтаксис передачи параметров был унаследован из Си. А там const-а не было
Я не писал ничего про ключевое слово const
В сишечке без const — параметры изменяемые, и если бы Страуструп сделал бы наоборот — то сломал бы совместимость. С другой стороны, сишечка в основном оперирует примитивными типами, и указателями. Примитивы проще (и обычно эффективнее) передавать по значению, так что особо не важно, const оно или не const. А дальше — в сишечке всё остальное передаётся через указатели, и тут const нужен 50 на 50 (имхо), т.е. в те времена он не особо и захламлял код. ТС, кстати, имхо зря ноет, если он на сишечке пишет, особого засилья const там быть не должно
Здравствуйте, Marty, Вы писали:
M>>>По тому, как сделано — все претензии к сишечке
S>>ЕМНИП, const сперва появился в C++, а потом его уже назад в Си забрали. S>>Но да, т.к. C++ включал в себя большую часть Си как подмножество, то синтаксис передачи параметров был унаследован из Си. А там const-а не было
M>Я не писал ничего про ключевое слово const
Так здесь же вроде ветка обсуждения именно про const-параметры, так что это подразумевалось.
M>А дальше — в сишечке всё остальное передаётся через указатели, и тут const нужен 50 на 50 (имхо), т.е. в те времена он не особо и захламлял код.
Я как раз про это. Мой склероз мне подсказывает, что это сперва в C++ появилась возможность написать f(const char*), и только потом, при работе над стандартом C89 эту фичу Си позаимствовал из C++. Так что на протяжении долгого времени в Си вообще не было указателей на const.
M>ТС, кстати, имхо зря ноет, если он на сишечке пишет, особого засилья const там быть не должно
Здравствуйте, alpha21264, Вы писали:
A>Факты говорят обратное. Сейчас 90% выдачи компилятора — это предупреждения на const, которые вообще никогда не приведут к ошибкам.
Твоё "вообще никогда" целиком и полностью держится на человеческом факторе — т.е. ни на чём. Так что, замечания по делу.
Дам тебе ещё одну ссылку на рекомендации ведущих собаководов: http://lib.ysu.am/open_books/417126.pdf — посмотри Правило #1 — "Компилируйте без замечаний при максимальном уровне предупреждений".
--
Справедливость выше закона. А человечность выше справедливости.
Pzz>На собеседованиях любят спрашивать всякую фигню. Pzz>У Си есть неочевидные нюансы, но никто в своём уме не будет использовать их в боевом коде.
Pzz>Мой любимый пример: x = (flag ? sin : cos)(y); Опыт показывает, что эта простая конструкция приводит многих собеседователей в тупик, в диапазоне от "а что это значит?" и до "а что, так можно?".
Должен признаться, что понял, что делает этот код, только после 15 минут разглядывания.
Здравствуйте, Кодт, Вы писали:
К>Хорошо, когда у возвращаемого типа какой-то простенький конструктор (например, тривиальный). А если нет?
Вот нахрена так делать. Путь будет тривиальным, а инициализировать билдером, di или фабрикой
Здравствуйте, Marty, Вы писали:
M>В сишечке без const — параметры изменяемые, и если бы Страуструп сделал бы наоборот — то сломал бы совместимость. С другой стороны, сишечка в основном оперирует примитивными типами, и указателями. Примитивы проще (и обычно эффективнее) передавать по значению, так что особо не важно, const оно или не const. А дальше — в сишечке всё остальное передаётся через указатели, и тут const нужен 50 на 50 (имхо), т.е. в те времена он не особо и захламлял код. ТС, кстати, имхо зря ноет, если он на сишечке пишет, особого засилья const там быть не должно
Топикстартер ноет, что компилятор захламляет выдачу. С лишним словом в исходниках я готов мириться.
А вот то, что я могу пропустить важное предупреждение из-за огромного числа неважных и просто лишних, меня напрягает.
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, Marty, Вы писали:
M>>В сишечке без const — параметры изменяемые, и если бы Страуструп сделал бы наоборот — то сломал бы совместимость. С другой стороны, сишечка в основном оперирует примитивными типами, и указателями. Примитивы проще (и обычно эффективнее) передавать по значению, так что особо не важно, const оно или не const. А дальше — в сишечке всё остальное передаётся через указатели, и тут const нужен 50 на 50 (имхо), т.е. в те времена он не особо и захламлял код. ТС, кстати, имхо зря ноет, если он на сишечке пишет, особого засилья const там быть не должно
A>Топикстартер ноет, что компилятор захламляет выдачу. С лишним словом в исходниках я готов мириться. A>А вот то, что я могу пропустить важное предупреждение из-за огромного числа неважных и просто лишних, меня напрягает.
А ещё больше меня напрягает, что нормально работающую программу слишком вумный кумпилятор насильно ложит в корку.
Здравствуйте, alpha21264, Вы писали:
A>А ещё больше меня напрягает, что нормально работающую программу слишком вумный кумпилятор насильно ложит в корку.
Простите, а под "нормально работающей программой" вы все еще понимаете программу, в которой функции забывают возвращать значения (как в вашем стартовом сообщении этой темы)?
Здравствуйте, alpha21264, Вы писали:
A>То при выходе из функции сгенерится исключение illegal instruction, A>и программа упадёт в Core Dump.
A>А раньше было неопределённое поведение. A>Вот. Наткнулся.
луше UB разбавить еще таким UB что-бы было веселее.
bool my_function()
{
... // тут не важно что
// и вот тут не поставлен return
for(;;) {} // и добавлен бесконечный цикл
}
Здравствуйте, alpha21264, Вы писали:
Pzz>>Мой любимый пример: x = (flag ? sin : cos)(y); Опыт показывает, что эта простая конструкция приводит многих собеседователей в тупик, в диапазоне от "а что это значит?" и до "а что, так можно?".
A>Должен признаться, что понял, что делает этот код, только после 15 минут разглядывания.
Ну, молодец.
А я по молодости разок-другой такое в продакшене применил (разумеется не с sin/cos, с какой-то другой парой функций с одинаковым прототипом). Сейчас бы я так делать не стал. Народ реально не догоняет (к огромному моему удивлению).
Здравствуйте, alpha21264, Вы писали:
A>>Топикстартер ноет, что компилятор захламляет выдачу. С лишним словом в исходниках я готов мириться. A>>А вот то, что я могу пропустить важное предупреждение из-за огромного числа неважных и просто лишних, меня напрягает.
A>А ещё больше меня напрягает, что нормально работающую программу слишком вумный кумпилятор насильно ложит в корку.
Ты не представляешь, сколько раз мне приходилось спорить с коллегами на тему, с какого это такого хрена я оставляю в релизной сборке assert-ы (обычно не либсишные, а самодельные, которые умеют прощальные слова в лог писать, а не куда придётся).
Ну как же, твой ассерт свалит "нормально работающую программу", пользователь потеряет свои данные и обидется.
Слова, что нормально работающую программу мой ассерт не свалит, их не убеждают. Слова, что она потому и нормально работает, что вся обложена злобными ассертами, тоже.
Разумеется, в моих программах эти ассерты срабатывают ОЧЕНЬ редко. И если всё же срабатывают, это повод серьёзно беспокоиться.
В тех программах, разработка которых находится под моим контролем, ассерты в релизе включены всегда. Да и собственно, я не и делаю отдельных отладочных сборок, зачем мне тестировать и отлаживать дебугную сборку, если пользователю я поставляю релизную?