Сигналы и прерывания
|
|
* 16. СВОДКА СИНТАКСИЧЕСКИХ ПРАВИЛ
|
|
Выражения
Основными выражениями являются следующие: выражение: первичное_выражение * выражение & выражение - выражение! выражение ~ выражение ++ l_значение -- l_значение l_значение ++ l_значение -- sizeof выражение (имя типа) выражение выражение бинарная_операция выражение выражение? выражение: выражение l_значение операция_присваивания выражение выражение, выражение -76- первичное_выражение: идентификатор константа строка ^ (выражение) первичное_выражение (список выражений) необ первичное_выражение [выражение] l_значение. Идентификатор первичное выражение - > идентификатор l_значение: идентификатор первичное_выражение [выражение] l_значение. Идентификатор первичное_выражение - > идентификатор * выражение (l_значение) Операции первичных выражений () []. -> имеют самый высокий приоритет и группируются слева направо.Унарные операции * & -! ~ ++ -- sizeof (имя типа) имеют более низкий приоритет, чем операции первичных выраже-ний, но более высокий, чем приоритет любой бинарной опера-ции. Эти операции группируются справа налево. Условная опе-рация группируется справа налево, все бинарные операциигруппируются слева направо и их приоритет убывает в следую-щем порядке: бинарная операция: * / % + - >> << < > <= > = ==!= & ~ | && ||?: Все операции присваивания имеют одинаковый приоритет и груп-пируются справа налево: = += -= *=?= %= >> = <<= &= ~= |= Операция запятая имеет самый низкий приоритет и группируется -77- слева направо.Описания
|
|
Операторы
|
|
Внешние определения
программа: внешнее_определение внешнее_определение программа внешнее_определение: определение_функции определение_данных определение_функции: спецификатор_типа описатель_функ- необ ции тело_функции описатель_функции: описатель (список_параметров) необ список_параметров: идетификатор идентификатор, список_параметров тело_функции: список_описаний_типа оператор_функции оператор_функции: { список описаний список_операторов } необ -81- определение данных: extern спецификатор_типа спи- необ необ сок инициализируемых описателей; необ static спецификатор типа список необ необ инициализируемых описателей; необПрепроцессор
#define идентификатор строка_лексем #define идентификатор(идентифика- тор,...,идентификатор) строка_лексем #undef идентификатор #include "имя_файла" #include <имя _ файла > #if константное_выражение #ifdef идентификатор #ifndef идентификатор #else #endif #line константа "имя_файла" необ* 17. Примеры программ на Си
Пример 1: функции fgets и fputs (см. раздел "Стандарт-ная библиотека ввода/вывода. Ввод/вывод строк"). -82- #include < stdio.h > char *fgets (s, n, iop) /*взять <=n символов*/ char *s; /* из iop */ int n; register FILE *iop; { register int c; register char *cs; cs = s; while (-- n >0&&(c = getc (iop))!= EOF) if ((*cs ++ = c)==' \n ') break; *cs = ' \0 '; return ((c == EOF && cs == s)? NULL: s); } fputs (s, iop) /*поместить строку s в */ register char *s; /* файл iop */ register FILE *iop; { register int c; while (c = *s ++) putc (c, iop); } Пример 2. Программа для разделения одного большого файла нанесколько частей так, чтобы каждая часть начиналась состроки. sh 1... -83- #include < stdio.h > #define NEWH ". sh 1 " /*Признак разделения*/ /* Трансляция: cc -o ds ds. c Запуск: ds откуда кудапреф кудасуфф результат: ds a pref suff переписывает файл a в файлы pref00. suff, pref01. suff,... */ main (ac, av) char **av; { int nfile =0; /* Порядковый номер файла*/ char str [512]; /* Буфер для строки*/ if (ac!= 4) { fprintf (stderr, "Неверное число аргументов0); exit (1); } /* freopen аналогично fopen, но изменяет указанный описатель файла, а не создает новый. Здесь мы переопределяем stdin */ if (! freopen (av [1]," r ", stdin)) { fprintf (stderr, "Не могу открыть: %s 0, av [1]); exit (2); } /* Переопределили файл станд. вывода */ of (av [2], nfile, av [3]); while (gets (str)) { /* strncmp (s1, s2, l) сравнивает две строки и возвращает 0, если первые l символов совпадают */ if (strncmp (str, NEWH, strlen (NEWH))== 0) { fclose (fp); nfile ++; /* Это просто информационное сообщение */ fprintf (stderr, "Начало части %d 0, nfile); fp = of (av [2], nfile, av [3]); } puts (str); if (ferror (stdout)) { -84- fprintf (stderr, "Ош записи в файл номер %.2d 0, nfile); exit (4); } } exit (0); } /* Эта функция создает имя файла из трех частей и открывает его как стандартный вывод */ of (s1, n, s2) char *s1, *s2; { register FILE *f; char buf [100]; /* sprintf возвращает свой первый аргумент */ if ((f = freopen (sprintf (buf," %s%02d.%s ", s1, n, s2)," w ", stdout))== NULL) { fprintf (stderr, "Не могу открыть файл: %s 0, buf); exit (4); } return; } -85- СОДЕРЖАНИЕ ''АННОТАЦИЯ''................... 2 1. ВВЕДЕНИЕ.......................................... 1 2. СИНТАКСИЧЕСКАЯ НОТАЦИЯ............................ 32.1. Ключевые слова.................................. 32.2. Константы....................................... 42.2.1. Целые константы............................... 42.2.2. Длинные (long) константы...................... 42.2.3. Символьные константы.......................... 42.2.4. Вещественные константы........................ 52.3. Строки.......................................... 52.4. Характеристики аппаратных средств............... 6 3. ОБ'ЕКТЫ ЯЗЫКА СИ.................................. 63.1. Интерпретация идентификаторов................... 63.2. Объекты и l_значения............................ 83.3. Преобразования.................................. 83.3.1. Символы и целые............................... 83.3.2. Типы float и double........................... 93.3.3. Вещественные и целочисленные величины......... 93.3.4. Указатели и целые............................. 93.3.5. Целое без знака............................... 93.3.6. Арифметические преобразования................. 10 4. ВЫРАЖЕНИЯ......................................... 104.1. Первичные выражения............................. 114.2. Унарные операции................................ 134.3. Мультипликативные операции...................... 144.4. Аддитивные операции............................. 154.5. Операции сдвига................................. 164.6. Операции отношения.............................. 164.7. Операции равенства.............................. 174.8. Побитовая операция ' и '.......................... 174.9. Побитовая операция исключающего ' или '........... 174.10. Побитовая операция включающего ' или '............ 174.11. Логическая операция ' и '......................... 184.12. Операция логического ' или'...................... 18 4.13. Условная операция............................... 184.14. Операция присваивания........................... 194.15. Присваивание структуры.......................... 204.16. Операция ' запятая '.............................. 204.17. Старшинство и порядок вычисления................ 20 5. ОПИСАНИЯ.......................................... 225.1. Спецификаторы класса памяти..................... 225.2. Спецификаторы типа.............................. 235.3. Описатели....................................... 245.4. Смысл описателей................................ 24 -86- 5.5. Описание структур и объединений................. 265.6. Перечислимый тип................................ 295.7. Инициализация................................... 305.8. Имена типов..................................... 325.9. Описатель typedef............................... 33 6. ОПЕРАТОРЫ......................................... 346.1. Операторное выражение........................... 346.2. Составной оператор (или блок)................... 346.3. Условные операторы.............................. 356.4. Оператор while.................................. 356.5. Оператор do..................................... 356.6. Оператор for.................................... 356.7. Оператор switch................................. 366.8. Оператор break.................................. 376.9. Оператор continue............................... 376.10. Оператор возврата............................... 386.11. Оператор goto................................... 386.12. Помеченный оператор............................. 386.13. Пустой оператор................................. 38 7. ВНЕШНИЕ ОПРЕДЕЛЕНИЯ............................... 397.1. Внешнее определение функции..................... 397.2. Внешние определения данных...................... 40 8. ОБЛАСТЬ ДЕЙСТВИЯ ИДЕНТИФИКАТОРОВ.................. 408.1. Лексическая область действия.................... 418.2. Область действия внешних идентификаторов........ 428.3. Неявные описания................................ 42 9. ПРЕПРОЦЕССОР ЯЗЫКА 'СИ'........................... 439.1. Замена лексем................................... 439.2. Включение файлов................................ 449.3. Условная компиляция............................. 459.4. Команда #line................................... 45 10. ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ О ТИПАХ................. 4610.1. Структуры и объединения......................... 4610.2. Функции......................................... 4710.3. Массивы, указатели и индексация................. 4710.4. Явные преобразования указателей................. 48 11. КОНСТАНТНЫЕ ВЫРАЖЕНИЯ............................. 49 12. СООБРАЖЕНИЯ О ПЕРЕНОСИМОСТИ....................... 4912.1. Анахронизмы..................................... 51 13. СТАНДАРТНАЯ БИБЛИОТЕКА ВВОДА И ВЫВОДА............. 5113.1. Обращение к стандартной библиотеке.............. 5213.2. Стандартный ввод и вывод........................ 5213.3. Форматный вывод - функция printf................ 5313.4. Форматный ввод - функция scanf.................. 5513.5. Форматное преобразование в памяти............... 58 -87- 13.6. Доступ к файлам................................. 5913.7. Обработка ошибок - stderr и exit.............. 6113.8. Ввод и вывод строк.............................. 6213.9. Функция ungetc.................................. 6213.10.Разные стандартные функции...................... 6213.10.1.Управление памятью............................ 6213.10.2.Стандартные функции языка Си.................. 63 14. ВЗАИМОДЕЙСТВИЕ С ОПЕРАЦИОННОЙ СИСТЕМОЙ............ 6314.1. Подготовка программ на Си в ОС ДЕМОС............ 6414.2. Доступ к аргументам команды..................... 64 15. ИНТЕРФЕЙС СИСТЕМЫ ДЕМОС........................... 6615.1. Ввод/вывод...................................... 6615.1.1. Дескрипторы файлов............................ 6615.1.2. Низкоуровневый ввод/вывод..................... 6715.1.3. Открытие, создание, закрытие и удаление....... 6815.1.4. Произвольный доступ - lseek................... 6915.2. Управление процессами........................... 7015.2.1. Функция system................................ 7115.2.2. Вызов программы на низком уровне - execl...... 7115.2.3. Порождение нового процесса - fork............. 7115.2.4. Канал межпроцессной связи..................... 7315.3. Сигналы и прерывания............................ 74 16. Сводка синтаксических правил...................... 7616.1. Выражения....................................... 7616.2. Описания........................................ 7816.3. Операторы....................................... 8016.4. Внешние определения............................. 8116.5. Препроцессор.................................... 82 17. Примеры программ на Си............................ 82 -88-