Модификаторы const и volatile
Модификаторы const и volatile
Модификатор const не допускает явного присваивания значения переменной либо других косвенных действий по изменению ее значения, таких как выполнение операций инкремента и декремента. Значение указателя, объявленного с модификатором const, не может быть изменено, в отличие от значения объекта, на который он указывает. В СП MSC, в отличие от СП ТС, недопустима также инициализация const объектов, имеющих класс памяти auto (поскольку их инициализация должна выполняться каждый раз при входе в блок, содержащий их объявления).
Применение модификатора const помогает выявить нежелательные присваивания значений переменным. Переменные, объявленные с модификатором const, могут быть загружены в ячейки постоянной памяти (ПЗУ).
Модификатор volatile противоположен по смыслу модификатору const. Он указывает на то, что значение переменной может быть изменено; но не только непосредственно программой, а также и внешним воздействием, например программой обработки прерываний, либо, если переменная соответствует порту ввода/вывода, обменом с внешним устройством. Объявление объекта с модификатором volatile предупреждает компилятор языка Си, что не следует делать предположений относительно стабильности значения объекта в момент вычисления содержащего его выражения, т. к. значение может (теоретически) измениться в любой момент. Для выражений, содержащих объекты типа volatile, компилятор языка Си не будет применять методы оптимизации, а сами объекты не будет загружать в машинные регистры.
Возможно одновременное использование в объявлении модификаторов const и volatile. Это означает, что значение объявляемой переменной не может модифицироваться программой, но подвержено внешним воздействиям.
Если с модификатором const или volatile объявляется переменная составного типа, то действие модификатора распространяется на все ее составляющие элементы. Возможно применение модификаторов const и volatile в составе объявления typedef.
Примечание. При отсутствии в объявлении спецификации типа и наличии модификатора const или volatile подразумевается спецификация типа int.
Примеры:
float const pi = 3.1415926;
const maxint = 32767;
/* указатель с неизменяемым значением*/
char *const str = "Здравствуй, мир!";
/* указатель на неизменяемую строку */
char const *str2 = "Здравствуй, мир!";
С учетом приведенных объявлений следующие операторы недопустимы:
pi = 3.0;/* Присвоение значения константе */
i = maxini--; /* Уменьшение константы */
str = "Привет!"; /* Переназначение указателя */
Однако вызов функции strcpy(str,"Привет!") допустим, т. к. в данном случае осуществляется посимвольное копирование строки "Привет!" в область памяти, на которую указывает str. Поскольку компилятор "не знает", что делает функция strcpy, он не считает эту ситуацию недопустимой.
Аналогично, если указатель на тип const присвоить указателю на тип, отличный от const, то через полученный указатель можно присвоить значение. Если же с помощью операции приведения типа преобразовать указатель на const к указателю на тип, отличный от const, то СП MSC, в отличие от СП ТС, не позволит выполнить присваивание через преобразованный указатель.
Пример:
volatile int ticks;
void interrupt timer()
{
ticks ++;
}
wait(int interval)
{
ticks = 0;
while ( ticks < interval );
}
Функция wait будет "ждать" в течение времени, заданного параметром interval при условии, что функция timer корректно связана с аппаратным прерыванием от таймера. Значение переменной ticks изменяется в функции timer каждый раз при наступлении прерывания от таймера. Модификатор interrupt описан в разделе 3.3.3.5.
Если бы переменная ticks была объявлена без модификатора volatile, то компилятор языка Си с высоким уровнем оптимизации вынес бы за пределы цикла while сравнение переменных ticks и interval, поскольку в теле цикла их значения не изменяются. Это привело бы к зацикливанию программы.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Модификаторы геометрии
Модификаторы геометрии Для изменения параметров объектов сцены в среде 3ds Max служит панель Modify (Изменение). Она содержит список модификаторов, позволяет управлять стеком модификаторов и редактировать подобъекты.Каждый модификатор привносит в моделирование большое
15. Активно используйте const
15. Активно используйте const Резюмеconst — ваш друг: неизменяемые значения проще понимать, отслеживать и мотивировать, т.е. там, где это целесообразно, лучше использовать константы вместо переменных. Сделайте const описанием по умолчанию при определении значения — это
94. Избегайте преобразований, отменяющих const
94. Избегайте преобразований, отменяющих const РезюмеПреобразование типов, отменяющее const, может привести к неопределенному поведению, а кроме того, это свидетельство плохого стиля программирования даже в том случае, когда применение такого преобразования вполне
Правило 3: Везде, где только можно используйте const
Правило 3: Везде, где только можно используйте const Замечательное свойство модификатора const состоит в том, что он накладывает определенное семантическое ограничение: данный объект не должен модифицироваться, – и компилятор будет проводить это ограничение в жизнь. const
Модификаторы
Модификаторы В предыдущей главе мы начали знакомиться с модификаторами и научились применять их к сплайнам. Однако модификаторы можно назначать не только двухмерным формам, но и трехмерным. Например, модификатор может действовать на объект, деформируя его различными
Параметрические модификаторы
Параметрические модификаторы Каждый из параметрических модификаторов содержит два режима редактирования подобъектов: Gizmo (Габаритный контейнер) и Center (Центр).Управление положением габаритного контейнера модификатора (Gizmo) осуществляется при помощи специального
3.11. Внутренние модификаторы
3.11. Внутренние модификаторы Обычно модификаторы (например, i или m) задаются после регулярного выражения. Но что если мы хотим применить модификатор только к части выражения?Существует специальная нотация для включения и выключения модификаторов. Заключенный в круглые
Модификаторы cdecl и pascal
Модификаторы cdecl и pascal Рассматриваемые системы программирования в языке Си позволяют обращаться из программы на языке Си к программам, написанным на других языках, и обратно. При смешивании языков программирования приходится иметь дело с двумя важными проблемами:
Модификаторы near, far, huge
Модификаторы near, far, huge Эти модификаторы оказывают воздействие на работу с адресами объектов.Компилятор языка Си позволяет использовать при компиляции одну из нескольких моделей памяти. Виды моделей памяти и методы их применения рассмотрены в разделе 8 "Модели
Модификаторы типа функции
Модификаторы типа функции Компилятор языка Си поддерживает ряд модификаторов типа функций: pascal, cdecl, interrupt, near, far и huge (модификатор interrupt не реализован в версии 4 СП MSC). Модификаторы рассмотрены в разделе 3.3.3 "Описатели с
3.5. Спецификатор const
3.5. Спецификатор const Возьмем следующий пример кода:for ( int index = 0; index 512; ++index )... ;С использованием литерала 512 связаны две проблемы. Первая состоит в легкости восприятия текста программы. Почему верхняя граница переменной цикла должна быть равна именно 512? Что скрывается за
3.13. Спецификатор volatile
3.13. Спецификатор volatile Объект объявляется как volatile (неустойчивый, асинхронно изменяемый), если его значение может быть изменено незаметно для компилятора, например переменная, обновляемая значением системных часов. Этот спецификатор сообщает компилятору, что не нужно
10.2.3. Модификаторы поиска
10.2.3. Модификаторы поиска Возможности поиска в Google не ограничиваются применением логических операторов и операторов + и — . Вы можете использовать специальные модификаторы для более эффективного поиска. Например, модификатор site позволяет задать домен, в пределах