#50. Ключевые слова static и extern | Язык C для начинающих

  Рет қаралды 5,171

selfedu

selfedu

11 ай бұрын

Практический курс по C/C++: stepik.org/course/193691/
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru/c_base
Ключевые слова static и extern с переменными и функциями. Локальные статические переменные. Ограничение области видимости переменных и функций текущим модулем.

Пікірлер: 29
@anvarx1
@anvarx1 10 ай бұрын
Отличный урок !!! Спасибо за изложения высшего класса. Отслеживаю весь ваш вклад в сообщество изучающих программирование в Ютубе.
@vladis..
@vladis.. 10 ай бұрын
Спасибо вам большое, за те видеоролики где вы на атомы расшипляеете материал и открываете основы программирования. Я студент программист из Украины, и пройдя ваши видеоуроки я стал на голову выше сверстников и преподавателей програмирования моего киевского вуза, но что более важно, стал смотреть на мир по другому, стал более аналитическим человеком. Спасибо вам, очень вас люблю 💜💜💜
@weerbox
@weerbox 10 ай бұрын
"в прототипе функции имена переменных можно опускать, т.к. для компилятора это не имеет никакого значения" Да, но как говорится - есть нюанс. Если в функции в качестве параметров используется двумерный массив переменной длины. Например: void funct(int n, int ar[][n]) и если в прототипе такой функции удалить имена параметров void funct(int, int[][]) то будет ошибка компиляции, т.к. компилятор не сможет определить размерность массива. Поэтому для этого существует такая форма записи прототипа: void funct(int, int[][*])
@electronic008
@electronic008 10 ай бұрын
Замечательные лекции по С! В эту лекцию можно еще добавить о миксе (смешивании) квалификаторов const и extern. Их можно использовать вместе. Обычный шаблон таков: file.h: extern const int a_global_var; file.c: #include "file.h" const int a_global_var = /* константное значение */; И для полноты картины можно также поговорить о квалификаторах inline и volatile (они тоже миксуются)
@user-xm5zl9up4r
@user-xm5zl9up4r 3 ай бұрын
спасибо
@andredru4278
@andredru4278 3 ай бұрын
Спасибо. Уровень!
@vladimirastrelin1719
@vladimirastrelin1719 11 ай бұрын
В Linux int var_main так же как и static var_st обе переменные будут равны нулю. В Windows int var_main выдаст "мусор". Спасибо огромное за урок ! Пояснение на высшем уровне.
@selfedu_rus
@selfedu_rus 10 ай бұрын
Это еще от компилятора зависит, возможно когда выделялась память под стек, то он изначально заполнился нулями. Можно попробовать проверить этот факт.
@kobatrader7375
@kobatrader7375 10 ай бұрын
Хотел увидел уроки по котлину в сравнении с пайтоном, чтоб преподавалрсь в сравнении. И тот и тот язык очень лаконичный.
@user-zv3un7kn5x
@user-zv3un7kn5x Ай бұрын
Здравствуйте! подскажите пожалуйста как на мак в настройках указывать файл! Очень прошу!
@kyami8718
@kyami8718 7 ай бұрын
А как работает например volatile?
@citizenfour2951
@citizenfour2951 9 ай бұрын
Спасибо за урок. 1. В стандарте языка Си нет определений понятий "глобальная" и "локальная" переменная. Я думаю эти два термина ненаучны. Какое настоящее название? 2. Я правильно понял, что это есть три характеристики переменной: класс хранения (где выделить память), время жизни (когда деаллоцировать), и область видимости (откуда есть доступ)?
@selfedu_rus
@selfedu_rus 9 ай бұрын
1. В той среде программистов, что я обитаю, говорят глобальные и локальные - это очень удобно. По научному, может быть что то вроде: переменная области видимости модуля с внешним связыванием (или внутренним связыванием). Но я сомневаюсь, что на практике так будут говорить )) 2. В целом да, возможны нюансы.
@user-cm1ri1sn2u
@user-cm1ri1sn2u 5 ай бұрын
Сергей, помогите разобраться, почему если до main объявить массив и указатель на него, то в main возможно менять адрес указателя, а если этот указатель на глобальный массив объявить в main, но со словом static, то уже не можем? Почему позволяется менять адрес указателя, объявленного в глобальной области, если по идее, всё что объявлено вне main по умолчанию является статическим? Вот так работает. int a[] = {4,5,6}; int* p = a; int main() { p +=1; printf("%d", *p); return 0; } А вот так не позволяет изменить адрес p. int a[] = {4,5,6}; int main() { static int* p = a; p +=1; printf("%d", *p); return 0; }
@selfedu_rus
@selfedu_rus 5 ай бұрын
у меня на gcc позволяет в обоих случаях, возможно как то ваш компилятор по особенному отрабатывает этот момент?
@kobatrader7375
@kobatrader7375 10 ай бұрын
Когда вернётесь к урокам по Пайтону?
@selfedu_rus
@selfedu_rus 10 ай бұрын
А что там, вроде все подробно рассказал?
@kobatrader7375
@kobatrader7375 10 ай бұрын
@@selfedu_rus можно ще бы курс по Пайтону для андроид и дата сайнс, или по автоматизации рутиных операций или по патерном проектировании, а можно новый курс на степике из тех что есть на Ютубе.
@GH-xw1rd
@GH-xw1rd 10 ай бұрын
здравствуйте, у вас будут курсы по аналитике данных?
@selfedu_rus
@selfedu_rus 10 ай бұрын
пока не планирую
@GH-xw1rd
@GH-xw1rd 10 ай бұрын
@@selfedu_rus :(
@user-zw3dt4qx3i
@user-zw3dt4qx3i 10 ай бұрын
2:48 ругается на неинициализированную локальную переменную int var_main (Ошибка С4700, Visual Studio 2019) int main(void) { int var_main; static int var_st; printf("var_main = %d, var_st = %d ", var_main, var_st); return 0; }
@selfedu_rus
@selfedu_rus 10 ай бұрын
Да, все верно, если здесь поставить в компиляторе флаг -Wall, тоже будет предупреждение. Если локальные переменные не инициализированы, то они забиваются шумом, отсюда и это предупреждение.
@weerbox
@weerbox 10 ай бұрын
Подушню. На самом деле ключевое сдово static не влияет на область видимости, т.к. никакой глобальной области видимости в Си нет🤪 (есть область видимости - блока, прототипа функции, функции, файла/единицы трансляции). А влияет на класс хранения, меняя у переменных определенных в блоке продолжительность хранения с автоматической на статическую, оставляя область видимости в пределах блока, и отсутствие связывания, а у переменных определенных вне функций - меняет внешнее связывание на внутренее, оставляя область видимости в пределах файла, и статическую продолжительность хранения.
@hostpost9752
@hostpost9752 8 күн бұрын
А в плюсах так же ?
@JohnSmith-yr7ih
@JohnSmith-yr7ih 11 ай бұрын
Должен ли я изучать язык программирования C перед изучением C++? C++ мне нужен для изучения Unreal Engine
@vladis..
@vladis.. 10 ай бұрын
Формально, вряд-ли нужно его изучать, но конкретно этого автора можно, полезно для понимания
@michaelplatonov
@michaelplatonov 10 ай бұрын
нет, это разные языки
@selfedu_rus
@selfedu_rus 10 ай бұрын
Языки Си - это база для языка С++. Я бы начал с Си.
[실시간] 전철에서 찍힌 기생생물 감염 장면 | 기생수: 더 그레이
00:15
Netflix Korea 넷플릭스 코리아
Рет қаралды 38 МЛН
Header Issues: Guards, Name Mangling, and extern "C"
8:32
Jacob Sorber
Рет қаралды 74 М.
The Embedded Way - The volatile keyword in C
5:47
Siemens Embedded
Рет қаралды 43 М.
Передача адреса переменной в функцию в Си
10:44
Тимофей Хирьянов
Рет қаралды 34 М.
[실시간] 전철에서 찍힌 기생생물 감염 장면 | 기생수: 더 그레이
00:15
Netflix Korea 넷플릭스 코리아
Рет қаралды 38 МЛН