Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/41: Рейтинг темы: голосов - 41, средняя оценка - 4.93
 Аватар для _LoLo_
2 / 2 / 0
Регистрация: 03.05.2021
Сообщений: 6

Как эффективно изучать язык Си?

10.05.2021, 22:27. Показов 10111. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Тут и, вообще, в Интернете довольно много разных книг и других ресурсов по теме - вкусы и методы обучения разные. Язык сам по себе очень притягательный, особенно на Линукс - всё под рукой, раздолье для программиста, прям и затягивает "под капот", хочется узнать как там внутри всё на самом деле работает, или научиться ещё какой-то функцией пользоваться на ночь глядя... Уже больше полугода перешел на Линукс, Pop!_OS. Записался на CS50, пока что (на 6-ой неделе) "отличник", хотя и приходится попотеть (иногда выполнение д/з может затянуться на несколько недель). Цель - когда-нибудь написать свою программу, желательно под Линукс, внести свой посильный вклад в OSS, а ещё круче - добавить свой код в Линукс, который изначально заточен под C.

Опыт показывает, что наилучший способ научиться делать что-то хорошо - повторение и работа над ошибками. Вот и пишу маленькие коды как начинающий программист, практикуюсь в свои 45 лет. Беру где попало, особенно на CodeWars. Но... Чувствую, что чего-то не хватает. Как работает та или иная функция или концепция понятно, а почему - не совсем. Например, создавать и работать с объединениями (union) могу, а вот как они могут понадобиться на практике, в чём их польза (не от балды же разработчики его придумали!) и почему место в памяти выделяется наибольшему по размеру элементу объединения (в отличие от struct) не понятно.

Может целенаправленной системы обучения/теории мне не хватает? Как-никак, человек я старого поколения, привык, чтобы всё было по конкретной программе и учебникам, с азов (даже если трудно поначалу), с постепенным усложнением, а не по практикумам (tutorial) на Youtube, хотя и там много чего интересного разузнал. А на Западе, как я вижу (могу и ошибаться), учебный процесс построен по принципу "быстрее, легче, веселее, рентабельнее". Могут сильно упрощать любую сложную тему лишь бы обучающийся быстрее достиг результата, а соответственно и быстрее обеспечил прибыль взамен потраченного на него времени и денег. Тут ничего плохого нет, только "издержки" - лощёные языки более высокого уровня абстракции, вроде Python. Но это отдельная тема для разговора.

Да, CS50 - идея хорошая, но по мне - слишком обобщённая. Многое приходится искать самому, доучивать по другим источникам; задания хоть и выполнимые, объяснение конкретных целей и методов использования некоторых базовых концепций языка оставляет желать лучшего. Например, только недавно постиг истинный смысл указателей на указатели (double indirection или double pointers), в частности на примере использования строк и структур. Попутно сделал открытие - оказывается, C можно с уверенностью называть "языком указателей, да и только!"

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

А как начинали Вы? Что посоветуете?

Заранее большое спасибо!

Рустам
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2021, 22:27
Ответы с готовыми решениями:

Как начать с 0 изучать язык СИ?
Привет всё, я студент второго курса(Программирование в компьютерных системах) Язучаем язык Си. Я такой человек, который быстро всё не...

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

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

63
 Аватар для _LoLo_
2 / 2 / 0
Регистрация: 03.05.2021
Сообщений: 6
11.05.2021, 21:49  [ТС]
Студворк — интернет-сервис помощи студентам
И кто меня за язык тянул про объединения?!...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
union patsany
{
    char brata01;
    int brata02;
};
 
int main(void)
{
    union patsany Mnenie;
    Mnenie.brata01 = 'A';
 
    if (Mnenie.brata01 == Mnenie.brata02)
    {
        puts("Мир!");
    }
    else
    {
        puts("Будь оно неладно!");
    }
 
    return 0;
}
Рустам
0
фрилансер
 Аватар для Алексей1153
6506 / 5756 / 1134
Регистрация: 11.10.2019
Сообщений: 15,404
11.05.2021, 22:16
Цитата Сообщение от mashmed135 Посмотреть сообщение
И я всё ещё жду ответа на вопрос о других применениях union-ов.
а я применял их только для одного - парс железячных форматов с битовыми полями
1
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
11.05.2021, 22:33
Цитата Сообщение от CoderHuligan Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <math.h>
 
union{
 int a;
 int b;
 char c;
 float d;
}ua;
int main(void)
{
  int i;
  for(i=0; i<ua.a; ++i);//что-то делаем
  for(i=0; i<ua.b; ++i);// просто для синтаксического выделения
  //потом нам понадобилось что-то сделать  с char
  printf("%c", ua.c);
  //потом нам понадобилось вычислить float
  ua.d = 2*3.14*powf(5, 2);
  printf("%f", ua.d);
  //так как по времени все эти переменные 
  //не пересекаются, то  мы можем сэкономить 
  //на памяти и запихнуть их всех в одну переменную
  return 0;
}
Ровно тоже самое, но через обычное приведение типов:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <math.h>
 
char buf[4];
 
int main(){
  int i;
  for(i=0; i<*(int*)buf; i++){} //Do smth
  for(i=0; i<*(int*)buf; i++){} //Do smth
  printf("%c", *(char*)buf);
  *(float*)buf = 2*3.14*powf(5, 2);
  printf("%f", *(float*)buf);
}
Цитата Сообщение от _LoLo_ Посмотреть сообщение
И кто меня за язык тянул про объединения?!
Спасибо что спросили об этом. Как оказалось, даже "профессионалам" не очевидны подробности. Глядишь и выясним что-то новое.
0
 Аватар для _LoLo_
2 / 2 / 0
Регистрация: 03.05.2021
Сообщений: 6
11.05.2021, 22:55  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Спасибо что спросили об этом. Как оказалось, даже "профессионалам" не очевидны подробности. Глядишь и выясним что-то новое.
+1 Добрым молодцам (вроде меня) урок... Не совсем всё понятно, но интересно.
0
фрилансер
 Аватар для Алексей1153
6506 / 5756 / 1134
Регистрация: 11.10.2019
Сообщений: 15,404
12.05.2021, 00:35
Цитата Сообщение от _LoLo_ Посмотреть сообщение
Не совсем всё понятно, но интересно.
так будет ближайшие лет пятнадцать
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
12.05.2021, 09:17
Цитата Сообщение от Алексей1153 Посмотреть сообщение
железячных форматов с битовыми полями
+1
Тоже юзал в такой ипостаси, когда писал под AVR. Битовые поля для МК - мегаудобно!
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
12.05.2021, 10:01
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ровно тоже самое, но через обычное приведение типов:
Нет, не ровно, это работать не будет. Хотя суть верна.
C
1
_Alignas(_Alignof(int) > _Alignof(float) ? _Alignof(int) : _Alignof(float)) char buf[sizeof(int) > sizeof(float) ? sizeof(int) : sizeof(float)];
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
12.05.2021, 10:55
Цитата Сообщение от mashmed135 Посмотреть сообщение
Ровно тоже самое, но через обычное приведение типов:
Нет, не ровно, это работать не будет. Хотя суть верна.
Но ведь работает.
.
Так больше нравится?
C
1
2
3
4
#define MAX(x,y) (((x)>(y))?(x):(y))
#define SIZE MAX(MAX(sizeof(float), sizeof(int)), sizeof(char))
 
char buf[SIZE];
Вообще-то я решил не усложнять пример чтобы эквивалентность приведений типов была очевиднее.
0
 Аватар для CoderHuligan
1754 / 1020 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
12.05.2021, 10:56
Цитата Сообщение от mashmed135 Посмотреть сообщение
Пока что у вас не получилось даже намёка на экономию.
Вы это серьезно или прикалываетесь так?
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
12.05.2021, 10:59
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но ведь работает.
Только на x86, на том же arm упадёт при первом же обращении к int(если только компилятор не подстрахуется и не выставит всем non-local static выравнивание, допустим, _Alignas(max_align_t) с целью исправления кривого кода).

Добавлено через 51 секунду
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вообще-то я решил не усложнять пример чтобы эквивалентность приведений типов была очевиднее.
Вообще суть верна, это было небольшое замечание касательно реализации.
0
 Аватар для CoderHuligan
1754 / 1020 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
12.05.2021, 11:01
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ровно тоже самое, но через обычное приведение типов:
Да нет, не тоже самое! В вашем случае buf - одно единственное имя для разных сущностей, а в моем - много разных имен для разных сущностей, да и с переносимостью могут быть проблемы.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
12.05.2021, 11:02
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вы это серьезно или прикалываетесь так?
Конечно серьёзно. Так вам есть что возразить? А то в вашем сообщении ноль информации по теме.
0
 Аватар для CoderHuligan
1754 / 1020 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
12.05.2021, 11:03
Цитата Сообщение от mashmed135 Посмотреть сообщение
Так вам есть что возразить?
Мне нечего возражать на очевидную глупость.
0
112 / 110 / 30
Регистрация: 08.05.2021
Сообщений: 485
12.05.2021, 11:17
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Мне нечего возражать на очевидную глупость.
Ну, что-то вы совсем "поплыли", вот уже шаблонные ответы пошли.

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

Для публики: существуют универсальные критерии, как отличить специалиста от человека, который просто прочитал что-то в интернете и теперь повторяет везде прочитанное, никоим образом не понимая, что имелось ввиду в оригинале. Вот этот персонаж как раз один из таких "ретрансляторов", что очень хорошо видно на примере данной темы. Главный принцип - только лозунги и ни капли конкретики. На коде данный товарищ сразу же показал полное непонимание.

Забавно на этом фоне смотрятся возгласы про "с переносимостью могут быть проблемы". Можно видеть, что я ранее сообщил про эти проблемы и показал исправление, а эксперт снова ничего не смог. Хотя скорее всего он просто прочёл мой пост и решил выдать мысь за свою.
0
 Аватар для CoderHuligan
1754 / 1020 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
12.05.2021, 11:35
Цитата Сообщение от mashmed135 Посмотреть сообщение
Ну, что-то вы совсем "поплыли", вот уже шаблонные ответы пошли.
Поплыл не я. И то, что ты пишешь далее ко мне не относится, так как я никогда не заявлял себя: 1. экспертом; 2. специалистом. Поплыл ты когда начал за счет других превозносить себя.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
12.05.2021, 11:58
Цитата Сообщение от mashmed135 Посмотреть сообщение
сли только компилятор не подстрахуется и не выставит всем non-local static выравнивание
А, теперь понял о чем вы. О том, что массив char'ов будет выравниваться по 1 байту, то есть попасть на границу машинного слова. А для нормальных переменных выравнивание по своему размеру необходимо. Тут да, согласен. Но исправлять еще и это для простой иллюстрации уже лень.
Но спасибо что напомнили и о такой вещи.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Да нет, не тоже самое! В вашем случае buf - одно единственное имя для разных сущностей, а в моем - много разных имен для разных сущностей, да и с переносимостью могут быть проблемы.
В моем случае выделяется "нетипизированный" кусок памяти, который по надобности кастуется к любому типу.
В вашем выделяется "мультитипизированный" кусок памяти, который кастуется к нужному типу из заданного списка.
В чем принципиальная разница?
Ну кроме синтаксического сахара, который уже озвучили (выравнивание, выбор размера)?
С переносимостью тоже никакой разницы не будет, ведь что там приведение типов, что там. Собственно, поэтому union'ы и используют либо там, где разные приведения не связаны, либо в платформо-зависимой части (тех же контроллерах).
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Мне нечего возражать на очевидную глупость.
Вас просят не опровергать чужую глупость, а подтвердить свою. Как именно union может экономить место?
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,087
12.05.2021, 13:16
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Я показал.
Вы показали обычное приведение типов, а надо было экономию памяти.
0
 Аватар для CoderHuligan
1754 / 1020 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
12.05.2021, 13:35
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы показали обычное приведение типов, а надо было экономию памяти.
Если бы не union мне пришлось бы сделать по крайней мере 3 отдельные переменные: 1. int; 2. float. 3. char. Посчитаем биты. На 32 битных системах int будет 32-битный, и float 32-битный. В итоге получаем: 32+32+8=72 бита. С union я использовал все го 32 бита. 72 > 32 == true. Выигрыш в памяти равен: 72 - 32= 40 бит.
0
 Аватар для _LoLo_
2 / 2 / 0
Регистрация: 03.05.2021
Сообщений: 6
12.05.2021, 13:48  [ТС]
Ребята, это уже второй намёк с моей стороны - Вы про заголовок темы не забыли случайно?
Бог с вами, своё время не жалеете, моё-то пожалейте! Выясняйте отношения в другом месте, пожалуйста.
По теме только первые 2-3 ответа.
Представьте какое у меня мнение о форуме складывается в целом - я пришёл сюда узнать что-то полезное, а тут первое же сообщение-просьба и наталкиваюсь на выяснение отношений...

Спасибо за понимание!

Рустам
1
12.05.2021, 13:56

Не по теме:

_LoLo_, так это штатный процесс изучения языка, нужно привыкать :D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2021, 13:56

Какой язык изучать или что изучать?
Здравствуйте форумчане. какой язык программирования изучать чтоб работать дома через интернет? может 1с? я сам живу в деревне работы нет,о...

Как изучать язык?
Подскажите кто, как изучал JS, ну и какие книги читали?

Как лучше изучать иностранный язык?
Согласитесь ли вы со мной в мысли, что иностранный язык лучше изучать по Разговорникам, чем по грамматике?

Как мне изучать язык java?
Я решил изучить java. С чего мне начать, какие видео уроки посмотреть, какие книги почитать. Только на русском, а то с английским пока что...

Как изучать язык по книге Хейлсберга?
Читаю Хейлсбярга. Во второй главе, сразу, без каких-то пояснений, он пишет код. using System namespace Acme.Collections { public...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru