Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/64: Рейтинг темы: голосов - 64, средняя оценка - 4.53
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759

Обучение C++ (первый язык)

14.08.2022, 20:14. Показов 13877. Ответов 146

Студворк — интернет-сервис помощи студентам
C++ как первый язык программирования.

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

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

В новом С++ где ни ткнешь, обширная библиотека шаблонов, абстракций и т.д.
Чрезвычайно полезная для разработки больших проектов, но трудная для подъема новичком (ИМО).

Например, попробуйте написать программу "echo" на C++, используя только ++ные концепции недавнего стандарта.

Вместо
C
1
2
3
for( int i = 1 ; i < argc ; ++i )
    printf( (i == 1) ? "%s" : " %s", argv[i] );
puts( "" );
Получается куча кода, несчетное число реаллокаций памяти и раздутый исполняемый файл.
А анализ производительности? Конкатенация строк через алгоритм:aggregate или алгоритм:stringstream?

Слишком много для начинающего. А начинать с верхних концепций (наследование, шаблоны, итераторы) и полностью обойти вниманием внутреннюю кухню - это выучить еще одного индусоподобного "программиста".

Если кто-то успшешно учил других C++ как первому языку, поделитесь подходом пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2022, 20:14
Ответы с готовыми решениями:

Первый язык программирования на подходе к С++: Паскаль или С?
Привет всем) Думаю что похожие темы уже были. Я решил изучать программирование.Начал с Паскаля но хочу взять за основу C++. И недавно...

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

Kotlin - как первый язык?
Здравствуйте! Седина в бороду - бес в ребро: хочу попробовать выучить язык. Фактически первый (если не учитывать Basic 30 лет назад в...

146
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
19.08.2022, 00:52
Студворк — интернет-сервис помощи студентам
eva2326,

так компилятор это пишет английским по белому

.cpp:7:41: error: too many arguments provided to function-like macro invocation
assert(std::integral_constant<bool, true>::value); // error



Добавлено через 1 минуту
удалось починить так
C++
1
assert((std::integral_constant<bool, true>::value));
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
19.08.2022, 01:01
Цитата Сообщение от Алексей1153 Посмотреть сообщение
так компилятор это пишет английским по белому
Так ведь он пишет о какой то непонятной
Цитата Сообщение от Алексей1153 Посмотреть сообщение
function-like macro invocation
Так это что же получается, нужно макросы учить, что бы понять, о чем пишет компилятор?

Цитата Сообщение от Алексей1153 Посмотреть сообщение
удалось починить так
Объясните пожалуйста, почему assert не получилось использовать как функцию.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
19.08.2022, 01:05
Цитата Сообщение от eva2326 Посмотреть сообщение
не получилось
так получилось же
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
19.08.2022, 01:13
Цитата Сообщение от Алексей1153 Посмотреть сообщение
так получилось же
Случайно получилось?
Или все таки вы изучали макросы, и поэтому в теме?

Вы специально проигнорировали мой вопрос и просьбу в #62 ?
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
19.08.2022, 01:21
eva2326, прямо специально и досконально не изучал, но немного приходилось возиться, когда ещё не знал про STL
А с приходом C++17 я вообще забыл про макросы
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
19.08.2022, 01:24
Цитата Сообщение от Алексей1153 Посмотреть сообщение
прямо специально и досконально не изучал
Вы не ответили на мои вопросы.
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
19.08.2022, 01:27  [ТС]
Языком с++ можно пользоваться как игрушкой, подкручивая свойства объектов из IDE и наблюдая как меняются цвета и размеры окошек.

Такой уровень меня не устраивает. Мне нужно чтобы ученик вникал и углублялся сам, и для этого я учу и макросам, и с/Паскаль/стандарт соглашению по вызову функций, и почему компилятор про sizeof() знает, а про strlen() - ни разу.

Вчера разбирали почему

C
1
printf( "%d %u %f", -1, "abc", 0.1 );
Правильно печатает первое и последнее значения, на 64-битной ОС.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,530
19.08.2022, 07:18
Алексей1153, зачем вообще использовать assert, если есть функция static_assert, которая срабатывает на этапе компиляции?
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
19.08.2022, 07:40  [ТС]
static_assert() это не функция.

assert() делает вещи, которые static_assert() не может.

Но мы отклоняемся.

Кроме #макро, которые придется если не писать, то хотя бы понимать, есть ли ещё "трудные в изучении" части С, которые C++ позволяет пропустить за ненадобностью?

Я не вижу таковых, что укрепляет мое мнение : весь объем языка С необходимо знать, чтобы считаться C++ программистом.
А если это так, то стоит провести черту между ними, что позволяет владеть обоими языками, а не только C++.

Можно сделать комментарий что для с++ программиста некоторые части libc неактуальны. Можно прожить не ведая про strtok(), asctime(), atoi() и ещё подсотни старомодных функций, для которых существует адекватная замена в C++.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,530
19.08.2022, 07:47
QueryMonkey, да, я знаю, что static_assert не функция, а объявление, но не в этом суть. Кстати, static_assert тоже делает вещи, которые не может assert.
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
19.08.2022, 08:06  [ТС]
static_assert это просто #if() принимающий более сложные константные выражения.

Борланд умел #if(sizeof(var) == 4) ещё в прошлом веке.

Ничто не ново под луной.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
19.08.2022, 08:09
Royal_X, QueryMonkey, assert - это проверка на этапе выполнения, static_assert - это проверка на этапе компиляции
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
19.08.2022, 08:33  [ТС]
Да, это так. Разве а моем ответе что-то не состыковалось?
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
19.08.2022, 08:53
QueryMonkey, #if #else #endif - это препроцессорное ветвление кода. То есть, ещё до компиляции
1
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,474
19.08.2022, 09:23
Цитата Сообщение от QueryMonkey Посмотреть сообщение
Трудно всосать темплейты и полиморфизм для тех, кто не знает макросы и указатели.
А если собрать все, что нужно для обучения С++, набирается в аккурат на почти весь C.
И что? Это повод начать изучать Си? Тогда и Java может прихватите за одно? - там тоже наберётся аккурат почти вся джава.
Макросы, указатели - в плюсах есть и активно используются. А ещё ООП, Шаблоны, Ссылки.

Мне кажется (судя по вашим комментариям в этой теме) - вы просто сами в своё время пришли в плюсы через Си. Изучили хорошо последний, а уж потом начали вникать в С++. Поэтому и выбрали подобный стиль обучения.
А я вот пришёл в плюсы с абсолютного нуля, а не через заднюю сишную дверь. И (моё имхо - не более) если я хочу изучить С++, а мне вдруг препод начнёт толкать Си - у меня возникнут вопросы - а он точно C++ знает? А может он Си с классами будет нам в голову вдалбливать? А оно мне надо? Может всё-таки найти того, кто в плюсах разбирается, а не в Си с классами?

Цитата Сообщение от QueryMonkey Посмотреть сообщение
Мне нужно чтобы ученик вникал и углублялся сам, и для этого я учу и макросам, и с/Паскаль/стандарт соглашению по вызову функций, и почему компилятор про sizeof() знает, а про strlen() - ни разу.
Это всё замечательно - я сам стараюсь (по мере возможностей ) вникать в саму суть вещей, а не просто поверхностно изучать что-то. Это конечно сложно, долго, некоторые вещи мне, например, стали понятны лишь спустя несколько лет после начала изучения С++. Но я и не форсирую данный процесс. Откладываю на потом, спустя какое-то время, снова возвращаюсь к проблеме - как то так в общем.
Но мне всё равно непонятен подобный идиотизм - зачем учить Си, если нужен С++?
Приведите хоть один "железобетонный" аргумент.

Макросы - а разве их нет в плюсах? Указатели - то же вроде как присутсвуют, а ещё - куча всего того, о чём Сишники и знать не знают оно им снится в страшном сне - ООП, ШАБЛОНЫ, ССЫЛКИ Да, я знаю, что ООП можно замутить и в Си - даже книга есть про это

Цитата Сообщение от eva2326 Посмотреть сообщение
Считаете, что конструкция if в языке с++ более интересная, нежели в языке си?
Если я не планирую пользоваться Си - то мне всё-равно как там в нём if работает. Предположу, что так же как и в С++.

Да и вообще, господа, участвующие в дискуссии, тут многие пишут - зачем использовать то, сё если есть то-то. Вот я, например, до недавнего времени вообще не знал как пользоваться функцией printf - она мне нафиг не нужна была, потому как есть cout и плюсовые потоки. Но вот появилась необходимость изучить системное в линуксе - а там все примеры с
C++
1
printf
, да и вообще код изначально Сишный, что вообще никак мне не мешает компилировать его как плюсовый. Почитал, посмотрел, попробовал - более-менее стал разбираться.

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

Хотите изучать С++ - учите С++, хотите Си - учите Си. Давайте ещё перед изучением Java или C# советовать Си изучать. А что - лишним точно не будет.
2
2405 / 1937 / 763
Регистрация: 27.07.2012
Сообщений: 5,575
19.08.2022, 10:04
Цитата Сообщение от QueryMonkey Посмотреть сообщение
Я тоже так думал, пока не попробовал написал план уроков не предполагающий знания С.
Трудно всосать темплейты и полиморфизм для тех, кто не знает макросы и указатели.
А если собрать все, что нужно для обучения С++, набирается в аккурат на почти весь C.
Имхо, ваша проблема в том, что вы базовые конструкции языка пытаетесь называть другим языком. Да, фактически в этой части Си и С++ идентичны, так как один возник на основе другого (даже из названия видно), но учеников эта ретроспектива, как мне кажется, будет только сбивать с толку и отвлекать. Си ведь тоже не на пустом месте появился, но очевидно, что такой подход к изучению языка, мягко говоря, неэффективен.

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

Цитата Сообщение от QueryMonkey Посмотреть сообщение
Трудно всосать темплейты <...> для тех, кто не знает макросы <...>.
Имхо, если вы будете объяснять шаблоны через макросы, боюсь, ничего хорошего из этого не выйдет. Это сильное упрощение.
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.08.2022, 11:09
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Считаете, что конструкция if в языке с++ более интересная, нежели в языке си?
Да
C++
1
2
   if(auto it=cont.begin(), end=cont.end(); it!=end && ++it!=end)
      cout << *it;
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
19.08.2022, 17:52  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
QueryMonkey, #if #else #endif - это препроцессорное ветвление кода. То есть, ещё до компиляции
Я написал фвумя постами выше,
Борланд умел #if(sizeof(var) == 4) ещё в прошлом веке.
Кому надо было, тот сделал не дожидаясь появления static_assert. Программисты оценили.

Добавлено через 3 минуты
Я заплюсовал ваш ответ, как информативный и полезный.

По поводу

Цитата Сообщение от John Prick Посмотреть сообщение
Имхо, если вы будете объяснять шаблоны через макросы, боюсь, ничего хорошего из этого не выйдет. Это сильное упрощение.
я как раз собирался объяснять шаблоны методом сравнения с макросами, т.к. они решают несколько проблем, которые традиционно решались через макросы.

Добавлено через 5 минут
Recrut_rf, Вы сказали что начинали с изучения C++ не зная С, и сейчас этим языком (C++) владеете.

Вы можете сказать, что знаете C?

Если да - то как вы определили подмножество языка C++ которое составляет C?

cout << "4" -"2"; // это какой язык?
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,474
19.08.2022, 18:42
Цитата Сообщение от QueryMonkey Посмотреть сообщение
Вы можете сказать, что знаете C?
Исключительно в той части, в которой он пересекается с С++. Специально Си никогда не изучал, хотя иногда возникает желание заняться этим - но пока не до него.

Цитата Сообщение от QueryMonkey Посмотреть сообщение
Если да - то как вы определили подмножество языка C++ которое составляет C?
Проще простого - в плюсах, когда подключаем какую либо либу через заголовочный файл из состава стандартной библиотеки, всё, что заканчивается .h (string.h, math.h и т.д.) в конце или же начинается с символа с (тот же cstring) - это естЪ наследство от Си.
Плюсовые либы именуются просто названиями - vector, string и т. д.

Цитата Сообщение от QueryMonkey Посмотреть сообщение
cout << "4" -"2"; // это какой язык?
Спросили бы что-нибудь по-сложнее что ли, а то неинтересно как-то
Чистейшие плюсы - в Си нет объектов, а cout это глобальный потоковый объект С++.

Добавлено через 5 минут
Цитата Сообщение от QueryMonkey Посмотреть сообщение
cout << "4" -"2"; // это какой язык?
перегрузки операторов в Си по-моему тоже нет, хотя вот тут я уже не уверен...
А в плюсах << специально перегружен для объекта cout

Так же можно перегрузить и для своего класса.
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
19.08.2022, 18:48  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Спросили бы что-нибудь по-сложнее что ли, а то неинтересно как-то
Это С.

C
1
2
3
4
5
6
7
8
9
10
11
$ cat a.c
#include <stdio.h>
 
int main ()
{
    int cout = 1;
    cout << "4" -"2"; // это какой язык?
}
$ gcc a.c 
$ ./a.out
$
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.08.2022, 18:48

C# как первый язык программирования
Добрый день. Решил изучить язык C# для начала, а потом и ASP.NET для трудоустройства. Раньше в институте изучал Delphi и С, но очень...

Первый/основной язык программирования
Первый/основной язык программирования как концепт учебного процесса с целью импортозамещения ПО. Название темы немного мудрёное....

JavaScript как первый язык
Здравствуйте. Я решил начать изучать программирование, одно время сделал свой выбор на языке Python, но он мне ? показался несколько...

Питон, как первый язык программирования
питон как первый язык программирования пойдёт ли ?

Python для первой работы, но не первый язык
Всем доброго времени суток! Мне 20 лет, живу в Москве, занимаюсь интернет-маркетингом и параллельно учусь в ВУЗе на заочке на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru