🗊Презентация Модификаторы (спецификаторы) типов в языке Си

Нажмите для полного просмотра!
Модификаторы (спецификаторы) типов в языке Си, слайд №1Модификаторы (спецификаторы) типов в языке Си, слайд №2Модификаторы (спецификаторы) типов в языке Си, слайд №3Модификаторы (спецификаторы) типов в языке Си, слайд №4Модификаторы (спецификаторы) типов в языке Си, слайд №5Модификаторы (спецификаторы) типов в языке Си, слайд №6Модификаторы (спецификаторы) типов в языке Си, слайд №7Модификаторы (спецификаторы) типов в языке Си, слайд №8Модификаторы (спецификаторы) типов в языке Си, слайд №9Модификаторы (спецификаторы) типов в языке Си, слайд №10Модификаторы (спецификаторы) типов в языке Си, слайд №11Модификаторы (спецификаторы) типов в языке Си, слайд №12Модификаторы (спецификаторы) типов в языке Си, слайд №13Модификаторы (спецификаторы) типов в языке Си, слайд №14Модификаторы (спецификаторы) типов в языке Си, слайд №15Модификаторы (спецификаторы) типов в языке Си, слайд №16Модификаторы (спецификаторы) типов в языке Си, слайд №17Модификаторы (спецификаторы) типов в языке Си, слайд №18Модификаторы (спецификаторы) типов в языке Си, слайд №19Модификаторы (спецификаторы) типов в языке Си, слайд №20Модификаторы (спецификаторы) типов в языке Си, слайд №21Модификаторы (спецификаторы) типов в языке Си, слайд №22Модификаторы (спецификаторы) типов в языке Си, слайд №23Модификаторы (спецификаторы) типов в языке Си, слайд №24Модификаторы (спецификаторы) типов в языке Си, слайд №25Модификаторы (спецификаторы) типов в языке Си, слайд №26Модификаторы (спецификаторы) типов в языке Си, слайд №27Модификаторы (спецификаторы) типов в языке Си, слайд №28Модификаторы (спецификаторы) типов в языке Си, слайд №29Модификаторы (спецификаторы) типов в языке Си, слайд №30Модификаторы (спецификаторы) типов в языке Си, слайд №31Модификаторы (спецификаторы) типов в языке Си, слайд №32Модификаторы (спецификаторы) типов в языке Си, слайд №33Модификаторы (спецификаторы) типов в языке Си, слайд №34Модификаторы (спецификаторы) типов в языке Си, слайд №35Модификаторы (спецификаторы) типов в языке Си, слайд №36Модификаторы (спецификаторы) типов в языке Си, слайд №37Модификаторы (спецификаторы) типов в языке Си, слайд №38Модификаторы (спецификаторы) типов в языке Си, слайд №39Модификаторы (спецификаторы) типов в языке Си, слайд №40Модификаторы (спецификаторы) типов в языке Си, слайд №41Модификаторы (спецификаторы) типов в языке Си, слайд №42Модификаторы (спецификаторы) типов в языке Си, слайд №43Модификаторы (спецификаторы) типов в языке Си, слайд №44Модификаторы (спецификаторы) типов в языке Си, слайд №45Модификаторы (спецификаторы) типов в языке Си, слайд №46Модификаторы (спецификаторы) типов в языке Си, слайд №47Модификаторы (спецификаторы) типов в языке Си, слайд №48Модификаторы (спецификаторы) типов в языке Си, слайд №49Модификаторы (спецификаторы) типов в языке Си, слайд №50Модификаторы (спецификаторы) типов в языке Си, слайд №51

Содержание

Вы можете ознакомиться и скачать презентацию на тему Модификаторы (спецификаторы) типов в языке Си. Доклад-сообщение содержит 51 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Модификаторы (спецификаторы) типов в языке Си
Описание слайда:
Модификаторы (спецификаторы) типов в языке Си

Слайд 2





Перечислимый тип данных
Перечислимый тип данных предназначен для описания объектов из некоторого заданного множества. 
В СИ выделен отдельный тип перечисление (enum), задающий набор всех возможных целочисленных значений переменной этого типа.
Описание слайда:
Перечислимый тип данных Перечислимый тип данных предназначен для описания объектов из некоторого заданного множества. В СИ выделен отдельный тип перечисление (enum), задающий набор всех возможных целочисленных значений переменной этого типа.

Слайд 3





Модификатор enum
Используется для объявления перечисления, отдельного типа, состоящего из набора именованных констант, который называется списком перечислителя. Объявление  перечисления задает имя переменной перечисления и определяет список именованных констант, называемый списком  перечисления.  Значением каждого имени списка является целое число. Переменная перечисления принимает значение одной  из  именованных констант  списка.
Описание слайда:
Модификатор enum Используется для объявления перечисления, отдельного типа, состоящего из набора именованных констант, который называется списком перечислителя. Объявление перечисления задает имя переменной перечисления и определяет список именованных констант, называемый списком перечисления. Значением каждого имени списка является целое число. Переменная перечисления принимает значение одной из именованных констант списка.

Слайд 4





