|
Программирование >> Перегруженные имена функций и идентификаторы
Абстрактный декларатор <abstract-declarator> - это декларатор без идентификатора, состоящий из одного или более модификаторов указателей, массивов и функций. Модификатор указателя * всегда появляется перед идентификатором в деклараторе, в то время как модификатор массива [] или функции () появляются после идентификатора. Таким образом, чтобы правильно интерпретировать абстрактный декларатор, нужно начинать интерпретацию с подразумеваемого идентификатора. Абстрактные деклараторы могут быть составными. Скобки в составном абстрактном деклараторе специфицируют порядок интерпретации, подобно тому как это делается при интерпретации составных деклараторов объявлений. Абстрактный декларатор, состоящий из пустых круглых скобок () не допускается, поскольку это двусмысленно. В этом случае невозможно определить находится ли подразумеваемый идентификатор внутри скобок, и в таком случае - это немодифицированный тип, или перед скобками, тогда - это тип функции. Спецификаторы типа, установленные посредством объявлений typedef, также рассматриваются как имена типов. Выражения и присваивания В Си присваиваются значения выражений. Помимо простого присваивания посредством операции =, Си поддерживает составные операции присваивания, которые перед присваиванием выполняют дополнительные операции над своими операндами. Окончательное значение результата зависит от старшинства операций и от побочных эффектов, если они возникают. Порядок вычисления устанавливается определенным группированием операндов и операций в выражении. Побочный эффект - это изменения состояния машины, вызванные в процессе вычисления выражения. В выражении с побочным эффектом, вычисление одного операнда может зависеть от значения другого. Для одних и тех же операций от порядка, в котором вычисляются операнды, также зависит результат выражения. Величина, представляемая каждым операндом в выражении, имеет тип, который может быть преобразован к другим типам в определенном контексте. Преобразования типов имеют место в присваиваниях, cast операциях, вызовах функций и при выполнении операций. Операнды Операнд в Си - это константа, идентификатор, строка, вызов функции, индексное выражение, выражение выбора структурного элемента или более сложное выражение, сформированное комбинацией операндов и операций или заключением операндов в скобки. Любой операнд, который имеет константное значение, называется константным выражением. Каждый операнд имеет тип. Операнд может быть преобразован из оригинального типа к другому типу посредством операции преобразования типов. Выражение преобразования типа может быть использовано в качестве операнда выражения. Константы Операнду-константе соответствует значение и тип представляющей его константы. Константа-символ имеет тип int. Целая константа имеет типы: int, long, unsigned int или unsigned long, в зависимости от размера целого и от того как специфицирована его величина. Константы с плавающей точкой всегда имеют тип double. Идентификаторы Идентификаторы именуют переменные и функции. Каждый идентификатор имеет тип, который устанавливается при его объявлении. Значение идентификатора зависит от типа следующим образом: идентификаторы целых и плавающих типов представляют величины соответствующего типа. идентификатор перечисляющего типа представляет значение одной константы из множества значений констант в перечислении. Значение идентификатора равно значению этой константы. Тип значения есть int, что следует из определения перечисления. идентификатор структурного или совмещающего типов представляет величины, специфицированные в структуре или совмещении. идентификатор, объявленный как указатель, представляет указатель на величину специфицированного типа. идентификатор, объявленный как массив, представляет указатель, чье значение является адресом первого элемента массива. Тип адресуемых указателем величин - это тип элементов массива. Например, если series объявлен как массив целгх из 10-ти элементов, то идентификатор series представляет адрес массива, тогда как индексное выражение series[5] сс1лается на шестой элемент массива. Адрес массива не изменяется во время выполнения программы, хотя значения отдельных элементов могут изменяться. Значение указателя, представленное идентификатором массива, не является переменной и поэтому идентификатор массива не может появляться в левой части операции присваивания. идентификатор, объявленный как функция, представляет указатель, чье значение является адресом функции. Тип, адресуемый указателем, - это специфицированный тип функционального возврата. Адрес функции не изменяется во время выполнения программы. Меняется только значение возврата. Таким образом, идентификаторы функции не могут появляться в левой части операции присваивания. Строки Строковый литерал состоит из последовательности символов, заключенных в двойные кавычки. Строковый литерал представляется в памяти как массив элементов типа char. Строковый литерал представляет адрес первого элемента этого массива. Адрес первого элемента строки является константой, так же как и сама строка. Так как строковые литералы - это полноценные указатели, то они могут быть использованы в контексте, допускающем величины типа указателей, подчиняясь при этом тем же самым ограничениям. Строковые литералы имеют все же одно дополнительное ограничение: они не изменяемы и не могут появиться в левой части операции присваивания.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |