- •Введение
- •Язык программирования Си Элементы языка программирования.
- •Множества символов
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Структура программы
- •Исходная программа
- •Исходные файлы
- •Выполнение программ
- •Время жизни и видимость
- •Классы имен
- •Объявления
- •Спецификаторы типов
- •Область значений величин
- •Деклараторы
- •Деклараторы массивов, функций и указателей
- •Составные деклараторы
- •Объявления переменной
- •Объявление простой переменной
- •Объявление перечисления
- •Объявления структур
- •Объявление совмещений
- •Объявление массива
- •Объявление указателей
- •Объявление функций
- •Объявление классов
- •Классы памяти
- •Объявления переменной на внешнем уровне
- •Объявление переменной на внутреннем уровне
- •Объявление функции на внешнем и внутреннем уровнях
- •Инициализация
- •Базовые типы и типы указателей
- •Составные типы
- •Строковые инициализаторы
- •Объявления типов
- •Типы структур, совмещений и перечислений
- •Объявления 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
- •Управление нумерацией строк
Выражение выбора структурного элемента
Синтаксис:
<expression>.<identifier>
<expression> -> <identifier>
Выражение выбора структурного элемента ссылается на элементы структур, совмещений или классов. Выражение выбора имеет значение и тип выбранного элемента.
В первой синтаксической форме <expression>.<identifier> выражение <expression> представляет величину типа struct или union, а идентификатор именует элемент, специфицированной структуры или совмещения. Во второй синтаксической форме <expression> -> <identifier> выражение <expression> представляет указатель на структуру или совмещение, а идентификатор именует элемент специфицированной структуры.
Обе синтаксические формы выражений выбора элемента дают одинаковый результат. Действительно, запись, включающая операцию адресного выбора ->, является сокращенной версией записи с точкой, для случая, когда выражению, стоящему перед точкой, предшествует операция разадресации "*". Операция разадресации рассматривается в разделе 5.3.3.
Поэтому запись <expression> -> <identifier> эквивалентна записи (* <expression>). <identifier>, когда значение <expression> является адресной величиной.
Примеры:
struct pair {
int a;
int b;
struct pair *sp;
} item, list[10];
item.sp = &item /* Example 1 */
(item.sp) -> a = 24 /* Example 2 */
list[8].b = 12 /* Example 3 */
В первом примере адрес структуры item присваивается элементу sp этой структуры. Это имеет смысл того, что item содержит указатель на саму себя.
Во втором примере используется адресное выражение item.sp с операцией выбора -> , чтобы присвоить значение элементу a.
В третьем примере показано, каким образом из массива структур выбрать отдельный элемент структуры.
Выражения с операциями
Выражения с операциями могут быть унарными, бинарными или тернарными. Унарное выражение состоит из операнда с предшествующей унарной операцией- <unop> или операнда, заключенного в круглые скобки, с предшествующим ему ключевым словом sizeof.
Синтаксис:
<unop><operand>
sizeof<operand>
Бинарное выражение состоит из двух операндов, разделенных бинарной операцией- <binop>.
Синтаксис:
<operand><binop><operand>
Тернарное выражение состоит из трех операндов, разделенных тернарной операцией "?:"
Синтаксис:
<operand> ? <operand> : <operand>
Выражения присваивания используют унарные, бинарные и соcтавные операции присваивания. Унарными операциями присваивания являются инкремент "++" и декремент "--". Бинарная операция присваивания всего одна "=". Составные операции присваивания будем обозначать как <compound-assign-ops>. Каждая составная операция присваивания- это комбинация бинарной операции с простой операцией присваивания.
Синтаксис выражений присваивания:
<operand> ++
<operand> --
++<operand>
--<operand>
<operand> = <operand>
<operand> <compound-assignment-ops> <operand>
Выражения в скобках
Любой операнд может быть заключен в скобки. Они не влияют на тип и значение выражения, заключенного в скобки. Например, в выражении
(10 + 5) / 5
скобки, заключающие запись 10 + 5, означают, что величина 10 + 5 является левым операндом операции деления. Результат выражения (10 + 5) / 5 равен 3. Без скобок значение записи 10 + 5 / 5 равнялось бы 11. Хотя скобки влияют на то, каким путем группируются операнды в выражении, они не гарантируют детальный порядок вычисления выражения.