LINUX.ORG.RU

Какую книгу по C++ выбрать?

 ,


5

2

Какую книгу по с++ выбрать

  1. Герберт Шилдт. C++ для начинающих. Шаг за шагом
  2. Стивен Прата. Язык программирования C++. Лекции и упражнения
  3. Предложите свой вариант (учил джаву, с++ смотрел видео ну можно сказать не с нуля учу)

Перемещено hobbit из general

Ответ на: комментарий от vbr

Тем не менее goto cleanup это валидный код на C++ (пусть и не особо нужный, при наличии RAII).

Мы все еще говорим про то, что нужно изучать? Зачем изучать окаменевшее говно?

Учить нужно тому, как надо и объяснять почему надо так. А когда опыт накопиться (как и умение изучать новое) человек при необходимости и с goto cleanup разберется. Но только он будет уже понимать, что это не база, а отжившие своё рудименты.

Поэтому изучать это надо.

Если изучать именно С++, то лучше не надо.

От этого никуда не уйти.

Например, в современный C++.

Невозможно знать подмножество C++ и этим ограничиться.

Я бы сказал, что невозможно знать C++ целиком, мало кто способен на это. Да и не нужно. Так что при обучении правильнее бы ставить вопрос о том, чтобы человек ограниченно знал несколько подмножеств С++ (базу про классы, базу про шаблоны, базу про исключения и exception safety) и уверенно это применял. И подмножетсво чистого Си здесь пратически лишнее. Всякие Си-шые заморочки можно будет освоить и позже, когда (и если) придется с чисто-Си-шным кодом интегрироваться.

И, ещё раз подчеркну, знание С как такового достаточно ценно

Это сильно зависит от предметных областей. Натягивать Linux-овое ядро на какой-то новый процессор – да. А вот уже делать СУБД или компиляторы, не говоря уже про десктопное ПО… Сильно вряд ли. Даже не смотря на наличие копролитов вроде Постгресса.

eao197 ★★★★★
()
Ответ на: комментарий от vbr

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

Как же в других ЯП изучают ООП без вских vtable и пр.? А вот в cpp непременно необходимо.. :-)

MirandaUser2
()
Ответ на: комментарий от MirandaUser2

Да никак не изучают. Если человек не учил C, он не понимает, что творит. А с нынешними питонами ещё и алгоритмы не изучают. В одну строчку O(N^3) бахнут, а потом кричат - кластер мне, кластер дайте, не успеваю мегабайт обработать.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от eao197

Есть такой нередкий класс задач как подключение библиотек с C ABI к другим ЯП (например Java). И вот тут C необходим и достаточен (с всеми его malloc и free), а C++ наоборот - overkill.
(опять же API OS, что WinAPI, что POSIX, тоже на C)

MirandaUser2
()
Ответ на: комментарий от MirandaUser2

Есть такой нередкий класс задач как подключение библиотек с C ABI к другим ЯП

ХЗ для кого это нередкий класс задач.

И вот тут C необходим и достаточен (с всеми его malloc и free), а C++ наоборот - overkill.

Ну так для этого и не нужно учить С++.

Мой поинт в том, что не смотря на некоторое маленькое пересечение между Си и С++, это разные языки, задачи на которых решаются сильно по разному.

Поэтому тезис о том, что для понимания C++ лучше сперва овладеть Си в 2025-ом не является состоятельным. C++ нужно учить именно как C++, с минимальной оглядкой на Си.

Си нужно учить именно как Си без оглядки на С++.

А лучше Си вообще не учить без лишней на то необходимости.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

C++ нужно учить именно как C++, с минимальной оглядкой на Си.

В сферическом мире, где вокруг сплошной С++, и его изучают все 21 подряд без пропуска - может быть. Но в реальном мире изучатели С++ изучают его от силы 7-10 условных дней, а потом кидаются в собесы и пет-прожекты. Если в эти 7-10 дней попадёт статический полиморфизм на шаблонах, но не попадёт видимость имён при компоновке и концепция opaque pointer’а - результат обучения будет не рабочим.

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

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

Кроме того, 85 - 95% открытого кода, используемого в проектах, - это Си. Понимать отличия и специфику от крестов необходимо.

Си вообще не учить без лишней на то необходимости

В живой природе мест, где можно катится на одних крестах что-то 1-2% от мест, где требуются кресты + сишка.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

В сферическом мире, где вокруг сплошной С++, и его изучают все 21 подряд без пропуска - может быть. Но в реальном мире изучатели С++ изучают его от силы 7-10 условных дней, а потом кидаются в собесы и пет-прожекты. Если в эти 7-10 дней попадёт статический полиморфизм на шаблонах, но не попадёт видимость имён при компоновке и концепция opaque pointer’а - результат обучения будет не рабочим.

И логичным выводом отсюда будет не учить сперва Си, а потом C++, а вообще учить что-то другое. Java, C#, TypeScript, Go или Rust. Будет и проще, и полезнее.

Кроме того, 85 - 95% открытого кода, используемого в проектах, - это Си. Понимать отличия и специфику от крестов необходимо.

Для этого не нужно изучать сперва Си.

В живой природе мест, где можно катится на одних крестах что-то 1-2% от мест, где требуются кресты + сишка.

Уже лет 30 как Си-шика мне нужна просто чтобы заглянуть в очередное говно и понять как его не сломать окончательно. За редким исключением.

Почему в XXI-ом веке (не говоря уже про 2025-й) кто-то выбирает чистый Си для реализации проектов, не связанных с ядрами Linux-а или *BSD, для меня загадка. Из последних впоминается nginx (но вроде как автор ничего другого и не знал) и tarantul (примечательно, что потом Picodata вместо ламповой Си-шечке взяли Rust).

eao197 ★★★★★
()
Ответ на: комментарий от eao197

И логичным выводом отсюда будет не учить

Да, но имеем, что имеем.

Для этого не нужно изучать сперва Си.

Изучение наоборот будет просто трудозатратнее, а применимый на практике результат отодвинут в календарном плане на самый конец.

Уже лет 30 как Си-шика мне нужна

Я, конечно, рад за тебя, но мы обсуждаем не то, что нужно тебе (или мне), а то, что нужно средневзвешенному вкатывателю в ойти, который ещё успеет поперекатыватся в похапе с жаваскриптом и укатится в закат на 1с.

Почему в XXI-ом веке (не говоря уже про 2025-й) кто-то выбирает чистый Си для реализации проектов, не связанных с ядрами Linux-а или *BSD, для меня загадка.

Потому что "бесплатность" С++ при исполнении оплачивается программистом при разработке. На матрице когнитивных затрат "сложность инструментария" х "сложность задачи" все ресурсы приходится жертвовать по второй оси, а на первую силы тратят по остаточному принципу. У многих проектов и на нормальный си в итоге не остаётся ресурсов.

Из последних впоминается

Вообще дохера всего, от переписывающего гостскрипт артифлекса до архиваторов и видеокодеков с криптографией.

nginx

h2o стартанул лет 10 если не больше спустя.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

что нужно средневзвешенному вкатывателю в ойти

Если мы обсуждаем Си и C++, то это точно не то, что нужно вкатывателю в ойти.

Вообще дохера всего, от переписывающего гостскрипт артифлекса до архиваторов и видеокодеков с криптографией.

Есть ощущение, что в видеокодеках и криптографии основная сложность не в программировании.

eao197 ★★★★★
()
Ответ на: комментарий от LamerOk

между двумя сложностями выбирают ту, что важнее

Я не понимаю логику.

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

Если же придется иметь дело с кодом посложнее и таки C++ нужен, то нет смысла учить сперва Си, а только потом C++. Ибо более-менее освоив C++ и приобретя правильные привычки, уменьшающие шансы отстрела ног, можно будет затем выяснить и отличия от Си. Этого хватит, чтобы иметь возможность подключать в C++ный проект Си-шные библиотеки, заглядывать в них по необходимости и даже патчить, если уж настолько не повезло.

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

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

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

Вот зачем?

Тем более сейчас, когда изо всех утюгов начинают убеждать, что AI лишит работы всех джунов и большую часть мидлов.

eao197 ★★★★★
()

Если серьёзно, то «С++ за 21 день» 5-ое издание, Д.Либерти. Слабоумные ребята книженцию замемасили и пессимизировали, но к содержанию это имеет малое отношение, книга вполне удачна для новичка. Если у тебя каким-то образом в голове поселилась мысль что может существовать учебник всё-в-одном, прочитав который ты в совершенстве освоишь плюсы, то забудь такого нет и плюсы это как раз в норме это основы и сотни и тысячи часов практики и самообразования. Короче - начни с этой книги, но помни, что главное не читать, а писать.

anonymous
()
Ответ на: комментарий от archpeak

«Тяжёлой» бывает задача, причём в любой области. А натренировать ИИ можно на любой язык, даже на C++, без особой сложности.

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

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 6)

1.Герберт Шилдт. C++ для начинающих. Шаг за шагом

2.Стивен Прата. Язык программирования C++. Лекции и упражнения

C++ – живой язык. В ту самую секунду, в которую Вы его учите, в него добавляется что-то новое.

https://isocpp.org/blog/2025/06/reflection-voted-into-cpp26-whole-new-language-herb-sutter

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

На первое время можно ограничиться теми авторами, которые имеют непосредственное отношение к c++: либо развивают сам язык, либо разрабатывают и дорабатывают достаточно широко используемую на практике систему программирования на c++.

Если Вы ведёте кружок программирования для старшеклассников, можете подсмотреть в книгах известных педагогов (Стивен Прата) то, что поможет Вам разработать свой учебный курс.

vM ★★
()
Ответ на: комментарий от eao197

Почему стоит все же изучить Си перед C++

  1. C++ начинался как Си с классами и в принципе до сих пор C++ - это по большому счету Си на стероидах, и наверное любой компилятор плюсов по совместительству ещё и Си компилирует.

  2. Более того, для стыковки кода на C++ с другими языками или использования в ОС, понадобится обертку на Си писать. C++ крайне херово умеет напрямую использовать даже собственные библиотеки, там ABI ломается от малейшего чиха. Короче врапперы на Си - наше всё.

  3. Си намного проще C++, затраты ресурсов на его изучения не более 10% от затрат на Си, а скорее менее.

  4. Для девелоперской жизни, особенно в nix-системах, все равно понадобится знать Си. Ядро и туева хуча софта написаны на Си.

anonymous
()
Ответ на: комментарий от anonymous

Вот вроде ты попытался что-то сказать, но получилась только чепуха. Назову главную причину, по которой нужно «изучить» си до цпп: понимание ограничений си/назначений механизмов цпп. Всё остальное фантазии всяких макака.

anonymous
()
Ответ на: комментарий от vM

Ерунду пишете, т.к. для новичка очевидно с чего-то нужно начать, а вот уже за динамикой он будет гоняться потом - не учите бегать того, кто не научился даже ходить. Повторюсь моя рекомендация - Либерти C++ за 21 день, которая не смотря на обсмеянное название является очень хорошей книгой для новичка и при достаточном внимании к проработке материала и должном количестве практики, это будет хороший старт.

anonymous
()
Ответ на: комментарий от anonymous

Почему стоит все же изучить Си перед C++

Си c пайтоном уже «прошли»:

Как выбрать язык программирования?

В уч. заведении мы изучали Python и C

Т.о. в нашем случае C++ – не первый и не второй язык.

vM ★★
()
Ответ на: комментарий от anonymous

Либерти C++ за 21 день, которая не смотря на обсмеянное название является очень хорошей

Когда-то у книги был официальный сайт

https://web.archive.org/web/20060515070120fw_/http://www.libertyassociates.com/pages/e21Whichbook_edit.htm

vM ★★
()
Ответ на: комментарий от eao197

непонятно чьи интересы для вас важнее

Вопрошальщика, конечно. Я знаю, это вышло из моды и вообще вредно. Ничего страшного - вымрет моё поколение, останутся только здоровые особи, и люпус люпусу будет люпусом.

Ваши, как профессионала, которому выгодно иметь сильных по уровню коллег. Или же интересы войтишников, у которых, может быть, вообще нет никаких способностей к программированию?

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

