Что такое void и volatile? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет Уже 2 недели по немного изучаю С по книге Герберта Шилдта. Дошел до 48 страницы (из 800 всей книги) Все оказалось очень просто и понятно, раз в 20 проще чем веб язык PHP. Особенно про типы данных, видимости переменных и прочее, стандарт и историю С89. Правда тяжело вникать в философские термины, типа "модификатор", "квалификатор", "идентификатор", "атомарность" и прочие. Приходиться смотреть в энциклопедии что это такое. Но некоторые просто вообще не понять. Что такое тип данных volatile? Это, приблизительно "переменная не имеющая значения". Что это за ужасный бред создателей стандарта С89? Как это можно понять? То есть надо писать, если ф-я не возвращает значения, вот так:
void manual_function() {
    
    printf("Response from manual function\n");
}
почему нельзя вот так написать:
manual_function() {
    
    printf("Response from manual function\n");
}
без void? Это очень странно, как то? Это то же самое что выдавать паспорт человеку который ещё не родился. Как может быть переменная которая не имеет значения? Переменная всегда должна иметь значение. Не бывает переменных без значения. То есть:
void unsigned i;
какая польза от ^ этой строчки? Где я могу использовать объявленную переменную i не имеющую значения? Это наверное любовь к порядку и полной ясности. - Далее на 47 странице идет объяснение квалификаторов const и volatile. С const все понятно, если есть в программе переменная, как блок не изменяемых данных, то добавляем const, сообщая компилятору что это константа. То есть квалификатор const не для программиста предназначен, а для компилятора. Тогда при компиляции программы, компилятор так собирает программу с учетом const что она становиться, как бы, более оптимизированной. Можно по-автомату везде по добавлять const во всех переменных если они не изменяются. И ещё const пишем для защиты данных на которые может ссылаться указатель в параметрах функции, что бы код в функции не смог внести изменения в аргумент который ей передается. Хотя не понять, если мне надо написать функцию что бы она не изменяла значение аргумента - то конечно напишу такую функцию, и мне не надо уточнять параметр функции квалификатором const, потому что она и так не будет изменять аргумент. Либо const это ещё от защиты от не внимательности программиста? Да, собственно вопрос о volatile. Согласно книге Шилдта "Квалификатор volatile сообщает компилятору, что значение переменной может изменятся не явно" Далее какое то не понятное объяснение применения квалификатора volatile. Как это, "значение переменной может изменятся не явно"? Её что духи могут изменять которые в оперативной памяти находятся? (шутка) Если есть переменная то должно быть её значение, то есть должно быть использование оператора "=" присваивания и ей должно присваиваться значение, как правильно сказать явно. Просьба помочь с пониманием этих штук в С void и volatile. Это наверное самое не понятное что есть в С. Эти штуки как то связаны с компилятором языка, и может быть можно сильно не вникать в их суть. Далее в книге ещё идет объяснение спецификаторов хранения: extern, static, register, auto. Это тоже как то не понятно. А с остальным мне кажется можно разобраться, с указателями и массивами в С. Спасибо.

Решение задачи: «Что такое 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;
}

Объяснение кода листинга программы

  1. Объявляется булева переменная g_fStopThread типа bool со значением false.
  2. Создается функция ThreadProc с использованием директивы DWORD _stdcall, которая принимает параметр PVOID Param и возвращает DWORD.
  3. В функции ThreadProc создается бесконечный цикл, который выполняется до тех пор, пока значение переменной g_fStopThread не станет true.
  4. В функции main создается объект типа HANDLE с именем hThread, который представляет собой поток, созданный функцией CreateThread.
  5. В функции main вызывается функция Sleep с аргументом 1000, чтобы задержать выполнение программы на 1 секунду.
  6. Значение переменной g_fStopThread изменяется на true в функции main.
  7. В функции main вызывается функция WaitForSingleObject с аргументами hThread и INFINITE, чтобы дождаться завершения потока.
  8. В функции main вызывается функция CloseHandle с аргументом hThread, чтобы закрыть поток.
  9. Функция main возвращает значение EXIT_SUCCESS.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5