рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Выполнение программ

Выполнение программ - раздел Программирование, Языки программирования C и C++ Выполнение Программ. Каждая Программа Содержит Главную Программную Функцию. В...

Выполнение программ. Каждая программа содержит главную программную функцию. В Си главная программная функция должна быть поименована как main. Функция main служит точкой старта при выполнении программы и обычно управляет выполнением программы, организуя вызовы других функций.

Программа обычно завершает выполнение по окончанию функции main, хотя она может завершиться и в других точках, в зависимостиот окружающей обстановки. Исходная программа обычно включает в себя несколько функций, каждая из которых предназначена для выполнения определенного задания. Функция main может вызывать эти функции с тем, чтобы выполнить то или иное задание. Функция возвращает управление при выполнении оператора return или по окончанию самой функции выход на конец функции. Все функции, включая функцию main, могут быть объявлены с параметрами. Вызываемые функции получают значения параметров из вызывающих функций.

Значения параметров функции main могут быть переданы из внешнего окружения. Например, они могут быть переданы из командной строки. Соглашение Си требует, чтобы первые два параметра функции main назывались argc и argv. Параметр argc определяет общее число аргументов, передаваемых функции main. Параметр argv объявляется как массив указателей, каждый элемент которого ссылается на строковое представление аргумента, передаваемого функции main. Третий параметр функции main если он есть традиционно Язык программирования Си 21 задается с именем envp. Однако Си не требует этого имени.

Параметр envp это указатель на массив указателей строковых величин, которые определяют окружение, в котором выполняется программа. Операционная система поддерживает передачу значений для argc, argv и envp параметров, а пользователь поддерживает задание значений фактических параметров для функции main. Соглашение о передаче параметров в большей степени определяется операционной системой, чем самим языком Си. Формальные параметры функции должны быть объявлены во время описания функции.

Время жизни и Видимость Концепции Время жизни и Видимость являются очень важными для понимания структуры программ на Си. Время жизни переменной может быть или глобальным или локальным.

Объект с глобальным временем жизни характеризуется определенной памятью и значением на протяжении всей жизни программы. Объект с локальным временем жизни захватывает новую память при каждом входе в блок, в котором он определен или объявлен. Когда блок завершается, локальный объект пропадает, а следовательно пропадает его значение. Определение блоков описывается ниже. Объект считается видимым в блоке или исходном файле, если известны тип и имя объекта в блоке или исходном файле.

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

Объявления и определения вне блоков находятся на внешнем уровне. Переменные и функции могут быть объявлены как на внешнем уровне, так и на внутреннем. Язык программирования Си 22 Переменные также могут быть определены на внутреннем и на внешнем уровне, а функции определяются только на внешнем уровне. Все функции имеют глобальное время жизни, невзирая на то, где они объявлены. Переменные, объявленные на внешнем уровне, всегда имеют глобальное время жизни. Переменные, объявленные на внутреннем уровне, всегда имеют локальное время жизни, однако, классы памяти, специфицированные как static и extern, могут быть использованы для объявления глобальных переменных или ссылок на них внутри блока.

Переменные, объявленные или определенные на внешнем уровне, видимы из точки, в которой они объявлялись или определялись, до конца файла. Однако, переменные, заданные классом памяти static на внешнем уровне, видимы только внутри исходного файла, в котором они определены.

В общем случае, переменные, объявленные или определенные на внутреннем уровне, видимы от точки, в которой они объявлены или определены, до конца блока, в котором представлены объявления или определения. Эти переменные называются локальными. Если переменная, объявленная внутри блока, имеет то же самое имя, как и переменная, объявленная на внешнем уровне, то определение переменной в блоке заменяет имеет предпочтение определение внешнего уровня на протяжении блока. Видимость переменной внешнего уровня восстанавливаетсяпри завершении блока.

Блочная видимость может вкладываться. Это значит, что блок, вложенный внутрь другого блока, может содержать объявления, которые переопределяют переменные, объявленные во внешнем блоке. Переопределение переменной имеет силу во внутреннем блоке, но первоначальное определение восстанавливается, когда управление возвращается внешнему блоку. Переменные из внешних блоков видимы внутри всех внутренних блоков до тех пор, пока они не переопределены во внутреннем блоке.

Функции класса памяти static видимы только в исходном файле, в котором они определены. Все другие функции являются глобально видимыми. Язык программирования Си 23 В следующем примере программы иллюстрируются блоки, вложения и видимость переменных. i defined at external level int i 1 main function defined at external level main prints 1 value of external level i printf d n, i first nested block i and j defined at internal level int i 2, j 3 prints 2, 3 printf d n d n, i, j second nested block i is redefined int i 0 prints 0, 3 printf d n d n, i, j end of second nested block prints 2 outer definition restored printf d n, i end of first nested block prints 1 external level definition restored printf d n, i В этом примере показано четыре уровня видимости самый внешний уровень и три уровня, образованных блоками.

Предполагается, что функция printf определена где нибудь в другом месте программы. Функция main печатает значения 1, 2, 3, 0, 3, 2, 1. Классы имен В любой программе на Си имена используются для ссылок на различного рода объекты.

Когда пишется программа на Си, то в ней используются идентификаторы для именования функций, Язык программирования Си 24 переменных, формальных параметров, областей памяти и других объектов программы. По определенным правилам в Си допускаются использование одного и того же идентификатора для более чем одного программного объекта. Чтобы различать идентификаторы для различного рода объектов, компилятор устанавливает так называемые Классы имен. Для избегания противоречий, имена внутри одного класса должны быть уникальными, однако в различных классах могут появляться идентичные имена. Это означает, что можно использовать один и тот же идентификатор для двух или более различных объектов, если объекты принадлежат к различным классам имен. Однозначное разрешение ссылок компилятор осуществляет по контексту данного идентификатора в программе.

Ниже описываются виды объектов, которые можно именовать в программе на Си, а также правила их именования.

Имена переменныхи функций относятся к одному классу имен вместе с формальными параметрами и перечислимыми константами. Поэтому, имена переменных и функций этого класса должны быть отличны от других имен с той же видимостью. Однако, имена переменных могут быть переопределены внутри программных блоков. Имена функций также могу быть переопределены в соответствии с правилами видимости. Имена формальных параметров функции появляются вместе с именами переменных функции, поэтому имена формальных параметров должны быть отличны от имен переменных.

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

Имена typedef относятся к одному классу имен вместе с именами переменных и функций. Поэтому они должны быть Язык программирования Си 25 отличны от всех имен переменных и функций с той же самой видимостью, а также от имен формальных параметров и перечислимых констант. Подобно именам переменных, имена, используемые для typedef типов могут быть переопределены внутри блоков программы. Теги перечислений, структур и совмещений сгруппированы вместе в одном классе имен. Каждый тег перечисления, структуры или соединения должен быть отличен от других тегов с той же самой видимостью.

Теги не конфликтуют с любыми другими именами. Элементы каждой структуры или совмещения образуют класс имен, поэтому имя элемента должно быть уникальным внутри структуры или совмещения, но это не означает, что они должны быть отличными от любого другого имени в программе, включая имена элементов других структур и совмещений.

Метки операторов формируют отдельный класс имен. Каждая метка оператора должна быть отлична от всех других меток операторов в той же самой функции. Метки операторов могут совпадать с именами меток других функций. Пример struct student char student 20 int class int id student В этом примере имя тега структуры, элемента структуры и переменной относятся к трем различным классам имен, поэтому не будет противоречия между тремя объектами с именем student. Компилятор определит по контексту программы как интерпретировать каждый из случаев.

Например, когда имя student появится после ключевого слова struct, это будет означать, что появился tag структуры. Когда имя student появится после операции выбора элемента или то это означает, что имя ссылается на элемент структуры. В другом контексте имя student является переменной структурного типа. Язык программирования Си 26 Объявления Объявления Си имеют следующий синтаксис sc specifier type specifier declarator initializer, declarator initializer, где sc!specifier Спецификатор класса памяти. type!specifier Имя определяемого типа. declarator Идентификатор, который может быть модифицирован при объявлении указателя, массива или функции. initializer Задает значение или последовательность значений, присваиваемых переменной при объявлении.

Все переменные Си должны быть явно объявлены перед их использованием. Функции Си могут быть объявлены явно или неявно в случае их вызова перед определением. Язык Си определяет стандартное множество типов данных.

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

В Си определено четыре спецификатора класса памяти, а именно auto, extern, register и static. Спецификатор класса памяти определяет, каким образом объявляемый объект запоминается и инициализируется и из каких частей программы можно ссылаться на него. Расположение объявления внутри программы, а также наличие или отсутствие других объявлений также важные факторы при определении видимости переменных. Язык программирования Си 27 Спецификаторы типов Язык Си поддерживает определения для множествабазовых типов данных, называемых основными типами. signed char float void signed int double signed short int signed long int unsigned char unsigned int unsignet short int unsigned long int Перечислимые типы также рассматриваются как основные типы. Типы signed char, signed int, signed short int и signed long int вместе с соответствующими двойниками unsigned называются типами целых.

Спецификаторы типов float и double относятся к типу плавающих. В объявлениях переменных и функций можно использовать любые спецификаторы целый и плавающий.

Тип void может быть использован только для объявления функций, которые не возвращают значения. Можно задать дополнительные спецификаторы типа путем объявления typedef. При записи спецификаторов типов допустимы сокращения. В целых типах ключевое слово signed может быть опущено. Так, если ключевое слово unsigned опускается в записи спецификатора типа, то тип целого будет знаковым, даже если опущено ключевое слово signed.

В некоторых реализациях могут быть использованы опции компилятора, позволяющие изменить умолчание для типа char со знакового на беззнаковый. Когда задана такая опция, сокращение char имеет то же самое значение, что и unsigned char, и следовательно ключевое слово sidned должно быть записано при объявлении символьной величины со знаком. Тип char используется для запоминания буквы, цифры или символа из множества представимых символов. Значением объекта типа char является ASCII код, соответствующий данному Язык программирования Си 28 символу.

Так как тип char интерпретируется как однобайтовая целая величина с областью значений от 128 до 127, то только величины от 0 до 127 имеют символьные эквиваленты. Аналогично, тип unsigned char может запоминать величины с областью значений от 0 до 255. Заметим, что представление в памяти и область значений для типов int и unsigned int не определены в языке Си. По умолчанию размер int со знаком и без знака соответствует реальному размеру целого на данной машине.

Например, на 16 ти разрядной машине тип int всегда 16 разрядов или 2 байта. На 32 х разрядной машине тип int всегда 32 разряда или 4 байта. Таким образом, тип int эквивалентен типам short int или long int в зависимости от реализации. Аналогично, тип unsigned int эквивалентен типам unsigned short или unsigned long. Спецификаторы типов int и unsigned int широко используются в программах на Си, поскольку они позволяют наиболее эффективно манипулироватьцелыми величинами на данной машине.