Советовать изучать Си просто потому, что некий средневзвешенный войтишник все равно не осилит C++ как-то странно

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

Если же придется иметь дело с кодом посложнее и таки C++ нужен, то нет смысла учить сперва Си, а только потом C++.

Во-первых, вы неявно в течении всей дискуссии подразумеваете тезис, что обучение си может иметь негативных эффект на обучении С++. Я с этим тезисом категорически не согласен. Сказки про злых программистов на С++, которые вызывают malloc вместо new на практике 1) оказываются сказками и 2) "правильные" программисты на С++ в таком противопоставлении в соответствии с последними директивами ЦК оказываются такими же плохими, как и неправильные. А ведь разговаривать про new/delete всё равно придётся.

Во-вторых, есть смысл не только учить си перед обучением С++, но есть и смысл даже программировать на си некоторое время - хотя бы один проект под сотню функций. Именно этот опыт ВНЕЗАПНО является одновременно и отличным мотиватором, и отличным дидактическим материалом к обучению крестам - становится понятно, какие именно проблемы и как именно они решают.

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

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

А вот тут уже моя очередь удивляться, потому крестовик не знающий Си не профпригоден. Физически.

И из моей практики наибольшие проблемы как в подборе людей, так и среди работающих коллег были как раз с людьми, выучившими С++ "за 21 один день" так, чтоб что-то где-то компилировалось в IDE, чем с "испорченными" си разработчиками - я таких вообще за всю жизнь не встречал ни одного.

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

Ну и последнее - вы как-то забываете, что и сишники, и крестовики всё ещё находят работу в этом мире вовсе не потому, что божественно знают свой язык и центральный процессор исполняет машинные инструкции, сгенерированные С++ компилятором, в два раза быстрее, чем те же инструкции, сгенерированные С# компилятором, а потому что в нагрузку к этим языкам идёт ещё большой пласт "смежной" информации - от машинных инструкций процессора, до нюансов работы системы привилегий в операционной системе. Этот объём знаний рассыпан по всему пути обучения, он тоже потребует ресурсов.

Некая идиллическая картина, в которой юный падаван войдёт в монастырь С++, и проведя там десять лет за стандартом, выйдет оттуда успешным профессионалом с нулём знаний в остальных областях выглядит на мой взгляд совершенно оторванной от реальности. Нет никакого практического смысла пытаться объехать Си, который всё равно надо будет знать на "отлично".

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 2)
Ответ на: комментарий от LamerOk

Вопрошальщика, конечно.

OK.

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

Да.

Я с этим тезисом категорически не согласен.

OK. Но теперь я с вами категорически не согласен.

Сказки про злых программистов на С++, которые вызывают malloc вместо new на практике 1) оказываются сказками и 2) «правильные» программисты на С++ в таком противопоставлении в соответствии с последними директивами ЦК оказываются такими же плохими, как и неправильные.

К сожалению, мне регулярно приходится сталкиваться со злыми программистами на С++, которые:

a) не используют идиому RAII и пытаются чистить за собой руками;

b) не задумываются об exception safety. В сочетании с предыдущим пунктом у них получается настолько хрупкий код, который оставляет после себя мусор от преждевременного return-а;

c) не используют шаблоны и занимаются копипастой.

И это только то, что сразу вспомнилось.

А вот тут уже моя очередь удивляться, потому крестовик не знающий Си не профпригоден. Физически.

Я таких видел и с такими работал. Даже мои собственные «знания» Си ограничиваются временами 1990-1992гг.

Ничего, как-то справляемся.

а потому что в нагрузку к этим языкам идёт ещё большой пласт «смежной» информации - от машинных инструкций процессора, до нюансов работы системы привилегий в операционной системе

Если брать мой конкретный случай, то все перечисленное мимо. Не владею.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

a) не используют идиому RAII
b) не задумываются об exception safety.
c) не используют шаблоны

  1. И каким образом незнание языка си поможет решить хоть одну из этих проблем?
  2. Теперь представьте, что они всё это знают, но не имеют ни малейшего понятия о порядке байт, выравнивании и операторе ‘sizeof’ - как долго их код проработает до первого сегфолта?

К сожалению, мне регулярно приходится сталкиваться со злыми программистами на С++

Вам приходится иметь дело с людьми, которым ни с++, ни ваш проект не интересны. Никаким кручением обучения с++ это не исправить.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

И каким образом незнание языка си поможет решить хоть одну из этих проблем?

Как раз знание языка Си позволяет им игнорировать возможности C++. Типа «ну оно же у меня работает» и «я так привык».

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

Теперь представьте, что они всё это знают, но не имеют ни малейшего понятия о порядке байт, выравнивании и операторе ‘sizeof’ - как долго их код проработает до первого сегфолта?

Выравнивание и оператор sizeof спокойно изучаются и в C++, для этого не нужно предварительно узнавать Си.

Порядок байт, как показывает мой опыт, вообще мало кому нужен после того, как в живых остались пара-тройка мейнстримных аппаратных платформ.

Опять же, про порядок байт в случае работы с сетью, придется узнать хоть в Python-е, хоть в C#. Какого-то приотитета у чистого Си здесь нет.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Порядок байт, как показывает мой опыт, вообще мало кому нужен

Он нужен примерно всегда, когда есть сетевой протокол с двоичными данными.

Какого-то приотитета у чистого Си здесь нет.

Мы не обсужали вопрос полезности знания "чистого си" для IT-эрудиции в сравнении с питоном или сишарпом. Мы обсуждали критичность изучения "чистого си" в процессе обучения крестам.

Выравнивание и оператор sizeof спокойно изучаются и в C++,

Мы (я, по крайней мере, точно) говорили про "общую базу" и шансы на её устойчивое освоение в процессе обучения. Так вот, люди, делающие sizeof() от указателя на массив и ожидающие в качестве результата размерность массива встречаются в живой природе.

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

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

Если программист на С++ не хочет использовать умные указатели, это 100% признак того, что он никогда не искал утечку в сишном коде. Если программист на С++ не хочет использовать шаблоны, это 100% признак того, что он никогда не писал две идентичные функции, отличающиеся только типом данных. Дальше можно продолжать примерно по любому пункту из С++.

Проблема, с которой вы сталкиваетесь, вызвана не тем, что людей научили программировать на си, а тем что люди не имеют примерно никакого опыта программирования ни на си, ни на С++. Вы описываете историю, когда осилятор С++ за 21 день, потратил на это два - три дня, и пошёл искать работу с околонулевым опытом разработки на си / с++. Чем тут поможет попытка "не учить си" я не очень понимаю.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Он нужен примерно всегда, когда есть сетевой протокол с двоичными данными.

Только вот тенденции последних десятилетий – протоколы с текстовыми данными. Типа HTTP 1/1 + JSON/XML.

Еще порядок следования байт нужен при двоичной сериализации.

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

Мы обсуждали критичность изучения «чистого си» в процессе обучения крестам.

Да, и пока никаких аргументов в пользу оного нет. Вся зависимая от платформы кухня в таком же виде представлена и в C++.

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

Равно как и те, кто пытаются узнать объем расходуемой на строку памяти через sizeof(std::string).

Если бы они программировали на чистом си хоть чуть-чуть, - и я не имею в виду студенческую лабу - то вопрос об использовании RAII и шаблонов вообще бы не стоял

А вот сейчас уже непонятно.

Во-первых, если мы говорим просто об изучении Си перед изучением С++, то откуда вообще возьмется что-то больше и сложнее студенческой лабы? В лучшем случае их будет несколько, в смысле лаб – не одна, а условно 10-15.

Или мы уже переходим к тому, что для изучения C++ нужен практический опыт работы на Си? Так это уже другой тезис.

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

Только вот если посмотреть по сторонам, даже на персонажей с LOR-а, то можно увидеть, что это далеко не так. Люди продолжают жрать кактус даже не смотря на наличие C++ и, в последние годы, Rust-а.

Можно вспомнить раскаяние автора ZM0, который написал статью о том, что выбор C++ был ошибкой. Можно найти выступление Константина Осипова, который стоял за Tarantool-ом, о недостатках C++ и выборе в пользу Си. Да можно даже Линуса нашего Торвальдса вспомнить.

Если программист на С++ не хочет использовать шаблоны, это 100% признак того, что он никогда не писал две идентичные функции, отличающиеся только типом данных.

В том-то и проблема, что пишут и копипастят только в путь. И в лучшем случае оправдание «ой, я и не подумал», а обычно «я не умею в шаблоны, это сложно, поэтому делаю как проще».

Проблема, с которой вы сталкиваетесь, вызвана не тем, что людей научили программировать на си, а тем что люди не имеют примерно никакого опыта программирования ни на си, ни на С++.

Да? Ну OK, вы, вероятно, лучше знаете с кем мне приходилось работать.

eao197 ★★★★★
()
Ответ на: комментарий от No

Авторы библиотеки qtmqtt также считали, и теперь приходится ее патчить для работы на AR9344

Поскольку патчите ее вы, а не авторы qtmqtt, то им все еще не нужно знать про порядок следования байт. Так что не вижу противоречий.

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

Если уж говорить о том, что на разных платформах есть разный порядок следования байт, разные наборы регистров и пр., то тут полезнее было бы знакомство с ассемблером, а лучше с несколькими.

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

Но ведь меня пытаются убедить в том, что перед изучением C++ следует изучить Си. Что, имхо, вовсе не обязательно.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

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

Ассемблеры малополезны тем, кто таких вещей не знает.

vM ★★
()
Ответ на: комментарий от vM

Ассемблеры малополезны тем, кто таких вещей не знает.

Да, чистый Си в этом смысле гораздо полезнее, ага.

Блин, я так смотрю, здесь радетели идеи о том, что изучение Си должно предшествовать изучению C++, пытаются меня в чем-то убедить.

Ну OK, расскажите, плз, какие такие уникальные штуки есть в Си, которые нельзя изучить непосредственно в С++?

Пока что был один аргумент от LamerOk о том, что средневзвешенный войтишник толком не осилит ни Си, ни С++, но если начнет изучать с Си, то больше шансов, что он хоть что-то выучит.

Да, вроде как аргумент, но меня не волнуют проблемы средневзвешенных войтишников. ИМХО, чем больше бездарей не пройдут входной барьер, тем лучше будет рабочая среда вокруг меня.

Какие-то еще аргументы?

eao197 ★★★★★
()
Ответ на: комментарий от vM

Изучение платформы нельзя заменить изучением языков и ассемблеров.

У меня есть ощущение, что вы не следите за разговором. Был тезис о том, что Си полезен для того, чтобы узнать о порядке следования байт:

Теперь представьте, что они всё это знают, но не имеют ни малейшего понятия о порядке байт

Так вот я говорю о том, что:

a) Си не нужен для того, чтобы узнать о порядке следования байт;

b) ассемблер гораздо лучше приблизит человека к этому знанию, чем чистый Си.

Раз вы зачем-то мне что-то пишете, значит вы не согласны с каким-то из этих тезисов.

Судя по вашим словам сразу с обоими. Я вас правильно понял?

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от eao197

Ваш спор в принципе ни о чем, т.к. синтаксис языка С является частью синтаксиса языка С++, за исключением очень небольшого количества моментов.

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

Поэтому суть вашей дискуссии сводится к тому, что нужно ли при обучении С++ искусственно ограничивать себя его подмножеством? Нужно ли перед изучением std::string рассказывать про char*, имеет ли смысл при работе с массивами вначале работать с int[], а не начинать сразу с std::vector? Если для лучшего понимания железа, то на мой сегодняшний взгляд, не нужно. Если обучение идет под конкретную цель, где это нужно, то нужно.

Если нужно, чтобы студент/школьник понял как все устроено, то лучше это не через низкоуровневые элементы языка понимать, а через того же Танненбаума.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Ваш спор в принципе ни о чем, т.к. синтаксис языка С является частью синтаксиса языка С++, за исключением очень небольшого количества моментов.

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

Исходя из этого я вижу «изучение Си» в виде приобретения навыка разработки на Си с использованием различных применимых в чистом Си идиом (goto cleanup, рукопашная эмуляция ООП на указателях на функции, коллбэки с void* указателем в качестве контекста, opaque types с функциями create_/destroy_, борьба с копипастой посредством макросов и пр.).

