- •Введение
- •Язык программирования Си Элементы языка программирования.
- •Множества символов
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Структура программы
- •Исходная программа
- •Исходные файлы
- •Выполнение программ
- •Время жизни и видимость
- •Классы имен
- •Объявления
- •Спецификаторы типов
- •Область значений величин
- •Деклараторы
- •Деклараторы массивов, функций и указателей
- •Составные деклараторы
- •Объявления переменной
- •Объявление простой переменной
- •Объявление перечисления
- •Объявления структур
- •Объявление совмещений
- •Объявление массива
- •Объявление указателей
- •Объявление функций
- •Объявление классов
- •Классы памяти
- •Объявления переменной на внешнем уровне
- •Объявление переменной на внутреннем уровне
- •Объявление функции на внешнем и внутреннем уровнях
- •Инициализация
- •Базовые типы и типы указателей
- •Составные типы
- •Строковые инициализаторы
- •Объявления типов
- •Типы структур, совмещений и перечислений
- •Объявления typedef
- •Имена типов
- •Выражения и присваивания
- •Введение
- •Операнды
- •Константы
- •Идентификаторы
- •Вызовы функций
- •Индексные выражения
- •Выражение выбора структурного элемента
- •Выражения с операциями
- •Выражения в скобках
- •Type-cast выражения
- •Константные выражения
- •Операции
- •Обычные арифметические преобразования.
- •Операции дополнения
- •Операция адресации и разадресации
- •Операция sizeof
- •Мультипликативные операции
- •Аддитивные операции
- •Операции сдвига
- •Операции отношений
- •Побитовые операции
- •Логические операции
- •Операция последовательного вычисления
- •Условная операция
- •Операции присваивания
- •Lvalue-выражения
- •Унарные инкремент и декремент
- •Простое присваивание
- •Составное присваивание
- •Старшинство и порядок выполнения
- •Побочные эффекты
- •Преобразования типов
- •Преобразование типов при присваивании
- •Преобразования type-cast
- •Преобразования, выполняемые операциями
- •Преобразования при вызовах функций
- •Операторы
- •Введение
- •Оператор break
- •Составной оператор
- •Оператор continue
- •Оператор do
- •Оператор-выражение
- •Оператор for
- •Goto и помеченные операторы
- •Оператор if
- •Оператор null
- •Оператор return
- •Оператор switch
- •Оператор while
- •Функции
- •Введение
- •Определение функции
- •Класс памяти
- •Тип возврата
- •Формальные параметры
- •Тело функции
- •Объявления функции
- •Вызовы функций
- •Фактические аргументы
- •Вызовы с переменным числом аргументов
- •Рекурсивные вызовы
- •Директивы препроцессора и указания компилятору
- •Поименованные константы и макросы
- •Директива # define
- •Директива #undef
- •#Include файлы
- •Условная компиляция
- •Директивы #if, #elif, #else, #endif
- •Директивы #ifdef и #ifndef
- •Управление нумерацией строк
Type-cast выражения
Type-cast выражения имеют следующий синтаксис:
(<type-name>)<operand>
Type-cast преобразования рассматриваются в разделе 5.7.2., имена типов представлены в разделе 4.9.
Константные выражения
Константное выражение- это выражение, результатом вычисления которого является константа. Операндами константного выражения могут быть целые константы, константы символы, плавающие константы, константы перечиисления, type-cast выражения целого и плавающего типов и другие константные выражения. Операнды могут комбинироваться и модифицироваться посредством операций точно так же как это описано в разделе 5.2.7. Константные выражения не могут использовать операции присваивания (смотри раздел 5.4) или бинарную операцию последовательного вычисления. Унарная операция адресации "&" может быть использована только при некоторых инициализациях (смотри последний абзац раздела 5.2.10).
Константные выражения, используемые в директивах препроцессора, имеют дополнительные ограничения, поэтому называются ограниченными константными выражениями <restricted-constant-expression>. Ограниченые константные выражения не могут содержать sizeof-выражений, констант перечисления или type-cast выражений любого типа. Они могут, однако, содержать специальные константные, имеющие синтаксис defined(<identifier>).
Более полная информация дана в разделе 8.1.1. "Директива #define".
Эти дополнительные ограничения также относятся к константным выражениям, используемым для инициализации переменных на внешнем уровне. Тем не менее, такие выражения допускают применение унарной операции адресации "&" к любой переменной внешнего уровня с основными и структурными типами, а также с типом совмещения и массивом внешнего уровня, индексированным константным выражением.
В этих выражениях допускается сложение или вычитание с адресными подвыражениями.
Операции
Си-операции требуют один операнд (унарные операции), два операнда (бинарные операции) или три операнда (тернарная операция). Операции присваивания- это унарные или бинарные операции. Операции присваивания описываются в разделе 5.4.
Унарными операциями Си являются следующие:
Символ |
Наименование |
- ~ ! |
операции дополнения |
* & |
операции разадресации и адресации |
sizeof |
size- операция |
Интерпретация унарных операций производится справа налево.
Бинарные операции интерпретируются слева направо.
Бинарными операциями являются следующие:
Символ |
Наименование |
* / % |
мультипликативные операции |
+ - |
аддитивные операции |
<< >> |
операции сдвига |
< > <= >= == != |
операции отношений |
& | ^ |
операции с битами |
&& || |
логические операции |
, |
операция последовательных вычислений |
В Си имеется одна тернарная операция- это операция условия "?:". Она интерпретируется справа налево.
Обычные арифметические преобразования.
Большинство операций Си выполняют преобразование типов, чтобы привести операнды выражений к общему типу, или чтобы расширить короткие величины до размера целых величин, используемых в машинных операциях. Преобразования, выполняемые операциями Си, зависят от специфики операций и от типа операнда или операндов. Тем не менее, многие операции выполняют похожие преобразования целых и плавающих типов. Эти преобразования известны как арифметические преобразования, поскольку они применяются к типам величин, обычно используемых в арифметике.
Арифметические преобразования, приведенные ниже, называются "обычные арифметические преобразования". Специфические особенности каждого типа преобразования рассмотрены в разделе 5.7.
Обычные арифметические преобразования осуществляются следующим образом:
Операнды типа float преобразуются к типу double.
Если один операнд типа double, то второй операнд преобразуется к типу double.
Любые операнды типов char или short преобразуются к int.
Любые операнды типов unsigned char или unsigned short преобразуются к типу unsigned int.
Если один операнд типа unsigned long, то второй операнд преобразуется к типу unsigned long.
Если один операнд типа long, то второй операнд преобразуется к типу long.
Если один операнд типа unsigned int, то второй операнд преобразуется к unsigned int.