Однако, размер типов int и unsigned int переменный, поэтому программы, зависящие от специфики размера int и unsigned int могут быть непереносимы. Переносимость кода можно улучшить путем включения выражений с sizeof операцией. Область значений величин Область значений величин это интервал целых величин от минимального до максимального, который может быть представлен в заданном числе бит. Например, константное выражение 32768 состоит из арифметического отрицания, предшествующего величине константы 32768. Так как 32768 это слишком большое значение для типа short, то оно задается типом long и следовательно константное выражение 32768 будет иметь тип long. Величина 32768 может быть представлена как short только путем преобразования ее типа к типу short.

Информация не будет потеряна при преобразовании типа, поскольку 32768 может быть представлено двумя байтами памяти. Аналогично такая величина, как 65000 может быть представлена как unsigned short только путем преобразования ее к типу unsigned short или заданием величины в восьмеричном или шестнадцатеричном представлении.

Величина 65000 в Язык программирования Си 29 десятичном представлении рассматривается как знаковая и задается типом long, так как 65000 не соответствует типу short. Эта величина типа long может быть преобразована к типу unsigned short без потери информации, так как 65000 можно разместить в двух байтах памяти. Восьмеричные и шестнадцатеричные константы могут быть знакового и беззнакового типа в зависимости от их размера.

Однако, метод, используемый для назначения типов этим константам гарантирует, что они всегда будут преобразованы к беззнаковому целому. Числа с плавающей точкой используют IEEE институт инженеров электриков и электронщиков формат. Величины типа float занимают 4 байта, состоящих из бита знака и 7 ми битовой избыточной экспоненты и 24 х битовой мантиссы. Мантисса представляет число между 1.0 и 2.0. Так как старший бит мантиссы всегда 1, он не запоминается в памяти. Это представление дает область значений приблизительно от 3.4E 38 до 3.4E38. Величины типа double занимают 8 байт. Их формат аналогичен float формату, за исключением того, что порядок занимает 11 бит, а мантисса 52 бита плюс бит, который опущен.

Это дает область значений приблизительно от 1.7E 308 до 1.7E 308. Деклараторы Синтаксис identifier declarator declarator constant expression declarator declarator declarator arg type list declarator Си позволяет объявлять массивы величин, указатели на величины, величины возвратов функций.

Чтобы объявить эти объекты, нужно использовать декларатор, возможно модифицированный квадратными скобками, круглыми скобками и звездочкой, что соответствует типам массива, функции или указателя. Деклараторы появляются в объявлениях указателей, массивов и функций. Язык программирования Си 30 Деклараторы массивов, функций и указателей Когда декларатор состоит из немодифицируемого идентификатора, то объект, который объявляется, имеет немодифицированный тип. Звездочка, которая может появиться слева от идентификатора, модифицирует его в тип указателя.

Если за идентификатором следуют квадратные скобки, то тип модифицируется на тип массива. Если за идентификатором следуют круглые скобки, то тип модифицируется на тип функции. Сам по себе декларатор не образует полного объявления. Для этого в объявление должен быть включен спецификатор типа. Спецификатор типа задает тип элементов массива или тип адресуемых объектов и возвратов функции.

Следующие примеры иллюстрируют простейшие формы деклараторов 1. int list 20 2. char cp 3. double func void, где 1. Массив list целых величин 2. Указатель cp на величину типа char 3. Функция func без аргументов, возвращающая величину double. Составные деклараторы Любой декларатор может быть заключен в круглые скобки. Обычно, круглые скобки используются для спецификации особенностей интерпретации составного декларатора. Составной декларатор это идентификатор, определяемый более чем одним модификатором массива, указателя или функции.

С отдельным идентификатором могут появиться различные комбинации модификаторов массива, указателя или функции. Некоторые комбинации недопустимы. Например, массив не может быть композицией функций, а функция не может возвратить массив или функцию. При интерпретации составных деклараторов квадратные и круглые скобки справа от идентификатора имеют приоритет перед звездочкой слева от идентификатора. Квадратные или круглые скобки имеютодин и тот же приоритет и рассматриваются слева направо.

Спецификатор типа рассматривается на последнем шаге, когда Язык программирования Си 31 декларатор уже полностью проинтерпретирован. Можно использовать круглые скобки, чтобы изменить порядок интерпретации на необходимый в данном случае. При интерпретации составных деклараторов может быть предложено простое правило, которое читается следующим образом изнутри наружу. Нужно начать с идентификатора и посмотреть вправо, есть ли квадратные или круглые скобки.

Если они есть, то проинтерпретировать эту часть декларатора, затем посмотреть налево, если ли звездочка. Если на любой стадии справа встретится закрывающая круглая скобка, то вначале необходимо применить все эти правила внутри круглых скобок, а затем продолжить интерпретацию. На последнем шаге интерпретируется спецификатор типа. В следующем примере проиллюстрированы эти правила. Последовательность шагов при интерпретации перенумерована. Деклараторы со специальными ключевыми словами Можно использовать следующие специальные ключевые слова cdecl far fortran huge near pascal Эти ключевые слова используются для изменения смысла объявлений переменной и функции.

Когда специальное ключевое слово встречается в деклараторе, то оно модифицирует объект, расположенный справа от ключевого слова. Допускается более одного ключевого слова, модифицирующего объект. Например, идентификатор функции может быть модифицирован двумя ключевыми словами far и pascal. Порядок ключевых слов в этом случае не важен, то есть far pascal и pascal far имеют один и тот же смысл.

В различных частях объявления могут быть использованы два или более ключевых слов для модификации смысла составляющих частей объявления. Язык программирования Си 32 Например, в следующем объявлении содержится в различных местах два ключевых слова far и ключевое слово pascal int far pascal far func void Идентификатор функции func модифицируется ключевыми словами pascal и far. func возвращает величину, объявленную как far указатель на величину типа int. Как и прежде в любом объявлении могут быть использованы круглые скобки для изменения порядка интерпретации.

Правила интерпретациисоставных объявлений со специальными ключевыми словами остаются теми же, что и без них. В следующих примерах показано использование специальных ключевых слов в объявлениях. Example 1 int huge database 65000 Example 2 char far x Example 3 double near cdecl calc double, double double cdecl near calc double, double Example 4 char far fortran initlist INITSIZE char far nextchar, far prevchar, far currentchar Example 5 char far far getint int far 6 5 2 1 3 4 В первом примере объявляется массив huge, поименованный database, содержащий 65000 элементов типа int. Декларатор массива модифицируется ключевым словом huge. Во втором примере ключевое слово far модифицирует расположенную справа звездочку, делая x far указателем на указатель к величине типа char. Это объявление эквивалентно и такой записи char far x В третьем примере показано два эквивалентных объявления.

Оба объявляют calc как функции с near и cdecl атрибутами.

В четвертом примере также представлено два объявления первое объявляет far fortan массив символов, поименованный Язык программирования Си 33 initlist, а второе объявляет три far указателя, поименованные nexchar, prevchar и currentchar. Указатели могут быть использованы для запоминания адресов символов массива initlist. Заметим, что ключевое слово far должно быть повторено перед каждым декларатором.

В пятом примере показано более сложное объявление с различными случаями расположения ключевого слова far. Интерпретация этого объявления состоит из следующих шагов 1. Идентификатор getint объявляется как 2. far указатель на 3. функцию, требующую 4. один аргумент, который является far указателем на величину типа int 5. и возвращающую far указатель на 6. величину типа char Заметим, что ключевое слово far всегда модифицирует объект, который следует справа.

Объявления переменной Объявление простой переменной Синтаксис type specifier identifier, identifier Объявление простой переменной определяет имя переменной и ее тип оно может также определять класс памяти переменной. Имя переменной это идентификатор, заданный в объявлении. Спецификатор типа type specifier задает имя определяемого типа данных. Можно определить имена различных переменных в том же самом объявлении, задавая список идентификаторов, разделенных запятой.

Каждый идентификатор списка именует переменную. Все переменные, заданные в объявлении, имеют один и тот же тип. Примеры int x Example 1 unsigned long reply, flag Example 2 Язык программирования Си 34 double order Example 3 В первом примере объявляется простая переменная x. Эта переменная может принимать любое значение из множества значений, определяемых для типа int. Во втором примере объявлены две переменные reply и flag. Обе переменные имеют тип unsigned long. В третьем примере объявлена переменная order, которая имеет тип double.

Этой переменной могут быть присвоены величины с плавающей запятой. Объявление перечисления Синтаксис enum tag enum list identifier, identifier enum tag identifier, identifier Объявление перечисления задает имя переменной перечисления и определяет список именованных констант, называемый списком перечисления. Значением каждого имени списка является целое число. Переменная перечисления принимает значение одной из именованных констант списка.

Именованные константы списка имеют тип int. Таким образом, память соответствующая переменной перечисления это память, необходимая для размещения отдельной целой величины. Объявление перечисления начинается с ключевого слова enum и имеет две формы представления. В первой форме представления имена перечисления задаются в списке перечисления enum list. Опция tag это идентификатор, который именует тип перечисления, определенного в enum list. Переменную перечисления именует identifier.

В объявлении может быть описана более чем одна переменная перечисления. Во второй форме используется тег перечисления, который ссылается на тип перечисления. В этой форме объявления список перечисления не представлен, поскольку тип перечисления определен в другом месте. Если задаваемый тег не ссылается на уже определенный тип перечисления, или если именуемый тегом тип находится вне текущей видимости, то выдается ошибка. Язык программирования Си 35 enum list имеет следующий синтаксис identifier constant expression, identifier constant expression Каждый идентификатор именует элементы перечисления.

По умолчанию первому идентификатору соответствует значение 0, следующий идентификатор ассоциируется со значением 1 и т.д. Имя константы перечисления эквивалентно ее значению. Запись constant expression переопределяет последовательность значений, заданных по умолчанию. Идентификатор, следующий перед записью constant expression принимает значение, задаваемое этим константным выражением.

Константное выражение имеет тип int и может быть отрицательным. Следующий идентификатор в списке ассоциируется с величиной, равной constant expression 1, если он явно не задается другой величиной. Перечисление может содержать повторяющиеся значения идентификаторов, но каждый идентификатор должен быть уникальным. Кроме того, он должен быть отличным от всех других идентификаторов перечислений с той же видимостью. Например, двум различным идентификаторам null и zero может быть задано значение 0 в одном и том же перечислении.

Идентификаторы должны быть отличны от других идентификаторов с той же самой видимостью, включая имена обычных переменных и идентификаторы других перечислений. Теги перечислений должны быть отличны от тегов перечислений, тегов структур и совмещений с той же самой видимостью. Примеры Example 1 enum day saturday, sunday 0, monday, tuesday, wednesday, thursday, friday Язык программирования Си 36 workday Example 2 enum day today wednesday В первом примере определяется тип перечисления, поименованный day и объявляется переменная workday этого типа перечисления.

