- •Введение
- •Язык программирования Си Элементы языка программирования.
- •Множества символов
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Структура программы
- •Исходная программа
- •Исходные файлы
- •Выполнение программ
- •Время жизни и видимость
- •Классы имен
- •Объявления
- •Спецификаторы типов
- •Область значений величин
- •Деклараторы
- •Деклараторы массивов, функций и указателей
- •Составные деклараторы
- •Объявления переменной
- •Объявление простой переменной
- •Объявление перечисления
- •Объявления структур
- •Объявление совмещений
- •Объявление массива
- •Объявление указателей
- •Объявление функций
- •Объявление классов
- •Классы памяти
- •Объявления переменной на внешнем уровне
- •Объявление переменной на внутреннем уровне
- •Объявление функции на внешнем и внутреннем уровнях
- •Инициализация
- •Базовые типы и типы указателей
- •Составные типы
- •Строковые инициализаторы
- •Объявления типов
- •Типы структур, совмещений и перечислений
- •Объявления 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>(<expression-list>)
Вызов функции состоит из выражения <expression>, за которым следует список выражений <expression-list>. Значению выражения соответствует адрес функции (например, значение идентификатора функции). Значение каждого выражения из списка выражений (выражения в списке разделены запятыми) соответствует фактическому аргументу фнкции. Список выражений может быть пустым.
Выражение вызова функции имеет значение и тип своего возврата. Если тип возврата функции- void, то и выражение вызова функции имеет тип void. Если возврат из вызванной функции произошел не в результате выполнения оператора return, то значение функции не определено. В разделе 7.4. дана более полная информация о вызовах функций.
Индексные выражения
Синтаксис:
<expression1>[<expression2>]
Здесь квадратные скобки - это терминальные символы. Индексное выражение представляет величину, адрес которой состоит из суммы значений выражения1 "<expression1>" и выражения2 "<expression2>". Выражение1- это любой указатель, такой как идентификатор массива, а выражение2- это целочисленная величина. Выражение2 должно быть заключено в квадратные скобки "[]".
Индексное выражение обычно используется для ссылок на элементы массива, тем не менее, индекс может появиться с любым указателем.
Индексное выражение вычисляется путем сложения целой величины <expression2> с значением указателя <expression1> c последующим применением к результату операции разадресации "*". Операция разадресации описана в разделе 5.3.3. Нарпимер, для одномерного массива следующие четыре выражения эквивалентны в предположении, что a- это указатель, а b- это целое.
a[b]
*(a + b)
*(b + a)
b[a]
В соответствии с правилами преобразования типов для операции сложения (см. раздел 5.3.6), целочисленная величина преобразуется к адресному представлению путем умножения ее на размер типа, адресуемого указателем. Например, предположим, что иденти фикатор line ссылается на массив величин типа int. Чтобы вычислить выражение line[i], целая величина i умножается на размер типа int. Преобразованное значение i представляет i позиций типа int. Это преобразованное значение складывается с начальным значением указателя line, что дает адрес, который расположен на i позиций типа int от line.
Последним шагом вычисления индексного выражения является операция разадресации, применяемая к полученному адресу. Результатом является значение элемента массива, который позиционирован.
Заметим, что индексное выражение line[0] представляет значение первого элемента массива, так как отсчет смещения ведется от нуля. Следовательно, такое выражение, как line[5], ссылается на шестой элемент массива.
Ссылки на многомерный массив.
Индексное выражение может быть снова проиндексировано. Синтаксис такого выражения следующий:
<expression1>[<expression2>][<expression3>]...
Данное индексное выражение интерпретируется слева направо. Сначала вычисляется самое левое индексное выражение <expression1>[<expression2>]. Адрес результата сложения <expressin1> и <expression2> имеет смысл адресного выражения, с которым складывается <expression3> и т. д. Операция разадресации осуществляется после вычисления последнего индексного выражения. Однако, операции разадресации не производится, если значение последнего указателя адресует величину типа массив (смотри третий и четвертый примеры ниже).
Выражения с несколькими индексами ссылаются на элементы многомерных массивов. Многомерный массив- это массив, элементами которого являются массивы. Например, первым элементом трехмерного массива является массив с двумя измерениями.
Примеры:
int prop[3][4][6];
int i, *ip, (*ipp)[6];
i = prop[0][0][1]; /* Example 1 */
i = prop[2][1][3]; /* Example 2 */
ip = prop[2][1]; /* Example 3 */
ipp = prop[2]; /* Example 4 */
Maccив, поименованный prop, содержит 3 элемента, каждый из которых- это массив 4 на 6 величин типа int. В примере 1 показано, каким образом сделать ссылку на второй элемент третьего массива 4 на 6 prop. Массив заполнен построчно, так что последний индекс меняется наиболее быстро. Выражение prop[0][0][2] ссылается на следующий (третий) элемент массива и т. д.
Во втором примере показана более сложная ссылка на отдельный элемент prop. Выражение вычисляется следующим образом:
Первый индекс 2 умножается на размер типа int и на размер массива 4 на 6 и складывается с значением указателя prop. Результат будет указывать на третий массив размера 4 на 6 элементов в трехмерном массиве prop.
Затем, второй индекс 1 умножается на размер 6-ти элементов типа int и складывается с адресом, соответствующим prop[2].
Каждый элемент массива из шести элементов- это величина типа int, поэтому индекс 3 умножается на размер типа int перед сложением с адресом prop[2][1]. результирующий указатель адресует четвертый элемент массива из шести элементов.
На последнем шаге вычисления выражения prop[2][1][3] выполняется разадресация указателя. Результатом является элемент типа int, расположенный по этому адресу.
В примерах 3 и 4 представлены случаи, когда разадресация не применяется. В примере 3 выражение prop[2][1]- это ссылка на массив из шести элементов в трехмерном массиве prop. Так как значение указателя адресует массив, то операция разадресации не применяется. Аналогично, результатом выражения prop[2] в примере 4 является значение указателя, адресующее двумерный массив.