Модификатор enum
Именованные константы списка имеют 
тип int. Таким образом, память соответствующая переменной перечисления - это память, необходимая для размещения отдельной целой величины. Синтаксис оператра следующий:
enum[<tag>]{<enum-list>}<identifier>[,<identifier>...];
enum<tag><identifier>[,<identifier>...];
Описание слайда:
Модификатор enum Именованные константы списка имеют тип int. Таким образом, память соответствующая переменной перечисления - это память, необходимая для размещения отдельной целой величины. Синтаксис оператра следующий: enum[<tag>]{<enum-list>}<identifier>[,<identifier>...]; enum<tag><identifier>[,<identifier>...];

Слайд 5





Модификатор enum
enum[<tag>]{<enum-list>}<identifier>[,<identifier>...];
Объявление перечисления начинается с ключевого слова enum и имеет две формы представления. В первой форме представления имена перечисления задаются в списке перечисления <enum-list>. Опция  <tag> - это идентификатор, который именует тип перечисления, определенного в <enum-list>. Переменную перечисления именует <identifier>. В  объявлении может быть описана более чем одна переменная перечисления.
Описание слайда:
Модификатор enum enum[<tag>]{<enum-list>}<identifier>[,<identifier>...]; Объявление перечисления начинается с ключевого слова enum и имеет две формы представления. В первой форме представления имена перечисления задаются в списке перечисления <enum-list>. Опция <tag> - это идентификатор, который именует тип перечисления, определенного в <enum-list>. Переменную перечисления именует <identifier>. В объявлении может быть описана более чем одна переменная перечисления.

Слайд 6





Модификатор enum
enum<tag><identifier>[,<identifier>...];
Во второй форме используется тег перечисления, который ссылается  на тип перечисления. Параметр <enum-list> имеет следующий синтаксис:
<identifier>[=<constant-expression>][,<identifier> [=<constant-expression]]...
enum seasons (spring, summer, autumn, winter);
Описание слайда:
Модификатор enum enum<tag><identifier>[,<identifier>...]; Во второй форме используется тег перечисления, который ссылается на тип перечисления. Параметр <enum-list> имеет следующий синтаксис: <identifier>[=<constant-expression>][,<identifier> [=<constant-expression]]... enum seasons (spring, summer, autumn, winter);

Слайд 7





Модификатор enum
Каждый  идентификатор  именует  элементы  перечисления. По умолчанию первому перечислителю задано значение 0, а значение каждого последующего оператора увеличивается на 1. Например, в следующем перечислении Sat – это 0, Sun – 1, Mon – 2... 
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
Описание слайда:
Модификатор enum Каждый идентификатор именует элементы перечисления. По умолчанию первому перечислителю задано значение 0, а значение каждого последующего оператора увеличивается на 1. Например, в следующем перечислении Sat – это 0, Sun – 1, Mon – 2... enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Слайд 8





Модификатор enum
Перечислители могут использовать инициализаторы для переопределения значений по умолчанию, как показано в следующем примере.
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
В этом перечислении последовательность элементов принудительно начинается с 1, а не с 0. Однако рекомендуется включить константу, значение которой равно нулю.
Описание слайда:
Модификатор enum Перечислители могут использовать инициализаторы для переопределения значений по умолчанию, как показано в следующем примере. enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; В этом перечислении последовательность элементов принудительно начинается с 1, а не с 0. Однако рекомендуется включить константу, значение которой равно нулю.

Слайд 9





Модификатор enum
Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, исключая char. По умолчанию базовым типом элементов перечисления является int. Для объявления перечисления другого целочисленного типа, такого как байт, поставьте двоеточие после идентификатора, за которым следует тип, как показано в следующем примере:
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
Описание слайда:
Модификатор enum Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, исключая char. По умолчанию базовым типом элементов перечисления является int. Для объявления перечисления другого целочисленного типа, такого как байт, поставьте двоеточие после идентификатора, за которым следует тип, как показано в следующем примере: enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Слайд 10





Модификатор enum
Для перечисления утверждены следующие типы: byte, sbyte, short, ushort, int, uint, long или ulong. Переменной типа Days может быть назначено любое значение, входящее в диапазон базового типа; значения не ограничены именованными константами. Значением enum по умолчанию является значение, созданное выражением (E)0. Базовый тип указывает размер хранилища, выделенного для каждого перечислителя. Однако для преобразования из типа enum в целочисленный тип необходимо явное приведение.
Описание слайда:
Модификатор enum Для перечисления утверждены следующие типы: byte, sbyte, short, ushort, int, uint, long или ulong. Переменной типа Days может быть назначено любое значение, входящее в диапазон базового типа; значения не ограничены именованными константами. Значением enum по умолчанию является значение, созданное выражением (E)0. Базовый тип указывает размер хранилища, выделенного для каждого перечислителя. Однако для преобразования из типа enum в целочисленный тип необходимо явное приведение.

Слайд 11





Модификатор enum
Например, следующий оператор назначает перечислитель Sun переменной типа int, используя приведение для преобразования enum в int. 
int x = (int)Days.Sun;
Описание слайда:
Модификатор enum Например, следующий оператор назначает перечислитель Sun переменной типа int, используя приведение для преобразования enum в int. int x = (int)Days.Sun;

Слайд 12