С saturday по умолчанию ассоциируется значение 0. Идентификатор sunday явно устанавливается в 0. Оставшиеся идентификаторы по умолчанию принимают значение от 1 до 5. Во втором примере переменной today типа enum day присваивается значение из перечисления. Заметим, что для присваивания используется имя константы из перечисления. Так как тип перечисления day был предварительно объявлен, то достаточно сослаться только на тег перечисления.

Объявления структур Синтаксис struct tag member declaration list declarator, declarator struct tag declarator, declarator Объявление структуры задает имя типа структуры и специфицирует последовательность переменных величин, называемых элементами структуры, которые могут иметь различные типы. Объявление структуры начинается с ключевого слова struct и имеет две формы представления, как показано выше. В первой форме представления типы и имена элементов структуры специфицируются в списке объявлений элементов member declaration list . tag это идентификатор, который именует тип структуры, определенный в списке объявлений элементов.

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

В этой форме объявления отсутствует список объявлений элементов, поскольку тип структуры определен в другом месте. Определение типа структуры должно быть видимым для тега, который используется Язык программирования Си 37 в объявлении и определение должно предшествовать объявлению через тег, если тег не используется для объявления указателя или структурного типа typedef. В последних случаях объявления могут использовать тег структуры без предварительного определения типа структуры, но все же определение должно находиться в пределах видимости объявления.

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

Элемент не может иметь тип структуры, в которой он появляется. Однако, элемент может быть объявлен, как указатель на тип структуры, в которую он входит, позволяя создавать списочные структуры. Битовые поля Объявления битовых полей имеют следующий синтаксис type specifier identifier constant expression Битовое поле состоит из некоторого числа бит, специфицированных константным выражением constant expression. Для битового поля спецификатор типа type specifier должен специфицировать беззнаковый целый тип, а константное выражение должно быть неотрицательной целой величиной.

Массивы битовых полей, указатели на битовые поля и функции, возвращающие битовые поля не допускаются. Идентификатор identifier именует битовое поле. Неименованное битовое поле, чей размер специфицируется как нулевой, имеет специальное назначение оно гарантирует, что память для следующей переменной объявления будет начинаться на границе int. Идентификаторы элементов внутри объявляемой структуры должны быть уникальными.

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

Память каждой переменной начинается на границе свойственной ее типу. Поэтому могут появляться неименованные участки между соседними элементами. Битовые поля не располагаются на пересечении границ, объявленных для них типов. Например, битовое поле, объявленное с типом unsigned int, упаковывается или в пространстве, оставшимся от предыдущего unsigned int или начиная с нового unsigned int. Примеры Example 1 struct float x, y complex Example 2 struct employee char name 20 int id long class temp Example 3 struct employee student, faculty, staff Example 4 struct sample char c float pf struct sample next x Example 5 struct unsigned icon 8 unsigned color 4 unsigned underline 1 unsigned blink 1 screen 25 80 Язык программирования Си 39 В первом примере объявляется переменная с именем complex типа структура.

Эта структура состоит из двух элементов x и y типа float. Тип структуры не поименован. Во втором примере объявляется переменная с именем temp типа структура. Структура состоит из трех элементов с именами name, id и class.

Элемент с именем name это массив из 20 ти элементов типа char. Элементы с именами id и class это простые переменные типа int и long соответственно. Идентификатор employee является тегом структуры. В третьем примере объявлены три переменных типа структура с именами student, faculty и staff. Каждая из структур состоит из трех элементов одной и той же конструкции. Элементы определены при объявлении типа структуры с тегом employee в предыдущем примере.

В четвертом примере объявляется переменная с именем x типа структура. Первые два элемента структуры представлены переменной c типа char и указателем pf на величину типа float. Третий элемент с именем next объявляются как указатель на описываемую структуру sample. В пятом примере объявляется двумерный массив поименованный screen, элементы которого имеют структурный тип. Массив состоит из 2000 элементов и каждый элемент это отдельная структура, состоящая из четырех элементов типа bit fild с именами icon, color, underline и blink.

Объявление совмещений Синтаксис union tag member declaration list declarator, declarator union tag declarator, declarator Объявление совмещения определяет имя переменной совмещения и специфицирует множество переменных, называемых элементами совмещения, которые могут быть различных типов. Переменная с типом совмещения запоминает любую отдельную величину, определяемую набором элементов совмещения. Язык программирования Си 40 Объявление совмещения имеет тот же самый синтаксис, как и объявление структуры, за исключением того, что она начинается с ключевого слова union вместо ключевого слова struct.

Для объявления совмещения и структуры действуют одни и те же правила, за исключением того, что в совмещении не допускаются элементы типа битовых полей. Память, которая соответствует переменной типа совмещение, определяется величиной для размещения любого отдельного элемента совмещения. Когда используется наименьший элемент совмещения, то переменная типа совмещения может содержать неиспользованное пространство.

Все элементы совмещения запоминаются в одном и том же пространстве памяти переменной, начиная с одного и того же адреса. Запомненные значения затираются каждый раз, когда присваивается значение очередного элемента совмещения. Объявление массива Синтаксис type specifier declarator constant expression type specifier declarator Здесь квадратные скобки это терминальные символы. Объявление массива определяет тип массива и тип каждого элемента.

Оно может определять также число элементов в массиве. Переменная типа массив рассматривается как указатель на элементы массива. Объявление массива может представляться в двух синтаксических формах, указанных выше. Декларатор declarator задает имя переменной. Квадратные скобки, следующие за декларатором, модифицируют декларатор на тип массива. Константное выражение constant expression, заключенное в квадратные скобки, определяет число элементов в массиве.

Каждый элемент имеет тип, задаваемый спецификатором типа type specifier, который может специфицировать любой тип, исключая void и тип функции. Во второй синтаксической форме опущено константное выражение в квадратных скобках. Эта форма может быть использована только тогда, когда массив инициализируется или объявлен как формальный параметр или объявлен как ссылка на массив, явно определенныйгде то в программе. Язык программирования Си 41 Массив массивов или многомерный массив определяется путем задания списка константных выражений в квадратных скобках, следующего за декларатором type specifier declarator constant expression constant expression Каждое константное выражение constant expression в квадратных скобках определяет число элементов в данном измерении массива, так что объявление двумерного массива содержит два константных выражения, трехмерного три и т.д. Если многомерный массив объявляется внутри функции или если он инициализируется либо объявляется как формальный параметр или объявляется как ссылка на массив, явно определенный где то в программе, то первое константное выражение может быть опущено.

Массив указателей на величины заданного типа может быть определен посредством составного декларатора. Типу массив соответствует память, которая требуется для размещения всех его элементов.

Элементы массива с первого до последнего запоминаются в последовательных возрастающих адресах памяти. Между элементами массива в памяти разрывы отсутствуют.

Элементы массива запоминаются друг за другом построчно. Например, массив, содержащий две строки с тремя столбцами каждая, char A 2 3 будет запомнен следующим образом. Сначала запоминаются три столбца первой строки, затем элементы трех столбцов второй строки. Смысл этого в том, чтобы последний индекс был более быстрым. Чтобы сослаться на отдельный элемент массива, нужно использовать индексное выражение. Объявление указателей Синтаксис type specifier declarator Объявление указателя определяет имя переменной типа указатель и тип объекта, на который указывает эта переменная.

Декларатор declarator определяет имя переменной с возможной модификацией ее типа. Спецификатор типа type specifier задает тип объекта, который может быть базового типа, типа структуры или совмещения. Язык программирования Си 42 Переменная типа указатель может указывать также на функции, массивы и другие указатели. Если указатель не используется до определения типа структуры или совмещения, то он может быть объявлен ранее этого определения. Такие объявления допускаются, поскольку компилятору не требуется знать размер структуры или совмещения, чтобы распределить память под переменную типа указатель.

Указатель может быть объявлен посредством использования тега структуры или совмещения. Переменная, объявленная как указатель, хранит адрес памяти. Размер памяти, требуемый для адреса, и смысл адреса зависит от данной конфигурации машины. Указатели на различные типы не обязательно имеют одну и ту же длину.

Для некоторых реализаций используются специальные ключевые слова near, far и huge, чтобы модифицировать размер указателя. Как объявляются функции Синтаксис type specifier declarator arg type list, declarator Объявление функции определяет имя, тип возврата функции и, возможно, типы и число ее аргументов. Объявление функции также называется forward объявлением. Декларатор функции объявляет имя функции, а спецификатор типа задает тип возврата. Если спецификатор типа опущен в объявлении функции, то предполагается, что функция возвращает величину типа int. Объявление функции может включать спецификаторы класса памяти extern или static.

Список типов аргументов Список типов аргументов arg type list определяет число и типы аргументов функции. Синтаксис списка аргументов следующий type name list , Список имен типов это список из одного или более имен типов. Каждое имя типа отделяется от другого запятой. Первое имя типа задает тип первого аргумента, второе имя типа задает Язык программирования Си 43 тип второго аргумента и т. д. Если список имен типов заканчивается запятой с многоточием то это означает, что число аргументов функции переменно.

Однако, предполагается, что функция будет иметь не меньше аргументов, чем имен типов, предшествующих многоточию. Если список типов аргументов arg type list содержит только многоточие, то число аргументов функции является переменным или равно нулю. Важно Чтобы поддержать совместимость с программами предыдущих версий, компилятор допускает символ запятой без многоточия в конце списка типов аргументов для обозначения их переменного числа.

Запятая может быть использована и вместо многоточия для объявления нуля или более аргументов функции. Использование запятой поддерживается только для совместимости. Использование многоточия рекомендуетсядля нового представления. Имя типа type name для типов структуры, совмещения или базового типа состоит из спецификатора этого типа такого как int. Имена типов для указателей, массивов и функций формируются путем комбинации спецификатора типа с абстрактным декларатором.

Абстрактный декларатор это декларатор без идентификатора. Для того чтобы объявить функцию, не имеющую аргументов, может быть использовано специальное ключевое слово void на месте списка типов аргументов. Компилятор вырабатывает предупреждающее сообщение, если в вызове такой функции будут специфицированы аргументы. Еще одна специальная конструкция допускается в списке типов аргументов.

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

Язык программирования Си 44 Тип возврата Функции могут возвращать величины любого типа за исключением массивов и функций. Для этого посредством спецификатора типа type specifier в объявлении функции можно специфицировать любой тип основной, структуру или совмещение. Идентификатор функции может быть модифицирован одной или несколькими звездочками, чтобы объявить возвращаемую величину типа указателя. Хотя функции и не допускают возвратов массивов или функций, но они могут возвращать указатели на массивы или функции.

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

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

