Керниган и Ритчи - Язык программирования Си (793773), страница 49
Текст из файла (страница 49)
Целочисленныйоперанд подвергается целочисленному повышению. Типом результата является повышенный тип операнда.Унарный + был добавлен для симметрии с унарным -.А 7.4.5. Оператор унарный минусОперанд для унарного - должен иметь арифметический тип, результат — значение операнда спротивоположным знаком. Целочисленный операнд подвергается целочисленному повышению.Отрицательное значение от беззнаковой величины вычисляется вычитанием из nmax+1 приведенного кповышенному типу операнда, где nmax — максимальное число повышенного типа; однако минус нуль естьнуль. Типом результата будет повышенный тип операнда.А 7.4.6.
Оператор побитового отрицанияОперанд оператора ~ должен иметь целочисленный тип, результат — дополнение операнда до единиц повсем разрядам. Выполняется целочисленное повышение типа операнда. Если операнд беззнаковый, торезультат получается вычитанием его значения из самого большого числа повышенного типа. Если операндзнаковый, то результат вычисляется посредством приведения "повышенного операнда" к беззнаковому типу,выполнения операции ~ и обратного приведения его к знаковому типу. Тип результата — повышенный типоперанда.А 7.4.7. Оператор логического отрицанияОперанд оператора ! должен иметь арифметический тип или быть указателем.
Результат равен 1, еслисравнение операнда с 0 дает истину, и равен 0 в противном случае. Тип результата — int.А 7.4.8. Оператор определения размера sizeofОператор sizeof дает число байтов, требуемое для хранения объекта того типа, который имеет его операнд.Операнд — либо выражение (которое не вычисляется), либо имя типа, записанное в скобках. Примененный кchar оператор sizeof дает 1.
Для массива результат равняется общему количеству байтов в массиве, дляструктуры или объединения — числу байтов в объекте, включая и байты-заполнители, которые понадобилисьбы, если бы из элементов составлялся массив. Размер массива из n элементов всегда равняется n,помноженному на размер отдельного его элемента. Данный оператор нельзя применять к операнду типа"функция", к незавершенному типу и к битовому полю. Результат — беззнаковая целочисленная константа;конкретный ее тип зависит от реализации.
В стандартном заголовочном файле <stddef.h> (см.приложение В) этот тип определяется под именем size_t.А 7.5. Оператор приведения типаИмя типа, записанное перед унарным выражением в скобках, вызывает приведение значения этоговыражения к указанному типу.выражение-приведенное-к-типу:унарное-выражение(имя-типа) выражение-приведенное-к-типуДанная конструкция называется приведением. Имена типов даны в А8.8. Результат преобразований описан вА6. Выражение с приведением типа не является lvalue.А 7.6. Мультипликативные операторыМультипликативные операторы *, / и % выполняются слева направо.мультиипликативное-выражение:выражение-приведенное-к-типумультипликативное-выражение * выражение-приведенное-к-типумультипликативное-выражение / выражение-приведенное-к-типумультипликативное-выражение % выражение-приведенное-к-типуОперанды операторов * и /должны быть арифметического типа, оператора % — целочисленного типа.
Надоперандами осуществляются обычные арифметические преобразования, которые приводят их значения ктипу результата.Бинарный оператор * обозначает умножение.Бинарный оператор / получает частное, а % — остаток от деления первого операнда на второй; если второйоперанд есть 0, то результат не определен. В противном случае всегда выполняется соотношение: (a/b)*b+ a%b равняется а. Если оба операнда не отрицательные, то остаток не отрицательный и меньше делителя; впротивном случае стандарт гарантирует только одно: что абсолютное значение остатка меньше абсолютногозначения делителя.А 7.7.
Аддитивные операторыАддитивные операторы + и - выполняются слева направо. Если операнды имеют арифметический тип, тоосуществляются обычные арифметические преобразования. Для каждого оператора существует ещенесколько дополнительных сочетаний типов.аддитивное-выражение:мультипликативное-выражениеаддитивное-выражение + мультипликативное-выражениеаддитивное-выражение - мультипликативное-выражениеРезультат выполнения оператора + есть сумма его операндов.
Указатель на объект в массиве можноскладывать с целочисленным значением. При этом последнее преобразуется в адресное смещениепосредством умножения его на размер объекта, на который ссылается указатель. Сумма является указателемна объект того же типа; только ссылается этот указатель на другой объект того же массива, отстоящий отпервоначального соответственно вычисленному смещению. Так, если Р — указатель на объект в массиве, тоР+1 — указатель на следующий объект того же массива. Если полученный в результате суммированияуказатель указывает за границы массива, то, кроме случая, когда он указывает на место, находящеесянепосредственно за концом массива, результат будет неопределенным.Возможность для указателя указывать на элемент, расположенный сразу за концом массива, являетсяновой.
Тем самым узаконена общепринятая практика организации циклического перебора элементовмассива.Результат выполнения оператора - (минус) есть разность операндов. Из указателя можно вычитать значениелюбого целочисленного типа с теми же преобразованиями и при тех же условиях, что и в сложении.Если к двум указателям на объекты одного и того же типа применить оператор вычитания, то в результатеполучится целочисленное значение со знаком, представляющее собой расстояние между объектами, накоторые указывают эти указатели; указатель на следующий объект на 1 больше указателя на предыдущийобъект. Тип результата зависит от реализации; в стандартном заголовочном файле <stddef.h> онопределен под именем ptrdiff_t.
Значение не определено, если указатели указывают на объекты неодного и того же массива; однако если Р указывает на последний элемент массива, то Р+1-Р имеет значение,равное 1.А 7.8. Операторы сдвигаОператоры сдвига << и >> выполняются слева направо.
Для обоих операторов каждый операнд должениметь целочисленный тип, и каждый из них подвергается целочисленному повышению. Тип результатасовпадает с повышенным типом левого операнда. Результат не определен, если правый операнд отрицателенили его значение превышает число битов в типе левого выражения или равно ему.сдвиговое-выражение:аддитивное-выражениесдвиговое-выражение >> аддитивное-выражениесдвиговое-выражение << аддитивное-выражениеЗначение Е1<<Е2 равно значению Е1 (рассматриваемому как цепочка битов), сдвинутому влево на Е2 битов;при отсутствии переполнения такая операция эквивалентна умножению на 2Е2.
Значение Е1>>Е2 равнозначению Е1, сдвинутому вправо на Е2 битовые позиции. Если Е1 — беззнаковое или имеетнеотрицательное значение, то правый сдвиг эквивалентен делению на 2Е2, в противном случае результатзависит от реализации.А 7.9. Операторы отношенияОператоры отношения выполняются слева направо, однако это свойство едва ли может оказаться полезным;согласно грамматике языка выражение a<b<c трактуется так же, как (а<b)<с, а результат вычисления а<bможет быть только 0 или 1.выражение-отношения:сдвиговое-выражениевыражение-отношениявыражение-отношениявыражение-отношениявыражение-отношения< сдвиговое-выражение> сдвиговое-выражение<= сдвиговое-выражение>= сдвиговое-выражениеОператоры: < (меньше), > (больше), <= (меньше или равно) и >= (больше или равно) — все выдают 0, еслиспецифицируемое отношение ложно, и 1, если оно истинно.
Тип результата — int. Над арифметическимиоперандами выполняются обычные арифметические преобразования. Можно сравнивать указатели наобъекты одного и того же типа (без учета квалификаторов); результат будет зависеть от относительногорасположения в памяти. Допускается, однако, сравнение указателей на разные части одного и того жеобъекта: если два указателя указывают на один и тот же простой объект, то они равны; если они указывают наэлементы одной структуры, то указатель на элемент с более поздним объявлением в структуре больше; еслиуказатели указывают на элементы одного и того же объединения, то они равны; если указатели указывают наэлементы некоторого массива, то сравнение этих указателей эквивалентно сравнению их индексов. Если Руказывает на последний элемент массива, то Р+1 больше, чем Р, хотя Р+1 указывает за границы массива. Востальных случаях результат сравнения не определен.Эти правила несколько ослабили ограничения, установленные в первой редакции языка.
Онипозволяют сравнивать указатели на различные элементы структуры и объединения и легализуютсравнение с указателем на место, которое расположено непосредственно за концом массива.А 7.10. Операторы равенствавыражение-равенства:выражение-отношениявыражение-равенства == выражение-отношениявыражение-равенства != выражение-отношенияОператоры == (равно) и != (не равно) аналогичны операторам отношения с той лишь разницей, что имеютболее низкий приоритет. (Таким образом, a<b == c<d есть 1 тогда и только тогда, когда отношения а<b иc<d или оба истинны, или оба ложны.)Операторы равенства подчиняются тем же правилам, что и операторы отношения. Кроме того, они даютвозможность сравнивать указатель с целочисленным константным выражением, значение которого равнонулю, и с указателем на void (см.