Так вот, повторюсь, ИМХО, ничего из этого для изучения С++ не нужно. А скорее даже и вредно.

имеет ли смысл при работе с массивами вначале работать с int[], а не начинать сразу с std::vector

В современном C++ лучше сразу с std::array, а не std::vector.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

и пока никаких аргументов в пользу оного нет.

Противоречите сами себе:

Пока что был один аргумент от LamerOk о

Было минимум два, вы тактически проигнорировали оба:

в реальном мире изучатели С++ изучают его от силы 7-10 условных дней, а потом кидаются в собесы и пет-прожекты. Если в эти 7-10 дней попадёт статический полиморфизм на шаблонах, но не попадёт видимость имён при компоновке и концепция opaque pointer’а - результат обучения будет не рабочим.

есть смысл не только учить си перед обучением С++, но есть и смысл даже программировать на си некоторое время - хотя бы один проект под сотню функций. Именно этот опыт ВНЕЗАПНО является одновременно и отличным мотиватором, и отличным дидактическим материалом к обучению крестам - становится понятно, какие именно проблемы и как именно они решают.

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

Потому что "изучить си" == "изучить обущю базу си и с++" - это не полистать несколько страничек учебника. Это как минимум один, а лучше - два три сколько-нибудь "реальных" проекта. Си не учится по учебнику точно так же как не учится С++. Да и любой другой язык программирования, с семантикой и синтаксисом сложнее бейсика.

Только вот если посмотреть по сторонам, даже на персонажей с LOR-а,

Персонажи с лора как раз показательны. Персонажи с лора - необучаемые. Не существует способа обучить С++ необучаемого персонажа.

И моё "по сторонам" отличается от вашего - хорошие (с моей колокольни) программисты на С++ (я, разумеется, говорю не о себе) легко переключаются си и обратно.

Можно вспомнить раскаяние автора ZM0,

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

а обычно «я не умею в шаблоны, это сложно, поэтому делаю как проще».

Про необучаемых было выше.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 3)
Ответ на: комментарий от eao197

Я выше вроде бы говорил, что не очень понимаю, что вкладывают в понятие «изучать Си».

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

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Было минимум два, вы тактически проигнорировали оба:

Неправда ваша.

Первый аргумент не аргумент вовсе, т.к. вы говорите о вещах, мне неведомых. Может вы и сталкиваетесь с «в реальном мире изучатели С++ изучают его от силы 7-10 условных дней», но это не повод выдавать это за общую тенденцию.

Про второй аргумент я как раз упомянул. Не вашими словами, конечно, его сформулировал, но упомянул.

Это как минимум один, а лучше - два три сколько-нибудь «реальных» проекта.

Значит вы говорите не про изучение (в плане обучения как в ВУЗе в рамках конкретного курса), а про работу на языке. Это уже другое.

Мы обсуждаем причины недоученности С++

«Мы»?

Вообще-то я нет. Я обсуждаю нужно ли учить Си перед C++ и есть ли от этого польза.

«Недоученность C++» как понятие «вообще» имеет множество причин.

В данном конкретном разговоре я высказываю то наблюдение, что привычка использовать подходы из чистого Си (которые принимаются компилятором и даже работают) не дает людям использовать более удобные инструменты из C++. В силу привычки.

Не было бы такой привычки, было бы лучше. Отсюда и мой вывод о том, что учить Си перед C++ скорее вредно, чем полезно.

eao197 ★★★★★
()
Ответ на: комментарий от LamerOk

Понять и освоить использование на практике пересекающегося подмножества си и с++.

Ну т.е. то, что я выразил словами:

Исходя из этого я вижу «изучение Си» в виде приобретения навыка разработки на Си с использованием различных применимых в чистом Си идиом (goto cleanup, рукопашная эмуляция ООП на указателях на функции, коллбэки с void* указателем в качестве контекста, opaque types с функциями create_/destroy_, борьба с копипастой посредством макросов и пр.)

Если да, то мой вывод сделан там же, откуда была взята и цитата.

eao197 ★★★★★
()
Ответ на: комментарий от soomrack

Нужно ли перед изучением std::string рассказывать про char*, имеет ли смысл при работе с массивами вначале работать с int[], а не начинать сразу с std::vector? Если для лучшего понимания железа, то на мой сегодняшний взгляд, не нужно. Если обучение идет под конкретную цель, где это нужно, то нужно.

Если нужно, чтобы студент/школьник понял как все устроено, то лучше это не через низкоуровневые элементы языка понимать, а через того же Танненбаума.

Про "железо" согласен, про "танненбаума" - нет. Семантика того С++, которого нет в си, хотим мы этого или нет, - это надстройка поверх общей базы. Невозможно объяснить смартпоинтер без объяснения концепции указателей. Невозможно объяснить array/vector без объяснения семантики адресной арифметики.

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

LamerOk ★★★★★
()
Ответ на: комментарий от eao197

Может вы и сталкиваетесь с «в реальном мире изучатели С++ изучают его от силы 7-10 условных дней», но это не повод выдавать это за общую тенденцию.

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

Значит вы говорите не про изучение (в плане обучения как в ВУЗе в рамках конкретного курса), а про работу на языке. Это уже другое.

В моей картине мира это синонимы. Программирование хоть си, хоть с++ осваивается только на практике.

Мы обсуждаем причины недоученности С++

Вообще-то я нет.

А я да - и мою фразу следует рассматривать в этом контексте, что, однако, вообще никак не меняет сути - это случаи не имеют отношения к разговору.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Программирование хоть си, хоть с++ осваивается только на практике.

Тогда мы говорим о разных вещах.

Я говорю про изучение языка как о чтении учебника по нему, знакомства с его понятиями, конструкциями, основными элементами стандартной библиотеки, выполнение каких-то небольших упражнений (в случае ВУЗоского курса – лабораторных). Т.е. такое знакомство с языком, которое через некоторое обозримое время дает возможность начать программировать на этом языке.

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

eao197 ★★★★★
()
Ответ на: комментарий от eao197

я высказываю то наблюдение, что привычка использовать подходы из чистого Си (которые принимаются компилятором и даже работают) не дает людям использовать более удобные инструменты из C++. В силу привычки.

Не было бы такой привычки, было бы лучше. Отсюда и мой вывод о том, что учить Си перед C++ скорее вредно, чем полезно.

Это всё опять же неявно подразумевает, что если бы они учили С++, то они тут же ухватили концепцию шаблонов и строчили бы static_assert’ы через строку. Я полагаю, что это допущение ложно. Если человек не способен (не хочет?) освоить шаблоны, то он будет бездумно копипастить готовые примеры из учебников, а сам продолжать писать без них.

LamerOk ★★★★★
()
Ответ на: комментарий от eao197

Я говорю про изучение языка как о чтении учебника по нему,

Это вообще из истории волшебных фей. Без редактора кода и N-циклов "напиши - скомпилируй - прогони" ни си, ни С++ не учатся. Физически.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Невозможно объяснить array/vector без объяснения семантики адресной арифметики.

Прекрасно можно. Зачем там говорить про адреса? Наоборот, эта избыточность информации вредна, т.к. подменяет понятие контейнера его физической реализацией, которая, вообще говоря, может сильно различаться в разных реализациях.

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

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

можно с алгоритмов и высокоуровневой организации информации. Это разные пути

Тогда нужна книга не по C++, а по алгоритмам, структурам и абстрактным типам данных

vM ★★
()
Ответ на: комментарий от LamerOk

Это вообще из истории волшебных фей. Без редактора кода и N-циклов «напиши - скомпилируй - прогони» ни си, ни С++ не учатся. Физически.

Вы упустили важный фрагмент той фразы, из которой взяли цитату:

выполнение каких-то небольших упражнений (в случае ВУЗоского курса – лабораторных)

Но я исхожу из того, что есть несколько стадий:

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

  2. Освоил язык в результате M лет промышленного программирования на нем.

Сейчас речь веду именно про первую стадию.

PS. Кстати говоря, в том же С++ на первой стадии можно знать даже больше, чем на второй. Поскольку в промышленном программировании каких-то вещей в силу специфики проектов может не быть.

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)