Язык программирования Си 45 Термин видимость относится к той части программы, в которой могут ссылаться друг на друга функции и переменные. Объекты с глобальным временем жизни существуют на протяжении выполнения исходной программы, но они могут быть видимы не во всех частях программы. Месторасположение объявления переменной или функции внутри исходных файлов также влияют на класс памяти и видимость.

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

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

Переменная на внешнем уровне может быть определена путем ее объявления со спецификатором класса памяти static. Такая переменная можетбыть явно инициализирована константным выражением. Если инициализатор отсутствует, то переменная автоматически инициализируется нулем во время компиляции. Таким образом, объявления static int k 16 и static int k оба рассматриваются как определения. Переменная определяется, когда она явно инициализируется на внешнем уровне. Например, int j 3 это определение переменной.

Язык программирования Си 46 Так как переменная определяется на внешнем уровне, то она видима в пределах остатка исходного файла, от места, где она определена. Переменная не видима выше своего определения в том же самом исходном файле ни в других исходных файлах программы, если не объявлена ссылка, которая делает ее видимой. Переменная может быть определена на внешнем уровне внутри исходного файла только один раз. Если задается спецификатор класса памяти static, то в других исходных файлах могут быть определены переменные с тем же именем.

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

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

Есть одно исключение из правил, описанных выше. Можно опустить из объявления переменной на внешнем уровне спецификатор класса памяти и инициализатор. Например, объявление int n будет правильным внешним объявлением. Это объявление имеет два различных смысла в зависимости от контекста. 1. Если где нибудь в программебудет определена на внешнем уровне переменная с тем же именем, то объявление является ссылкой на эту переменную, как если бы был использован спецификатор класса памяти extern в объявлении.

Язык программирования Си 47 2. Если нет такого определения, то объявленной переменной распределяется память во время линкования и переменная инициализируется нулем. Если в программе появится более чем одно такое объявление, то память распределится для наибольшего размера из объявленных переменных. Например, если программа содержит два неинициализированных объявления переменной i на внешнем уровне int i и char i то память во время линкования распределится под переменную i типа int. Неинициализированные объявления переменной на внешнем уровне не рекомендуются для файлов, которые могут быть размещены в библиотеку.

Пример SOURCE FILE ONE extern int i reference to i defined below main i printf d n, i i equals 4 next int i 3 definition of i next i printf d n, i i equals 5 other SOURCE FILE TWO extern int i reference to i in first source file other i printf d n, i i equals 6 Язык программирования Си 48 Объявление переменной на внутреннем уровне Любой из четырех спецификаторов класса памяти может быть использован для объявления переменной на внутреннем уровне.

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

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

Когда компилятор встречает спецификатор класса памяти register в объявлении, а свободного регистра не имеется, то для переменной распределяется память класса auto. Компилятор назначает переменным регистровую память в том порядке, в котором появляются объявления в исходном файле. Регистровая память, если она имеется, гарантирована только для целого и адресного типов.

Переменная, объявленная на внутреннем уровне со спецификатором класса памяти static, имеет глобальное время жизни и имеет видимость только внутри блока, в котором она объявлена. В отличие от переменных auto, переменные, объявленные как static, сохраняют свое значение при завершении блока. Переменные класса памяти static могут быть инициализированы константным выражением. Если явной инициализации нет, то переменная класса памяти static Язык программирования Си 49 автоматически устанавливается в 0. Инициализация выполняется один раз во время компиляции.

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

Внутреннее объявление extern не изменяет видимость глобальной переменной в любой другой части программы. Пример int i 1 main reference to i, defined above extern int i initial value is zero a is visible only within main static int a b is stored in a register, if possible register int b 0 default storage class is auto int c 0 values printed are 1, 0, 0, 0 printf d n d n d n d n, i, a, b, c other other i is redefined int i 16 this a is visible only within other static int a 2 a 2 values printed are 16, 4 printf d n d n, i, a Переменная i определяется на внешнем уровне с инициализацией 1. В функции main объявлена ссылка extern на Язык программирования Си 50 переменную i внешнего уровня.

Переменная класса памяти static автоматически устанавливается в 0, так как инициализатор опущен. Вызов функции print предполагается, что функция print определена в каком то месте исходной программы печатает величины 1, 0, 0, 0. В функции other, переменная i переопределяется как локальная переменная с начальным значением 16. Это не влияет на значение внешней переменной i. Переменная a объявляется как переменная класса памяти static с начальным значением 2. Она не противоречитпеременной a, объявленной в функции main, так как видимость переменных класса памяти static на внутреннем уровне ограничена блоком, в котором она объявлена.

Объявление функции на внешнем и внутреннем уровнях Функции могут быть объявлены со спецификаторами класса памяти static или extern.

Функции всегда имеют глобальное время жизни. Правила видимости для функций отличаются от правил видимости для переменных. Объявления функций на внутреннем уровне имеют тот же самый смысл, что и объявления на внешнем уровне. Это значит, что функции не могут иметь блочной видимости и видимость функций не может быть вложенной. Функция объявленная как static, видима только в пределах исходного файла, в котором она определяется. Любая функция в том же самом исходном файле может вызвать функцию static, но функции static из других файлов нет. Функция static с тем же самым именем может быть объявлена в другом исходном файле.

Функции, объявленные как extern видимы в пределах всех исходных файлов, которые составляют программу. Любая функция может вызвать функцию extern. Объявления функций, в которых опущен спецификатор класса памяти, считаются по умолчанию extern. Инициализация В объявлении переменной может быть присвоено начальное значение посредством инициализатора. Величина или величины инициализатора присваиваются переменной.

Синтаксически записи инициализатора предшествует знак Язык программирования Си 51 равно initializer Могут быть инициализированы переменные любого типа. Функции не инициализируются. Объявления, которые используют спецификатор класса памяти extern не могут содержать инициализатора. Переменные, объявленные на внешнем уровне, могут быть инициализированы. Если они явно не инициализированы, то они устанавливаются в нуль во время компиляции или линкования.

Любая переменная, объявленная со спецификатором класса памяти static, может быть инициализирована константным выражением. Инициализация переменных класса static выполняется один раз во время компиляции. Если отсутствует явная инициализация, то переменные класса памяти static автоматически устанавливаются в нуль. Инициализация переменных auto и register выполняется каждый раз при входе в блок, в котором они объявлены. Если инициализатор опущен в объявлении переменной класса памяти auto или register, то начальное значение переменной не определено.

Инициализация составных типов auto массив, структура, совмещение запрещена. Любое составное объявление класса памяти static может быть инициализировано на внешнем уровне. Начальными значениями для внешних объявлений переменной и для всех переменных static как внешних так и внутренних должно быть константное выражение. Автоматические и регистровые переменные могут быть инициализированы константными или переменными величинами.

Базовые типы и типы указателей Синтаксис expression Величина выражения присваивается переменной. Для выражения допустимы правила преобразования. Язык программирования Си 52 Составные типы Синтаксис initializer list Список инициализаторов initializer list это последовательность инициализаторов, разделенных запятыми. Каждый инициализатор в последовательности это либо константное выражение, либо список инициализаторов. Поэтому, заключенный в фигурные скобки список, может появиться внутри другого списка инициализации.

Эта конструкция используется для инициализации элементов составных конструкций. Для каждого списка инициализации значения константных выражений присваиваются в порядке следования элементов составной переменной. Когда инициализируется совмещение, то список инициализаторов представляет собой единственное константное выражение. Величина константного выражения присваивается первому элементу совмещения. Если в списке инициализации меньше величин, чем их имеется в составном типе, то оставшиеся памяти инициализируются нулем.

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

Фигурные скобки могут также появляться вокруг индивидуальных инициализаторов в списке. Когда инициализируются составные переменные, то нужно позаботиться о том, чтобы правильно использовать фигурные скобки и списки инициализаторов. В следующем примере иллюстрируется более детально интерпретация компилятором фигурных скобок. Язык программирования Си 53 Строковые инициализаторы Массив может быть инициализирован строчным литералом.

Например, char code abc инициализирует code как массив символов из четырех элементов. Четвертым элементом является символ 0, который завершает все строковые литералы. Если специфицируется размер массива, а строка больше чем специфицированный размер, то лишние символы отбрасываются. Следующее объявление инициализирует переменную code, как трехэлементный массив символов char code 3 abcd В примере только три первые символа инициализатора назначаются для массива code. Символ d и символ нуль отбрасываются.

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

Типы структур, совмещений и перечислений Объявления типов структур, совмещений и перечислений имеют ту же самую общую синтаксическую форму, как и объявления переменных этих типов. В объявлении типа идентификатор переменной опущен, так как нет переменной Язык программирования Си 54 которая объявляется.

Именем структуры, совмещения или перечисления является тег. В объявлении типа может появиться список объявлений элементов member declaration list или список перечисления enum list, определяющие тип. Сокращенная форма объявления переменной, в котором tag ссылается на тип, определенный где то еще, при объявлении типа не используется. Объявления typedef Синтаксис typedef type spesifier declarator, declarator Объявления typedef являются аналогом объявления переменной, за исключением того, что ключевое слово typedef заменяет спецификатор класса памяти.

Объявление интерпретируется тем же самым путем, как объявления переменной или функции, но declarator вместо того, чтобы стать переменной типа, специфицированного объявлением, становится синонимом имени типа. Объявление typedef не создает типов. Оно создает синонимы для существующих имен типов, которые были специфицированы другим способом. Любой тип может быть объявлен с typedef, включая типы указателя, функции и массива.

Имя с ключевым словом typedef для типов указателя, структуры или совмещения может быть объявлено прежде чем эти типы будут определены, но в пределах видимости объявления. Имена типов Имя типа специфицирует особенности типа данных. Имена типов используются в трех контекстах в списках типов аргументов, при объявлении функций, в вычислениях cast преобразованиях типов, и в sizeof операциях. Именами для основных, перечисляющих, структурных и совмещающих типов являются спецификаторы типа для каждого из них. Имена для типов указателя, массива и функции задаются следующей синтаксической формой type specifier abstract declarator Язык программирования Си 55 Абстрактный декларатор abstract declarator это декларатор без идентификатора, состоящий из одного или более модификаторов указателей, массивов и функций.

Модификатор указателя всегда появляется перед идентификатором в деклараторе, в то время как модификатор массива или функции появляются после идентификатора. Таким образом, чтобы правильно интерпретировать абстрактный декларатор, нужно начинать интерпретацию с подразумеваемого идентификатора.

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

Спецификаторы типа, установленные посредством объявлений typedef, также рассматриваются как имена типов.

– Конец работы –

Эта тема принадлежит разделу:

Языки программирования C и C++

Указанные преимущества Си обеспечивают хорошее качество разработки почти любого вида программного продукта. Использование Си в качестве инструментального языка позволяет получать быстрые… Во многих случаях программы, написанные на Си, сравнимы по скорости с программами, написанными на языке ассемблера.

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Выполнение программ

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Эта работа не имеет других тем.

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги