Что такое void и volatile? - C (СИ)
Формулировка задачи:
Всем привет
Уже 2 недели по немного изучаю С по книге Герберта Шилдта. Дошел до 48 страницы (из 800 всей книги) Все оказалось очень просто и понятно, раз в 20 проще чем веб язык PHP. Особенно про типы данных, видимости переменных и прочее, стандарт и историю С89. Правда тяжело вникать в философские термины, типа "модификатор", "квалификатор", "идентификатор", "атомарность" и прочие. Приходиться смотреть в энциклопедии что это такое. Но некоторые просто вообще не понять. Что такое тип данных volatile? Это, приблизительно "переменная не имеющая значения". Что это за ужасный бред создателей стандарта С89? Как это можно понять? То есть надо писать, если ф-я не возвращает значения, вот так:
почему нельзя вот так написать:
без void? Это очень странно, как то? Это то же самое что выдавать паспорт человеку который ещё не родился.
Как может быть переменная которая не имеет значения? Переменная всегда должна иметь значение. Не бывает переменных без значения. То есть:
какая польза от ^ этой строчки? Где я могу использовать объявленную переменную i не имеющую значения? Это наверное любовь к порядку и полной ясности.
-
Далее на 47 странице идет объяснение квалификаторов const и volatile. С const все понятно, если есть в программе переменная, как блок не изменяемых данных, то добавляем const, сообщая компилятору что это константа. То есть квалификатор const не для программиста предназначен, а для компилятора. Тогда при компиляции программы, компилятор так собирает программу с учетом const что она становиться, как бы, более оптимизированной. Можно по-автомату везде по добавлять const во всех переменных если они не изменяются. И ещё const пишем для защиты данных на которые может ссылаться указатель в параметрах функции, что бы код в функции не смог внести изменения в аргумент который ей передается. Хотя не понять, если мне надо написать функцию что бы она не изменяла значение аргумента - то конечно напишу такую функцию, и мне не надо уточнять параметр функции квалификатором const, потому что она и так не будет изменять аргумент. Либо const это ещё от защиты от не внимательности программиста?
Да, собственно вопрос о volatile. Согласно книге Шилдта "Квалификатор volatile сообщает компилятору, что значение переменной может изменятся не явно" Далее какое то не понятное объяснение применения квалификатора volatile. Как это, "значение переменной может изменятся не явно"? Её что духи могут изменять которые в оперативной памяти находятся? (шутка) Если есть переменная то должно быть её значение, то есть должно быть использование оператора "=" присваивания и ей должно присваиваться значение, как правильно сказать явно. Просьба помочь с пониманием этих штук в С void и volatile. Это наверное самое не понятное что есть в С. Эти штуки как то связаны с компилятором языка, и может быть можно сильно не вникать в их суть. Далее в книге ещё идет объяснение спецификаторов хранения: extern, static, register, auto. Это тоже как то не понятно. А с остальным мне кажется можно разобраться, с указателями и массивами в С.
Спасибо.
void manual_function() { printf("Response from manual function\n"); }
manual_function() { printf("Response from manual function\n"); }
void unsigned i;
Решение задачи: «Что такое void и volatile?»
textual
Листинг программы
#include <Windows.h> bool g_fStopThread = false; DWORD _stdcall ThreadProc(PVOID Param) { while (!g_fStopThread) {} return 0; } int main() { HANDLE const hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); Sleep(1000); g_fStopThread = true; WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); return EXIT_SUCCESS; }
Объяснение кода листинга программы
- Объявляется булева переменная
g_fStopThread
типаbool
со значениемfalse
. - Создается функция
ThreadProc
с использованием директивыDWORD _stdcall
, которая принимает параметрPVOID Param
и возвращаетDWORD
. - В функции
ThreadProc
создается бесконечный цикл, который выполняется до тех пор, пока значение переменнойg_fStopThread
не станетtrue
. - В функции
main
создается объект типаHANDLE
с именемhThread
, который представляет собой поток, созданный функциейCreateThread
. - В функции
main
вызывается функцияSleep
с аргументом1000
, чтобы задержать выполнение программы на 1 секунду. - Значение переменной
g_fStopThread
изменяется наtrue
в функцииmain
. - В функции
main
вызывается функцияWaitForSingleObject
с аргументамиhThread
иINFINITE
, чтобы дождаться завершения потока. - В функции
main
вызывается функцияCloseHandle
с аргументомhThread
, чтобы закрыть поток. - Функция
main
возвращает значениеEXIT_SUCCESS
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д