- •Введение
- •Язык программирования Си Элементы языка программирования.
- •Множества символов
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Структура программы
- •Исходная программа
- •Исходные файлы
- •Выполнение программ
- •Время жизни и видимость
- •Классы имен
- •Объявления
- •Спецификаторы типов
- •Область значений величин
- •Деклараторы
- •Деклараторы массивов, функций и указателей
- •Составные деклараторы
- •Объявления переменной
- •Объявление простой переменной
- •Объявление перечисления
- •Объявления структур
- •Объявление совмещений
- •Объявление массива
- •Объявление указателей
- •Объявление функций
- •Объявление классов
- •Классы памяти
- •Объявления переменной на внешнем уровне
- •Объявление переменной на внутреннем уровне
- •Объявление функции на внешнем и внутреннем уровнях
- •Инициализация
- •Базовые типы и типы указателей
- •Составные типы
- •Строковые инициализаторы
- •Объявления типов
- •Типы структур, совмещений и перечислений
- •Объявления 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
- •Управление нумерацией строк
Оператор do
Синтаксис:
do
<statement>
while (<expression>);
Выполнение:
Тело оператора do выполняется один или несколько раз до тех пор, пока выражение <expression> станет ложным (равным нулю). Вначале выполняется оператор <statement> тела, затем вычисляется выражение <expression>. Если выражение ложно, то оператор do завершается и управление передается следующему оператору в программе. Если выражение истинно (не равно нулю), то тело оператора выполняется снова и снова проверяется выражение. Выполнение тела оператора продолжается до тех пор, пока выражение не станет ложным. Оператор do может также завершить выполнение при выполнении операторов break, goto или return внутри тела оператора do.
Пример:
do
{
y=f(x);
x--;
} while (x>0);
Вначале выполняются два оператора y=f(x); и x--; не обращая внимание на начальное значение x. Затем вычисляется выражение x>0. Если x>0, то тело оператора выполняется снова, и снова перевычисляется выражение x>0. Тело оператора выполняется до тех пор, пока x не станет меньше или равным нулю.
Оператор-выражение
Синтаксис:
expression;
Выполнение:
Выражение <expression> вычисляется в соответствии с правилами, изложенными в разделе 5 "Выражения и присваивания".
Примеры
x=(y+3); / *example 1* /
x++;/ *example 2* /
f(x); / *example 3* /
В Си присваивания являются выражениями. Значением выражения является значение, которое присваивается (так называемое "право-сторонее значение").В первом примере x присваивается значение y+3.
Во втором примере x инкрементируется.
В третьем примере показано выражение функционального вызова. Значением выражения является значение, возвращаемое функцией.
Если функция возвращает значение, то обычно оператор-выражение содержит операцию присваивания, чтобы запомнить значение возврата вызванной функции. Еси возвращаемая величина не используется, как в данном примере, вызов функции выполняется, но возвращаемая величина (если она есть) не используется.
Оператор for
Синтаксис:
for ([<init-expression>];[<cond-expression>];[<loop-exp>])
statement
Тело оператора for выполняется нуль и более раз, до тех пор, пока условное выражение <cond-expression> не станет ложным. Выражения инициализации <init-expression> и цикла <loop-expression> могут быть использованы для инициализации и модификации величин во время выполнения оператора for.
Первым шагом при выполнении оператора for является вычисление выражения инициализации, если оно имеется. Затем вычисление условного выражения с тремя возможными результатами:
Если условное выражение истинно (не равно нулю), то выполняется тело оператора. Затем вычисляется выражение цикла (если оно есть). Процесс повторяется снова с вычислением условного выражения.
Если условное выражение опущено, то его значение принимается за истину и процесс выполнения продолжается, как показано выше. В этом случае оператор for может завершиться только при выполнении в теле оператора операторов break, goto, return.
Если условное выражение ложно, то выполнение оператора for заканчивается и управление передается следующему оператору в программе.
Оператор for может завершиться при выполнении операторов break, return, goto в теле оператора.
Пример
for (i=space=tab=0; i<MAX; i++)
{
if (line [i] == '\x20')
space++;
if (line [i] == '\t')
{
tab++;
line [i] = '\x20';
}
}
В приведенном примере подсчитываются символы пробелов ('\x20') и табуляций ('\t') в массиве символов, поименованном line, и замена каждого символа табуляции на пробел.
Сначала i, space и tab инициализируются нулем. Затем i сравнивается с константой MAX. Если i меньше MAX, то выполняется тело оператора. В зависимости от значения line [i], выполняются операторы if.
Затем переменная i инкрементируется и снова сравнивается с константой MAX. Тело оператора выполняется до тех пор, пока значение i не станет больше или равно MAX.