Модификатор enum
Пример объявления перечислимого типа данных:
enum day {	saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday} workday;
В этом примере определяется тип перечисления, поименованный day и объявляется переменная workday этого типа перечисления. С saturday по умолчанию ассоциируется значение  0.  Идентификатор sunday  явно устанавливается  в  0. Оставшиеся идентификаторы по умолчанию принимают значение от 1 до 5.
Описание слайда:
Модификатор enum Пример объявления перечислимого типа данных: enum day { saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday} workday; В этом примере определяется тип перечисления, поименованный day и объявляется переменная workday этого типа перечисления. С saturday по умолчанию ассоциируется значение 0. Идентификатор sunday явно устанавливается в 0. Оставшиеся идентификаторы по умолчанию принимают значение от 1 до 5.

Слайд 13





Модификатор enum
Пример объявления перечислимого типа данных:
enum day {	saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday} workday;
В этом примере определяется тип перечисления, поименованный day и объявляется переменная workday этого типа перечисления. С saturday по умолчанию ассоциируется значение  0.  Идентификатор sunday  явно устанавливается  в  0. Оставшиеся идентификаторы по умолчанию принимают значение от 1 до 5.
Описание слайда:
Модификатор enum Пример объявления перечислимого типа данных: enum day { saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday} workday; В этом примере определяется тип перечисления, поименованный day и объявляется переменная workday этого типа перечисления. С saturday по умолчанию ассоциируется значение 0. Идентификатор sunday явно устанавливается в 0. Оставшиеся идентификаторы по умолчанию принимают значение от 1 до 5.

Слайд 14





Модификатор enum
Итак,  переменная типа перечисления может принимать значения одной из именованных констант списка. Именованные константы списка имеют тип int. Таким образом, память соответствующая переменной перечисления, это память необходимая для размещения значения типа int. 
Переменная типа enum могут использоваться в индексных выражениях и как операнды в арифметических операциях и в операциях отношения. 
В первом формате 1 имена и значения перечисления задаются в списке перечислений. Необязательное имя-тега-перечисления, это идентификатор, который именует  тег перечисления, определенный списком перечисления. Описатель именует переменную перечисления. В объявлении может быть задана более чем одна переменная типа перечисления.
Описание слайда:
Модификатор enum Итак, переменная типа перечисления может принимать значения одной из именованных констант списка. Именованные константы списка имеют тип int. Таким образом, память соответствующая переменной перечисления, это память необходимая для размещения значения типа int. Переменная типа enum могут использоваться в индексных выражениях и как операнды в арифметических операциях и в операциях отношения. В первом формате 1 имена и значения перечисления задаются в списке перечислений. Необязательное имя-тега-перечисления, это идентификатор, который именует тег перечисления, определенный списком перечисления. Описатель именует переменную перечисления. В объявлении может быть задана более чем одна переменная типа перечисления.

Слайд 15





Модификатор enum
Список-перечисления содержит одну или несколько конструкций вида: 
идентификатор [= константное выражение] 
Каждый идентификатор именует элемент перечисления. Все идентификаторы в списке enum должны быть уникальными. В случае отсутствия константного выражения первому идентификатору соответствует значение 0, следующему идентификатору - значение 1 и т.д. Имя константы перечисления эквивалентно ее значению. 
Идентификатор, связанный с константным выражением, принимает значение, задаваемое этим константным выражением. Константное выражение должно иметь тип int и может быть как положительным, так и отрицательным.
Описание слайда:
Модификатор enum Список-перечисления содержит одну или несколько конструкций вида: идентификатор [= константное выражение] Каждый идентификатор именует элемент перечисления. Все идентификаторы в списке enum должны быть уникальными. В случае отсутствия константного выражения первому идентификатору соответствует значение 0, следующему идентификатору - значение 1 и т.д. Имя константы перечисления эквивалентно ее значению. Идентификатор, связанный с константным выражением, принимает значение, задаваемое этим константным выражением. Константное выражение должно иметь тип int и может быть как положительным, так и отрицательным.

Слайд 16





Модификатор enum
Использование элементов перечисления должно подчиняться следующим правилам: 
1. Переменная может содержать повторяющиеся значения. 
2. Идентификаторы в списке перечисления должны быть отличны от всех других идентификаторов в той же области видимости, включая имена обычных переменных и идентификаторы из других списков перечислений. 
3. Имена типов перечислений должны быть отличны от других имен типов перечислений, структур и смесей в этой же области видимости. 
4. Значение может следовать за последним элементом списка перечисления.
Описание слайда:
Модификатор enum Использование элементов перечисления должно подчиняться следующим правилам: 1. Переменная может содержать повторяющиеся значения. 2. Идентификаторы в списке перечисления должны быть отличны от всех других идентификаторов в той же области видимости, включая имена обычных переменных и идентификаторы из других списков перечислений. 3. Имена типов перечислений должны быть отличны от других имен типов перечислений, структур и смесей в этой же области видимости. 4. Значение может следовать за последним элементом списка перечисления.

Слайд 17





Модификатор enum
Пример: 
      enum week { SUB = 0,    /*    0   */      
            VOS = 0,    /*    0   */                  
	POND,       /*    1   */                 
 	VTOR,       /*    2   */                  
	SRED,       /*    3   */           
      	HETV,       /*    4   */          
      	 PJAT        /*    5   */                  }   rab_ned ;  
В данном примере объявлен перечислимый тег week, с соответствующим множеством значений, и объявлена переменная rab_ned имеющая тип week.
Описание слайда:
Модификатор enum Пример:   enum week { SUB = 0, /* 0 */  VOS = 0, /* 0 */  POND, /* 1 */  VTOR, /* 2 */  SRED, /* 3 */  HETV, /* 4 */  PJAT /* 5 */  } rab_ned ;  В данном примере объявлен перечислимый тег week, с соответствующим множеством значений, и объявлена переменная rab_ned имеющая тип week.

Слайд 18





Модификатор enum
Во втором формате используется имя тега перечисления для ссылки на тип перечисления, определяемый где-то в другом месте. Имя тега перечисления должно относится к уже определенному тегу перечисления в пределах текущей области видимости. Так как тег перечисления объявлен где-то в другом месте, список перечисления не представлен в объявлении. 
Пример: 
enum week rab1;
Описание слайда:
Модификатор enum Во втором формате используется имя тега перечисления для ссылки на тип перечисления, определяемый где-то в другом месте. Имя тега перечисления должно относится к уже определенному тегу перечисления в пределах текущей области видимости. Так как тег перечисления объявлен где-то в другом месте, список перечисления не представлен в объявлении. Пример: enum week rab1;

Слайд 19





Модификатор enum
Описание слайда:
Модификатор enum

Слайд 20





Модификатор enum
Можно задать нулевое значение явно:
Описание слайда:
Модификатор enum Можно задать нулевое значение явно:

Слайд 21





Модификатор enum
Если мы изменим программу и напишем  
enum Token {
    SYMBOL,             //0
    NUMBER,             //1
    EXPRESSION = 10,    //10
    OPERATOR,           //11
    UNDEFINED           //12
};
То SYMBOL будет равно значению 0, NUMBER равно 1, EXPRESSION равно 10, OPERATOR равно 11, UNDEFINED равно 12.
Описание слайда:
Модификатор enum Если мы изменим программу и напишем enum Token {     SYMBOL,             //0     NUMBER,             //1     EXPRESSION = 10,    //10     OPERATOR,           //11     UNDEFINED           //12 }; То SYMBOL будет равно значению 0, NUMBER равно 1, EXPRESSION равно 10, OPERATOR равно 11, UNDEFINED равно 12.

Слайд 22





Модификатор enum
Перечисления используются для большей типобезопасности и ограничения возможных значений переменной. Для того, чтобы не писать enum каждый раз, можно объявить новый тип. 
typedef enum enumName {
    FIELD1,
    FIELD2
} Name;
Описание слайда:
Модификатор enum Перечисления используются для большей типобезопасности и ограничения возможных значений переменной. Для того, чтобы не писать enum каждый раз, можно объявить новый тип. typedef enum enumName {     FIELD1,     FIELD2 } Name;

Слайд 23





Модификатор enum
Например 
typedef enum Bool {
    FALSE,
    TRUE
} Bool;
Описание слайда:
Модификатор enum Например typedef enum Bool {     FALSE,     TRUE } Bool;

Слайд 24





Спецификаторы (модификаторы)
Обычная СИ-программа представляет собой определение функции main, которая для выполнения необходимых действий вызывает другие функции. Связь между функциями осуществлялась по данным посредством передачи параметров и возврата значений функций. Но компилятор языка СИ позволяет также разбить программу на несколько отдельных частей (исходных файлов), оттранслировать каждую часть отдельно, и затем объединить все части в один выполняемый файл при помощи редактора связей.
Описание слайда:
Спецификаторы (модификаторы) Обычная СИ-программа представляет собой определение функции main, которая для выполнения необходимых действий вызывает другие функции. Связь между функциями осуществлялась по данным посредством передачи параметров и возврата значений функций. Но компилятор языка СИ позволяет также разбить программу на несколько отдельных частей (исходных файлов), оттранслировать каждую часть отдельно, и затем объединить все части в один выполняемый файл при помощи редактора связей.

Слайд 25





Спецификаторы (модификаторы)
При такой структуре исходной программы функции, находящиеся в разных исходных файлах могут использовать глобальные внешние переменные. Все функции в языке Си по определению внешние и всегда доступны из любых файлов. Для того, чтобы определяемая функция могла выполнять какие либо действия, она должна использовать переменные. В языке СИ все переменные должны быть объявлены до их использования. Объявления устанавливают соответствие имени и атрибутов переменной, функции или типа.
Описание слайда:
Спецификаторы (модификаторы) При такой структуре исходной программы функции, находящиеся в разных исходных файлах могут использовать глобальные внешние переменные. Все функции в языке Си по определению внешние и всегда доступны из любых файлов. Для того, чтобы определяемая функция могла выполнять какие либо действия, она должна использовать переменные. В языке СИ все переменные должны быть объявлены до их использования. Объявления устанавливают соответствие имени и атрибутов переменной, функции или типа.

Слайд 26





Спецификаторы (модификаторы)
Определение переменной вызывает выделение памяти для хранения ее значения. Класс выделяемой памяти определяется спецификатором класса памяти, и определяет время жизни и область видимости переменной, связанные с понятием блока программы. 
В языке СИ блоком считается последовательность объявлений, определений и операторов, заключенная в фигурные скобки. Существуют два вида блоков - составной оператор и определение функции, состоящее из составного оператора, являющегося телом функции, и предшествующего телу заголовка функции (в который входят имя функции, типы возвращаемого значения и формальных параметров).
Описание слайда:
Спецификаторы (модификаторы) Определение переменной вызывает выделение памяти для хранения ее значения. Класс выделяемой памяти определяется спецификатором класса памяти, и определяет время жизни и область видимости переменной, связанные с понятием блока программы. В языке СИ блоком считается последовательность объявлений, определений и операторов, заключенная в фигурные скобки. Существуют два вида блоков - составной оператор и определение функции, состоящее из составного оператора, являющегося телом функции, и предшествующего телу заголовка функции (в который входят имя функции, типы возвращаемого значения и формальных параметров).

Слайд 27





Спецификаторы (модификаторы)
Блоки могут включать в себя составные операторы, но не определения функций. Внутренний блок называется вложенным, а внешний блок - объемлющим. 
Время жизни - это интервал времени выполнения программы, в течение которого программный объект (переменная или функция) существует. Время жизни переменной может быть локальным или глобальным. Переменная с глобальным временем жизни имеет распределенную для нее память и определенное значение на протяжении всего времени выполнения программы, начиная с момента выполнения объявления этой переменной.
Описание слайда:
Спецификаторы (модификаторы) Блоки могут включать в себя составные операторы, но не определения функций. Внутренний блок называется вложенным, а внешний блок - объемлющим. Время жизни - это интервал времени выполнения программы, в течение которого программный объект (переменная или функция) существует. Время жизни переменной может быть локальным или глобальным. Переменная с глобальным временем жизни имеет распределенную для нее память и определенное значение на протяжении всего времени выполнения программы, начиная с момента выполнения объявления этой переменной.

Слайд 28





Спецификаторы (модификаторы)
Переменная с локальным временем жизни имеет распределенную для него память и определенное значение только во время выполнения блока, в котором эта переменная определена или объявлена. При каждом входе в блок для локальной переменной распределяется новая память, которая освобождается при выходе из блока. 
Все функции в СИ имеют глобальное время жизни и существуют в течение всего времени выполнения программы. 
Область видимости - это часть текста программы, в которой может быть использован данный объект.
Описание слайда:
Спецификаторы (модификаторы) Переменная с локальным временем жизни имеет распределенную для него память и определенное значение только во время выполнения блока, в котором эта переменная определена или объявлена. При каждом входе в блок для локальной переменной распределяется новая память, которая освобождается при выходе из блока. Все функции в СИ имеют глобальное время жизни и существуют в течение всего времени выполнения программы. Область видимости - это часть текста программы, в которой может быть использован данный объект.

Слайд 29





Спецификаторы (модификаторы)
Объект считается видимым в блоке или в исходном файле, если в этом блоке или файле известны имя и тип объекта. Объект может быть видимым в пределах блока, исходного файла или во всех исходных файлах, образующих программу. Это зависит от того, на каком уровне объявлен объект: на внутреннем, т.е. внутри некоторого блока, или на внешнем, т.е. вне всех блоков. 
Если объект объявлен внутри блока, то он видим в этом блоке, и во всех внутренних блоках. Если объект объявлен на внешнем уровне, то он видим от точки его объявления до конца данного исходного файла. 
Объект может быть сделан глобально видимым с помощью соответствующих объявлений во всех исходных файлах, образующих программу.
Описание слайда:
Спецификаторы (модификаторы) Объект считается видимым в блоке или в исходном файле, если в этом блоке или файле известны имя и тип объекта. Объект может быть видимым в пределах блока, исходного файла или во всех исходных файлах, образующих программу. Это зависит от того, на каком уровне объявлен объект: на внутреннем, т.е. внутри некоторого блока, или на внешнем, т.е. вне всех блоков. Если объект объявлен внутри блока, то он видим в этом блоке, и во всех внутренних блоках. Если объект объявлен на внешнем уровне, то он видим от точки его объявления до конца данного исходного файла. Объект может быть сделан глобально видимым с помощью соответствующих объявлений во всех исходных файлах, образующих программу.

Слайд 30





Спецификаторы (модификаторы)
Спецификатор класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти не указан, то он определяется по умолчанию из контекста объявления. 
Объекты классов auto и register имеют локальное время жизни. Спецификаторы static и extern определяют объекты с глобальным временем жизни. 
При объявлении переменной на внутреннем уровне может быть использован любой из четырех спецификаторов класса памяти, а если он не указан, то подразумевается класс памяти auto.
Описание слайда:
Спецификаторы (модификаторы) Спецификатор класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти не указан, то он определяется по умолчанию из контекста объявления. Объекты классов auto и register имеют локальное время жизни. Спецификаторы static и extern определяют объекты с глобальным временем жизни. При объявлении переменной на внутреннем уровне может быть использован любой из четырех спецификаторов класса памяти, а если он не указан, то подразумевается класс памяти auto.

Слайд 31





Спецификаторы (модификаторы)
Переменная с классом памяти auto имеет локальное время жизни и видна только в блоке, в котором объявлена. Память для такой переменной выделяется при входе в блок и освобождается при выходе из блока. При повторном входе в блок этой переменной может быть выделен другой участок памяти. 
Переменная с классом памяти auto автоматически не инициализируется. Она должна быть проинициализирована явно при объявлении путем присвоения ей начального значения. Значение неинициализированной переменной с классом памяти auto считается неопределенным.
Описание слайда:
Спецификаторы (модификаторы) Переменная с классом памяти auto имеет локальное время жизни и видна только в блоке, в котором объявлена. Память для такой переменной выделяется при входе в блок и освобождается при выходе из блока. При повторном входе в блок этой переменной может быть выделен другой участок памяти. Переменная с классом памяти auto автоматически не инициализируется. Она должна быть проинициализирована явно при объявлении путем присвоения ей начального значения. Значение неинициализированной переменной с классом памяти auto считается неопределенным.

Слайд 32





Спецификаторы (register)
Спецификатор класса памяти register предписывает компилятору распределить память для переменной в регистре, если это представляется возможным. Использование регистровой памяти обычно приводит к сокращению времени доступа к переменной. Переменная, объявленная с классом памяти register, имеет ту же область видимости, что и переменная auto. Число регистров, которые можно использовать для значений переменных, ограничено возможностями компьютера, и в том случае, если компилятор не имеет в распоряжении свободных регистров, то переменной выделяется память как для класса auto.
Описание слайда:
Спецификаторы (register) Спецификатор класса памяти register предписывает компилятору распределить память для переменной в регистре, если это представляется возможным. Использование регистровой памяти обычно приводит к сокращению времени доступа к переменной. Переменная, объявленная с классом памяти register, имеет ту же область видимости, что и переменная auto. Число регистров, которые можно использовать для значений переменных, ограничено возможностями компьютера, и в том случае, если компилятор не имеет в распоряжении свободных регистров, то переменной выделяется память как для класса auto.

Слайд 33





Спецификаторы (register)
Заметим, что спецификатор register можно применять только к локальным переменным и формальным параметрам:
int foo(register char ch)
{
    register int bRes;
    return bRes;
}
Компилятор автоматически преобразует лишние регистровые переменные в обычные, поэтому нет смысла в подсчёте количества регистровых переменных, что обеспечивает машино-независимость.
Описание слайда:
Спецификаторы (register) Заметим, что спецификатор register можно применять только к локальным переменным и формальным параметрам: int foo(register char ch) { register int bRes; return bRes; } Компилятор автоматически преобразует лишние регистровые переменные в обычные, поэтому нет смысла в подсчёте количества регистровых переменных, что обеспечивает машино-независимость.

Слайд 34





Спецификаторы (register)
Регистровые переменные определяются с помощью служебного слово register перед типом 
register int x = 20;
register int y = 30;
Так как регистровая переменная не имеет адреса, то к ней не применима операция взятия адреса, это вызовет ошибку во время компиляции. Аргументы функции также могут быть заданы как register. Внутри функции они будут вести себя также, как и регистровые переменные.
Описание слайда:
Спецификаторы (register) Регистровые переменные определяются с помощью служебного слово register перед типом register int x = 20; register int y = 30; Так как регистровая переменная не имеет адреса, то к ней не применима операция взятия адреса, это вызовет ошибку во время компиляции. Аргументы функции также могут быть заданы как register. Внутри функции они будут вести себя также, как и регистровые переменные.

Слайд 35





Примеры использования модификаторов (register)
Описание слайда:
Примеры использования модификаторов (register)

Слайд 36





Спецификаторы (static)
Модификатор static позволяет связать с идентификатором фиксированный адрес (ячейку памяти). Если объект расположен по некоторому фиксированному адресу, то он называется статическим.
Объект, который располагается в произвольном месте оперативной памяти, называется динамическим. Если необходимо динамический объект сделать статическим, то используется модификатор static. Переменные, объявленные с использованием модификатора static сохраняют свои значения при входе и выходе из функции, однако не являются глобальными.
Описание слайда:
Спецификаторы (static) Модификатор static позволяет связать с идентификатором фиксированный адрес (ячейку памяти). Если объект расположен по некоторому фиксированному адресу, то он называется статическим. Объект, который располагается в произвольном месте оперативной памяти, называется динамическим. Если необходимо динамический объект сделать статическим, то используется модификатор static. Переменные, объявленные с использованием модификатора static сохраняют свои значения при входе и выходе из функции, однако не являются глобальными.

Слайд 37





Спецификаторы (static)
Переменные, объявленные на внутреннем уровне со спецификатором класса памяти static, обеспечиваю возможность сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок. Такая переменная имеет глобальное время жизни и область видимости внутри блока, в котором она объявлена. В отличие от переменных с классом auto, память для которых выделяется в стеке, для переменных с классом static память выделяется в сегменте данных, и поэтому их значение сохраняется при выходе из блока.
Описание слайда:
Спецификаторы (static) Переменные, объявленные на внутреннем уровне со спецификатором класса памяти static, обеспечиваю возможность сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок. Такая переменная имеет глобальное время жизни и область видимости внутри блока, в котором она объявлена. В отличие от переменных с классом auto, память для которых выделяется в стеке, для переменных с классом static память выделяется в сегменте данных, и поэтому их значение сохраняется при выходе из блока.

Слайд 38





Спецификаторы (static)
Пример:
 /* объявления переменной i на внутреннем уровне с классом памяти static. */
 /* исходный файл file1.c */ 
main() { ... } 
fun1() { static int i=0; ... } 
/* исходный файл file2.c */ 
fun2() { static int i=0; ... }
 fun3() { static int i=0; ... }
Описание слайда:
Спецификаторы (static) Пример: /* объявления переменной i на внутреннем уровне с классом памяти static. */ /* исходный файл file1.c */ main() { ... } fun1() { static int i=0; ... } /* исходный файл file2.c */ fun2() { static int i=0; ... } fun3() { static int i=0; ... }

Слайд 39





Спецификаторы (static)
В приведенном примере объявлены три разные переменные с классом памяти static, имеющие одинаковые имена i. 
Каждая из этих переменных имеет глобальное время жизни, но видима только в том блоке (функции), в которой она объявлена. 
Эти переменные можно использовать для подсчета числа обращений к каждой из трех функций.
Описание слайда:
Спецификаторы (static) В приведенном примере объявлены три разные переменные с классом памяти static, имеющие одинаковые имена i. Каждая из этих переменных имеет глобальное время жизни, но видима только в том блоке (функции), в которой она объявлена. Эти переменные можно использовать для подсчета числа обращений к каждой из трех функций.

Слайд 40





Спецификаторы (static)
Пример
Описание слайда:
Спецификаторы (static) Пример

Слайд 41





Спецификаторы (static)
Пример
Описание слайда:
Спецификаторы (static) Пример

Слайд 42





Спецификаторы (extern)
Переменная, объявленная локально с классом памяти extern, является ссылкой на переменную с тем же самым именем, определенную глобально в одном из исходных файлов программы. Цель такого объявления состоит в том, чтобы сделать определение переменной глобального уровня видимым внутри блока.
Описание слайда:
Спецификаторы (extern) Переменная, объявленная локально с классом памяти extern, является ссылкой на переменную с тем же самым именем, определенную глобально в одном из исходных файлов программы. Цель такого объявления состоит в том, чтобы сделать определение переменной глобального уровня видимым внутри блока.

Слайд 43





Спецификаторы (extern)
Пример:  
 /*   объявления  переменной  i,  являющейся  именем внешнего        массива целых чисел, на локальном уровне      */  
 /*      исходный файл    file1.c          */  
    main()         { ...         }    
  fun1()         { extern long i[]; ...         }  
 /*     исходный файл      file2.c         */   
   long i[MAX]={0};    
  fun2()         {  ...         }     
 fun3()         {  ...         }
Объявление переменной i[] как extern в приведенном примере делает ее видимой внутри функции fun1. Определение этой переменной находится в файле file2.c на глобальном уровне и должно быть только одно, в то время как объявлений с классом памяти extern может быть несколько.
Описание слайда:
Спецификаторы (extern) Пример:  /* объявления переменной i, являющейся именем внешнего  массива целых чисел, на локальном уровне */  /* исходный файл file1.c */  main()  { ...  }  fun1()  { extern long i[]; ...  }  /* исходный файл file2.c */  long i[MAX]={0};  fun2()  { ...  }  fun3()  { ...  } Объявление переменной i[] как extern в приведенном примере делает ее видимой внутри функции fun1. Определение этой переменной находится в файле file2.c на глобальном уровне и должно быть только одно, в то время как объявлений с классом памяти extern может быть несколько.

Слайд 44





Спецификаторы (extern)
Объявление с классом памяти extern требуется при необходимости использовать переменную, описанную в текущем исходном файле, но ниже по тексту программы, т.е. до выполнения ее глобального определения. Следующий пример иллюстрирует такое использование переменной с именем st.
Пример: 
main() 
{ extern int st[]; ... } 
static int st[MAX]={0}; 
fun1() { ... }
Описание слайда:
Спецификаторы (extern) Объявление с классом памяти extern требуется при необходимости использовать переменную, описанную в текущем исходном файле, но ниже по тексту программы, т.е. до выполнения ее глобального определения. Следующий пример иллюстрирует такое использование переменной с именем st. Пример: main() { extern int st[]; ... } static int st[MAX]={0}; fun1() { ... }

Слайд 45





Спецификаторы
Объявление переменной со спецификатором extern информирует компилятор о том, что память для переменной выделять не требуется, так как это выполнено где-то в другом месте программы. 
При объявлении переменных на глобальном уровне может быть использован спецификатор класса памяти static или extern, а так же можно объявлять переменные без указания класса памяти. Классы памяти auto и register для глобального объявления недопустимы. 
Объявление переменных на глобальном уровне - это или определение переменных, или ссылки на определения, сделанные в другом месте программы. Объявление глобальной переменной, которое инициализирует эту переменную (явно или неявно), является определением переменной.
Описание слайда:
Спецификаторы Объявление переменной со спецификатором extern информирует компилятор о том, что память для переменной выделять не требуется, так как это выполнено где-то в другом месте программы. При объявлении переменных на глобальном уровне может быть использован спецификатор класса памяти static или extern, а так же можно объявлять переменные без указания класса памяти. Классы памяти auto и register для глобального объявления недопустимы. Объявление переменных на глобальном уровне - это или определение переменных, или ссылки на определения, сделанные в другом месте программы. Объявление глобальной переменной, которое инициализирует эту переменную (явно или неявно), является определением переменной.

Слайд 46





Спецификаторы
Определение на глобальном уровне может задаваться в следующих формах: 
1. Переменная объявлена с классом памяти static. Такая переменная может быть инициализирована явно константным выражением, или по умолчанию нулевым значением. То есть обявления static int i=0 и static int i эквивалентны, и в обоих случаях переменной i будет присвоено значение 0. 
2. Переменная объявлена без указания класса памяти, но с явной инициализацией. Такой переменной по умолчанию присваивается класс памяти static. То есть объявления int i=1 и static int i=1 будут эквивалентны. 
Переменная объявленная глобально видима в пределах остатка исходного файла, в котором она определена. Выше своего описания и в других исходных файлах эта переменная невидима (если только она не объявлена с классом extern).
Описание слайда:
Спецификаторы Определение на глобальном уровне может задаваться в следующих формах: 1. Переменная объявлена с классом памяти static. Такая переменная может быть инициализирована явно константным выражением, или по умолчанию нулевым значением. То есть обявления static int i=0 и static int i эквивалентны, и в обоих случаях переменной i будет присвоено значение 0. 2. Переменная объявлена без указания класса памяти, но с явной инициализацией. Такой переменной по умолчанию присваивается класс памяти static. То есть объявления int i=1 и static int i=1 будут эквивалентны. Переменная объявленная глобально видима в пределах остатка исходного файла, в котором она определена. Выше своего описания и в других исходных файлах эта переменная невидима (если только она не объявлена с классом extern).

Слайд 47





Спецификаторы
Глобальная переменная может быть определена только один раз в пределах своей области видимости. В другом исходном файле может быть объявлена другая глобальная переменная с таким же именем и с классом памяти static, конфликта при этом не возникает, так как каждая из этих переменных будет видимой только в своем исходном файле. 
Спецификатор класса памяти extern для глобальных переменных используется, как и для локального объявления, в качестве ссылки на переменную, объявленную в другом месте программы, т.е. для расширения области видимости переменной. 
В объявлениях с классом памяти extern не допускается инициализация, так как эти объявления ссылаются на уже существующие и определенные ранее переменные.
Описание слайда:
Спецификаторы Глобальная переменная может быть определена только один раз в пределах своей области видимости. В другом исходном файле может быть объявлена другая глобальная переменная с таким же именем и с классом памяти static, конфликта при этом не возникает, так как каждая из этих переменных будет видимой только в своем исходном файле. Спецификатор класса памяти extern для глобальных переменных используется, как и для локального объявления, в качестве ссылки на переменную, объявленную в другом месте программы, т.е. для расширения области видимости переменной. В объявлениях с классом памяти extern не допускается инициализация, так как эти объявления ссылаются на уже существующие и определенные ранее переменные.

Слайд 48





Kвалификатор volatile
Квалификатор volatile информирует компилятор что переменная может быть изменена не явным способом т.е. без явного использовать оператора присвоения. Как правило компиляторы автоматически применяют оптимизацию, предполагая что значение переменной остаётся постоянным, если оно не указано с левой стороны от оператора присваивания. Т.е. если переменная не меняется, то и нет нужды проверять её при каждом обращении.
Описание слайда:
Kвалификатор volatile Квалификатор volatile информирует компилятор что переменная может быть изменена не явным способом т.е. без явного использовать оператора присвоения. Как правило компиляторы автоматически применяют оптимизацию, предполагая что значение переменной остаётся постоянным, если оно не указано с левой стороны от оператора присваивания. Т.е. если переменная не меняется, то и нет нужды проверять её при каждом обращении.

Слайд 49





Kвалификатор volatile
Пример:
int exit = 1;
while( exit ){  }; 
В данном случае значение переменной exit будет прочитано только один раз. 
Однако, если содержание переменно exit может изменять не только код текущего потока, но допустим другой поток или некое внешние устройство, то мы можем получить бесконечный цикл которым он быть не должен.
Описание слайда:
Kвалификатор volatile Пример: int exit = 1; while( exit ){ }; В данном случае значение переменной exit будет прочитано только один раз. Однако, если содержание переменно exit может изменять не только код текущего потока, но допустим другой поток или некое внешние устройство, то мы можем получить бесконечный цикл которым он быть не должен.

Слайд 50





Kвалификатор volatile
Но если мы перед объявлением переменной поставим квалификатор volatile, то переменная будет считываться при каждой проверке.
Пример:
volatile int exit = 1;
while( exit ){   };
Описание слайда:
Kвалификатор volatile Но если мы перед объявлением переменной поставим квалификатор volatile, то переменная будет считываться при каждой проверке. Пример: volatile int exit = 1; while( exit ){ };

Слайд 51





Kвалификатор volatile
Предположим есть необходимость работы с внешнем устройством через некоторый порт. Нам нужно записать в порт последовательность из трёх нулей.
unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ; 
После оптимизации вместо трёх нулей будет записан только один. Более того после оптимизации прочитать что либо из порта будет невозможно, т.к. изменения переменной будут происходить во внешней среде.
Описание слайда:
Kвалификатор volatile Предположим есть необходимость работы с внешнем устройством через некоторый порт. Нам нужно записать в порт последовательность из трёх нулей. unsigned char* pControl = 0xff24 ; *pControl = 0 ; *pControl = 0 ; *pControl = 0 ; После оптимизации вместо трёх нулей будет записан только один. Более того после оптимизации прочитать что либо из порта будет невозможно, т.к. изменения переменной будут происходить во внешней среде.



Похожие презентации
Mypresentation.ru
Загрузить презентацию