| Основные типы данных | 3В Computer Код ASCII | DLC PDP-11 Код ASCII | DEC VAX Код ASCII |
| char int short long float double Диапазон float Диапазон double Порядок байт в слове | 832 16 32 32 64 ilO*38 ± Ю^" ГоПЛ | 8 16 1632 32 64 +10*38 ± Ю*" [ТоЩ1 | 8 32 16 32 32 64 ± 10*" tlO*" f32To1 |
' Аналогичные данные для советских ЭВМ, на которых работает компилятор языка Си, представлены в таблице на с. 17. - Прим. перев. 14 Основные типы данных 3.4. Символьные константы Символьная константа состоит из одного символа кода ASCII', заключенного в апострофы (см. с. 89) . Примеры 'А' 'а' 'Т '$' Специальные (управляющие) символьные константы Новая строка (перевод строки) HL (LF) '\п' Горизонтальная табуляция НТ '\t' Вертикальная табуляция VT '\v' Возврат на шаг BS '\Ь' Возврат каретки CR '\г' Перевод формата FF '\f Обратная косая \ '\\' Апостроф ' '\" Кавычки " V' ' Нулевой символ (пусто) NUL '\0.' Кроме этого любой символ может быть представлен последовательностью трех восьмеричных цифр: '\ddd'. Замечание. Символьные константы считаются данными типа int. 3.5. Строковые константы Строковая константа представляется последовательностью символов кода ASCII, заключенной в кавычки: "... ". Примеры "This is a character string" "Это строковая константа" "А" "1234567890" "О" "$" Строковая константа - это массив символов, заключенный в кавычки; она имеет тип char [ ]. В конце каждой строки компилятор помещает нулевой символ '\0', отмечающий конец данной строки. ' Американский стандартный код для обмена информацией. — Прим. перев. Основные типы данных 15 Каждая строковая константа, даже если она идентична другой строковой константе, сохраняется в отдельном месте памяти. Если необходимо ввести в строку символ кавычек ("), то перед ним надо поставить символ обратной косой (\). В строку могут быть введены любые специальные символьные константы, перед которыми стоит символ \. Символ \ и следующий за ним символ новой строки игнорируются. 3.6. Перечислимые константы Имена, указанные в описании перечисяимых констант, трактуются как целые константы (см. с. 46) . 3.7. Размер данных Следующая таблица дает размер в битах основных типов данных для различных ЭВМ'. Адрес слова определяется по байту с нулевым номером.
| Основные типы данных | 3В Computel Код ASCII | DLC PDP-11 Код ASCII | DEC VAX Код ASCII |
| char int short long float double Диапазон float Диапазон double Порядок байт в слове | 8 32 16 32 32 64 ilO*38 ± Ю^" [ОПТ | 8 16 1632 32 64 +10*38 ± Ю*" ] [ТоЩ1 | 8 32 16 32 32 64 ± 10*" tlO*" f32To1 |
' Аналогичные данные для советских ЭВМ, на которых работает компилятор языка Си, представлены в таблице на с. 17. - Прим. перев.
| Основные типы данных | HONEYWELL 6000 Коя ASCII | IBM 360/370 Код EBCDIC | ———————————INTER-DATA 8/32 Код ASCII |
| char mt short long float double Диапазон float Диапазон doubleПорядок байт в слове | 9 36 36 36 36 72 t 101"iio138 [01231 | 832 16 32 32 64 ± lO*76 i Ю*76 [ОТ231 | 832 16 32 32 64 ± 10*" ± Ю*'” |
| Основные типы данных | о о о00 ^о 3 <й 1^ ?^ О S | о — §Сs" —1 <, (j a ^s | §до u 00^ U< о а dS N * | >о00 -< (Ч -< о \-^ 00 ОТ щ Я S5 |
| char mt short long float double Диапазон float Диапазон doubleПорядок байт в слове | 832** 16 32 32 32 +Ю138 ±10138 |0123| | 8 32 16 32 32 64±10"8 +Ю*3”8 |3210| | 8 16** 1632 32 64** llO*" +101308 |0l|23| | 816 16 32** 32 64 iio138 ^0±Э08 |32|10| |
| Основные типы данных | о г< ^г— 00 5 S u 0 rf” S u | § StT) 0 u и м к | о ^§2 |
| char mt short long float double Диапазон float Диапазон doubleПорядок байт в слове | 8 16 1632 32 64 + Ю*” i Ю*38 ГЮ|32| | 8 32 16 32 32 64 t Ю*76 ±101"'fol23| | 8 32 16 32 32 64 i Ю*38 tlO138ГзТЩ |
Код КОИ-8 включает в качестве подмножества код ASCII, код ДКОИ включает в качестве подмножества код EBCDIC 4. ОПЕРАЦИИ И ВЫРАЖЕНИЯ 4.1. Выражения Выражение состоит из одного или большего числа операндов и символов операций. Примеры а++ b = 10 х = (y*z)/w Замечание. Выражение, заканчивающееся точкой с запятой, является оператором (см. с. 32). 18 Операции и выражения 4.2. Метаобозначения операндов Некоторые операции требуют операндов определенного вида. Вид операнда обозначается одной из следующих букв: е - любое выражение;
! Использование: !ае или !ре Истина, если ае или ре ложно. Пример if (!good)
prmtf ("not good"),
II Использование:el i, e2 Логическая операция ИЛИ значений е1 и e2. Вначале проверяется значение е1; значение e2 проверяется только в том случае, 25 если значение el - Ложь. Значением выражения является Истина, если истинно значение е1 или e2. Пример if (х < А || х > В) printf ("out of range"), && Использование: el && e2 Логическая операция И значений е1 и e2. Вначале проверяется значение е1; значение e2 проверяется только в том случае, если значение el — Истина. Значением выражения является Истина, если значения е1 и e2 - Истина. Пример if (р! = NULL && *р > 7) п++; Если р - не нулевой указатель и значение переменной, на которую указывает р, больше, чем 7, то увеличить п на 1. Обратите внимание, что если значение указателя р равно NULL (0), то выражение *р не имеет смысла. 4.7. Побитовые операции ~ Использование: ie Дополнение до единицы значения ie. Значение выражения содержит 1 во всех разрядах, в которых ie содержит 0, и 0 во всех разрядах, в которых ie содержит 1. Пример opposite = mask, ” Использование: iel ” ie2 Двоичное представление iel сдвигается вправо на ie2 разрядов. Сдвиг вправо может быть арифметическим (т. е. освобождающиеся слева разряды заполняются значением знакового разряда) или логическим в зависимости от реализации, однако гарантируется, что сдвиг вправо целых чисел без знака будет логическим и освобождающиеся слева разряды будут заполняться нулями. Пр имер х= х” 3; 26 “ Использование: iel “ ie2 Двоичное представление iel сдвигается влево на ie2 разрядов; освобождающиеся справа разряды заполняются нулями. При мер fourx= x“ 2; & Использование: iel & ie2 Побитовая операция И двоичных представлений iel и ie2. Значение выражения содержит 1 во всех разрядах, в которых и iel и ie2 содержат 1, и 0 во всех остальных разрядах. П ри мер flag = ((х & mask) != 0); I Использование: iel | ie2 Побитовая операция ИЛИ двоичных представлений iel и ie2. Значение выражения содержит 1 во всех разрядах, в которых iel или ie2 содержит 1, и 0 во всех остальных разрядах. Пример attrsum= attrl I attr2:4.11. Другие операции ?: Использование: ае ? е1 : е2 или ре ? е1 : е2 Если истинно ае или ре, то выполняется е1; иначе выполняется е2. Значением этого выражения является значение выражения е1 или е2. Пример abs = (i <= 0) ' -i. i, Использование: el, е2 Сначала выполняется выражение е1, потом выражение е2. Значением всего выражения является значение выражения е2. Пример for (i=A, J=B, i<i, i++, j—) p[i] =pdl sizeof Использование: sizeof(e) Число байт, требуемых для размещения данных типа е. ' 'Если е описывает массив, то в этом случае е обозначает весь массив, а не только адрес первого элемента, как во всех остальных операциях. "^ sizeof Использование: sizeof(-nin) Число байт, требуемых для размещения объектов типа тип. Пример п = sizeof(arnaine) / sizeof(mt), Число элементов в массиве целых чисел, определяемое как число байт в массиве, поделенное на число байт, занимаемых одним элементом массива, (тип) Использование: (тип)е Значение е, преобразованное в тип данных тип. Пример х= (float)n/3, Целое значение переменной п преобразуется в число с плавающей точкой перед делением на 3. ( ) Использование: fe(el, е2,..., eN) Вызов функции fe с аргументами е1, е2,..., eN. Операции и выражения 29 Значением выражения является значение, возвращаемое функцией. Обратите внимание, что порядок выполнения выражений е1,..., eN не гарантируется (см. с 39) При мер х = sqrt(y), 4.12. Приоритеты и порядок выполнения операций Для каждой группы операций в нижеследующей таблице приоритеты одинаковы. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов (слева направо или справа налево), если отсутствуют скобки и операции относятся к одной группе. Пр им ёры Выражение а * b / с эквивалентно выражению (а * b) / с, так как операции выполняются слева направо. Выражение а = b = с эквивалентно выражению а = (b = с), так как операция выполняется справа налево. '
| / Деление (с. 19) % Деление по модулю (с. 19) |
| - Вычитание (с. 19) |
| < < Сдвиг влево (с. 26) Слева направо > > Сдвиг вправо (с. 25) |
| < Меньше, чем (с. 23) Слева направо <= Меньше или равно (с. 24) > Больше, чем (с. 24) >= Больше или равно (с. 24) |
| == Равно (с. 23) Слева направо != Неравно (с. 23) |
| & Побитовая операция И (с. 26) Слева направо |
| Побитовая операция исключающее ИЛИ (с. 26) Слева направо |
| && Логическая операция Ц (с. 25) Слева направо |
| 11 Логическая операция ИЛИ (с. 24) Слева направо |
| = Присваивание (с. 21 -22) Справа налево “= ”= &= *= 1= |
| , Операция запятая (с. 28) Слева направо |
4.13. Порядок обработки операндов Для четырех операций (&& II ?: ,) гарантируется, что левый операнд будет обрабатываться первым. Для остальных операций поря-) док обработки может быть разным на разных компиляторах. 'Это означает, что если программа, отлаженная на некоторой ЭВМ, зависит от негарантированного порядка обработки операндов, то на другой ЭВМ с другим компилятором она может выполняться неправильно. Пример v = (х = 5) + (++х); Если порядок обработки операндов в операции + слева направо, то переменная v получит значение 11 (5 + 6) и значение х будет равно 6. Если порядок справа налево, значение v зависит от значения х, которое эта переменная имела до выполнения выражения; например, если значение х было равно 0, то значение v станет равным б (5 + 1) и значение х станет равным 5. Предупреждение. Если вы присваиваете переменной значение в любом выражении (включая вызов функции), то не используйте эту переменную снова в том же выражении. Например, если в предыдущем примере необходим порядок обработки слева направо, сделайте так: х=5; v = х + (х + 1); ++х; 4.14. Арифметические преобразования в выражениях Прежде всего каждый операнд типа char или short преобразуется в значение типа int и операнды типа unsigned char или unsigned short преобразуются в значение типа unsigned int1. Затем если один из операндов имеет тип double, то другой преобразуется в значение типа double и результат будет иметь тип double. ' Кроме того, операнды типа float до начала операции преобразуются в значение типа double [Дб]. - Прим. перев. Иначе если один из операндов имеет тип unsigned long, то другой преобразуется в значение типа unsigned long и таким же будет тип результата. Иначе если один из операндов имеет тип long, то другой преобразуется в значение типа long и таким же будет тип результата. Иначе если один из операндов имеет тип long, а другой - тип unsigned int, то оба операнда преобразуются в значение типа unsigned long и результат будет иметь тип unsigned long. Иначе если один из операндов имеет тип unsigned, то другой преобразуется в значение типа unsigned и результат будет иметь тип unsigned. Иначе оба операнда должны быть типа int и таким же будет тип результата. 5. ОПЕРАТОРЫ ' 5.1. Формат и вложенность Формат. Один оператор может занимать одну или более строк. Два или большее количество операторов могут быть расположены на одной строке. Вложенность. Операторы, управляющие порядком выполнения (if, if-else, switch, while, do-while и for), могут быть вложены друг в друга. 5.2. Метка оператора Метка может стоять перед любым оператором, чтобы на этот оператор можно было перейти с помощью оператора goto. Метка состоит из идентификатора, за которым стоит двоеточие (:). Областью определения метки является данная функция. Пр им ер АВС2: х=3; 5.3. Составной оператор Составной оператор (блок) состоит из одного или большего числа операторов любого типа, заключенных в фигурные скобки ( { } ) • После закрывающейся фигурной скобки не должно быть точки с запятой (;). Пр и м е р {х=1; у=2; z=3;} 5.4. Оператор-выражение Любое выражение, заканчивающееся точкой с запятой (;), является оператором. Далее следуют примеры операторов-выражений. Оператор присваивания Идентификатор = выражение; Пр имер х=3; Оператор вызова функции Имя_функции (аргумент!,..., аргумент^); Пример fclose (file); Пустой оператор Состоит только из точки с запятой (;). Используется для обозначения пустого тела управляющего оператора. 5.5. Оператор завершения break break; Прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do или for. Управление передается оператору, следующему за заканчиваемым. Одно из назначений этого оператора -закончить выполнение цикла при присваивании некоторой переменной определенного значения. Пример for (i = 0, i < n; i++) if((a[i] =b[i])==0) break, 5.6. Оператор продолжения continue continue, Передает управление в начало ближайшего внешнего оператора цикла while, do или for, вызывая начало следующей итерации. Этот оператор по действию противоположен оператору break. Пр им е р for (i=0, К n, i++){ if(a[i] '=0) continue, a[i]=b[i]. k++; } "/ 5.7. Оператор возврата return return, Прекращает выполнение текущей функции и возвращает управление вызвавшей программе. return выражение; Прекращает выполнение текущей функции и возвращает управление вызвавшей программе с передачей значения выражения. Пр им е р return x+y; 5.8. Оператор перехода goto goto метка; Управление безусловно передается на оператор с меткой метка. Используется для выхода из вложенных управляющих операторов. Область действия ограничена текущей функцией. Пример goto ABC, 5.9. Условный оператор if-else if (выражение) оператор Если выражение истинно, то выполняется оператор. Если выражение ложно, то ничего не делается. При м.е р if (а == х) temp = 3; temp = 5, if (выражение) оператор} else оператор2 Если выражение истинно, то выполняется оператор! и управление передается на оператор, следующий за оператором^ (т. е. оператор2 не выполняется). Если выражение ложно, то выполняется оператор2. Часть else оператора может опускаться. Поэтому во вложенных операторах if с пропущенной частью else может возникнуть неоднозначность. В этом случае else связывается с ближайшим предыдущим оператором if в том же блоке, не имеющим части else Примеры Часть else относится ко второму оператору if: if (х > 1) if (у==2) z= 5, else z=6, Часть else относится к первому оператору if if(x>l){ if (У==2) z= 5, \ else z= б, Вложенные операторы if if (х == 'а') У=1, else if (x=='b'){ У=2, z=3, у else if (x == 'c') У =4, else prmtf("ERROR"), 5.10. Оператор-переключатель switch switch (выражение) { case константа: операторы case константа: операторы default: операторы } Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой или символьной константой, или константным выражением. Константное выражение не может включать переменные или вызовы функций'. Примеры Правильно: case 3+4: Неправильно: case X+Y: Операторы, связанные с меткой default, выполняются, если ни одна из констант в операторах case не равна значению выражения. Вариант default не обязательно должен быть последним. Если ни одна константа не соответствует значению выражения и вариант default отсутствует, то не выполняется никаких действий. Ключевое слово case вместе с константой служат просто метками, и если будут выполняться операторы для некоторого варианта case, то далее будут выполняться операторы всех последующих вариан ' Константное выражение вычисляется в период компиляции. — Прим. перев. тов до тех пор, пока не встретится оператор break/'Sio позволяет связывать одну последовательность операторов с несколькими вариантами, Никакие две константы в одном операторе-переключателе не могут иметь одинаковые значения. Пример switch (x) { case 'A': printf("CASE A\n"); break, case 'В': case 'С': printf("CASE В or C\n"), break; default: printf("NOT А, В or C\n"); break; } Наиболее общая синтаксическая форма оператора switch: switch (выражение) оператор Пр имер switch (x) case 2: case 4: у=3; 5.11. Оператор цикла while while (выражение) оператор Если выражение истинно, то оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, то управление передается следующему оператору. 3 а м е ч а н-”Р'е. Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще не выполняется. Пр и м е р