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

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

10.05.2021, 22:27. Показов 10044. Ответов 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
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
11.05.2021, 22:16
Цитата Сообщение от mashmed135 Посмотреть сообщение
И я всё ещё жду ответа на вопрос о других применениях union-ов.
а я применял их только для одного - парс железячных форматов с битовыми полями
1
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,086
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
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
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
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,086
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
1753 / 1019 / 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
1753 / 1019 / 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
1753 / 1019 / 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
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
12.05.2021, 11:35
Цитата Сообщение от mashmed135 Посмотреть сообщение
Ну, что-то вы совсем "поплыли", вот уже шаблонные ответы пошли.
Поплыл не я. И то, что ты пишешь далее ко мне не относится, так как я никогда не заявлял себя: 1. экспертом; 2. специалистом. Поплыл ты когда начал за счет других превозносить себя.
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,086
12.05.2021, 11:58
Цитата Сообщение от mashmed135 Посмотреть сообщение
сли только компилятор не подстрахуется и не выставит всем non-local static выравнивание
А, теперь понял о чем вы. О том, что массив char'ов будет выравниваться по 1 байту, то есть попасть на границу машинного слова. А для нормальных переменных выравнивание по своему размеру необходимо. Тут да, согласен. Но исправлять еще и это для простой иллюстрации уже лень.
Но спасибо что напомнили и о такой вещи.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Да нет, не тоже самое! В вашем случае buf - одно единственное имя для разных сущностей, а в моем - много разных имен для разных сущностей, да и с переносимостью могут быть проблемы.
В моем случае выделяется "нетипизированный" кусок памяти, который по надобности кастуется к любому типу.
В вашем выделяется "мультитипизированный" кусок памяти, который кастуется к нужному типу из заданного списка.
В чем принципиальная разница?
Ну кроме синтаксического сахара, который уже озвучили (выравнивание, выбор размера)?
С переносимостью тоже никакой разницы не будет, ведь что там приведение типов, что там. Собственно, поэтому union'ы и используют либо там, где разные приведения не связаны, либо в платформо-зависимой части (тех же контроллерах).
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Мне нечего возражать на очевидную глупость.
Вас просят не опровергать чужую глупость, а подтвердить свою. Как именно union может экономить место?
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,086
12.05.2021, 13:16
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Я показал.
Вы показали обычное приведение типов, а надо было экономию памяти.
0
 Аватар для CoderHuligan
1753 / 1019 / 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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru