Опубликован: 05.07.2006 | Доступ: свободный | Студентов: 4596 / 873 | Оценка: 4.12 / 3.74 | Длительность: 18:59:00
Лекция 10:

Справочное руководство по языку C

< Лекция 9 || Лекция 10: 1234567891011

9.7.5. Операции сдвига

Операции сдвига << и >> группируются слева направо. Для обеих операций проводятся обычные арифметические преобразования их операндов, каждый из которых должен быть целочисленного типа. Затем правый операнд преобразуется к типу int ; результат имеет тип левого операнда. Результат не определен, если правый операнд отрицателен или больше или равен, чем длина объекта в битах.

Выражение-сдвига:

  • выражение << выражение
  • выражение >> выражение

Значением выражения e1<<e2 является e1 (интерпретируемое как комбинация битов), сдвинутое влево на e2 битов; освобождающиеся биты заполняются нулем. Значением выражения e1>>e2 является e1, сдвинутое вправо на e2 битовых позиций. Если e1 имеет тип unsigned, то сдвиг вправо гарантированно будет логическим (заполнение нулем); в противном случае сдвиг может быть (и так и есть на PDP-11) арифметическим (освобождающиеся биты заполняются копией знакового бита).

9.7.6. Операции отношения

Операции отношения группируются слева направо, но этот факт не очень полезен; выражение a<b<c не означает того, что оно казалось бы должно означать.

Выражение-отношения:

  • выражение < выражение
  • выражение > выражение
  • выражение <= выражение
  • выражение >= выражение

Операции < (меньше), > (больше), <= (меньше или равно) и >= (больше или равно) все дают 0, если указанное отношение ложно, и 1, если оно истинно. Результат имеет тип int. Выполняются обычные арифметические преобразования. Могут сравниваться два указателя ; результат зависит от относительного расположения указываемых объектов в адресном пространстве. Сравнение указателей переносимо только в том случае, если указатели указывают на объекты из одного и того же массива.

9.7.7. Операции равенства

Выражение-равенства:

  • выражение == выражение
  • выражение != выражение

Операции == (равно) и != (не равно) в точности аналогичны операциям отношения, за исключением того, что они имеют более низкий уровень старшинства. (Поэтому значение выражения a<b==c<d равно 1 всякий раз, когда выражение a<b и c<d имеют одинаковое значение истинности).

указатель можно сравнивать с целым, но результат будет машинно-независимым только в том случае, если целым является константа 0. Гарантируется, что указатель, которому присвоено значение 0, не указывает ни на какой объект и на самом деле оказывается равным 0 ; общепринято считать такой указатель нулем.

9.7.8. Побитовая операция 'и'

Выражение-и:
 выражение & выражение

Операция & является ассоциативной, и включающие & выражения могут быть переупорядочены. Выполняются обычные арифметические преобразования; результатом является побитовая функция 'и' операндов. Эта операция применима только к операндам целочисленного типа.

9.7.9. Побитовая операция исключающего 'или'

Выражение-исключающего-или:
  выражение ^ выражение

Операция ^ является ассоциативной, и включающие ^ выражения могут быть переупорядочены. выполняются обычные арифметические преобразования; результатом является побитовая функция исключающего 'или' операндов. Операция применима только к операндам целочисленного типа.

9.7.10. Побитовая операция включающего 'или'

Выражение-включающего-или:
  выражение | Выражение

Операция | является ассоциативной, и содержащие | выражения могут быть переупорядочены. выполняются обычные арифметические преобразования; результатом является побитовая функция включающего 'или' операндов. Операция применима только к операндам целочисленного типа.

9.7.11. Логическая операция 'и'

Выражение-логического-и:
  выражение && выражение

Операция && группируется слева направо. Она возвращает 1, если оба ее операнда отличны от нуля, и 0 в противном случае. В отличие от & операция && гарантирует вычисление слева направо; более того, если первый операнд равен 0, то значение второго операнда вообще не вычисляется.

Операнды не обязаны быть одинакового типа, но каждый из них должен быть либо одного из основных типов, либо указателем. Результат всегда имеет тип int.

9.7.12. Операция логического 'или'

Выражение-логического-или:
 выражение || выражение

Операция || Группируется слева направо. Она возвращает 1, если один из операндов отличен от нуля, и 0 в противном случае. В отличие от операции | Операция || Гарантирует вычисление слева направо; более того, если первый операнд отличен от нуля, то значение второго операнда вообще не вычисляется.

Операнды не обязаны быть одинакового типа, но каждый из них должен быть либо одного из основных типов, либо указателем. Результат всегда имеет тип int.

9.7.13. Условная операция

Условное-выражение:
 выражение ? выражение : выражение

Условные выражения группируются слева направо. Вычисляется значение первого выражения, и если оно отлично от нуля, то результатом будет значение второго выражения; в противном случае результатом будет значение третьего выражения. Если это возможно, проводятся обычные арифметические преобразования, с тем, чтобы привести второе и третье выражения к общему типу ; в противном случае, если оба выражения являются указателями одинакового типа, то результат имеет тот же тип ; в противном случае одно выражение должно быть указателем, а другое - константой 0, и результат будет иметь тип указателя. Вычисляется только одно из второго и третьего выражений.

9.7.14. Операция присваивания

Имеется ряд операций присваивания, каждая из которых группируется слева направо. Все операции требуют в качестве своего левого операнда L-значение, а типом выражения присваивания является тип его левого операнда. Значением выражения присваивания является значение, хранимое в левом операнде после того, как присваивание уже будет произведено. Две части составной операции присваивания являются отдельными лексемами.

Выражение-присваивания:

  • L-значение = выражение
  • L-значение += выражение
  • L-значение -= выражение
  • L-значение *= выражение
  • L-значение /= выражение
  • L-значение %= выражение
  • L-значение >>= выражение
  • L-значение <<= выражение
  • L-значение &= выражение
  • L-значение ^= выражение
  • L-значение |= выражение

Когда производится простое присваивание C ' = ', значение выражения заменяет значение объекта, на которое ссылается L-значение. Если оба операнда имеют арифметический тип, то перед присваиванием правый операнд преобразуется к типу левого операнда.

О свойствах выражения вида e1 оп = e2, где oп - одна из перечисленных выше операций, можно сделать вывод, если учесть, что оно эквивалентно выражению e1 = e1 оп (e2) ; однако выражение e1 вычисляется только один раз. В случае операций += и -= левый операнд может быть указателем, причем при этом (целочисленный) правый операнд преобразуется таким образом, как объяснено далее; все правые операнды и все отличные от указателей левые операнды должны иметь арифметический тип.

Используемые в настоящее время компиляторы допускают присваивание указателя целому, целого указателю и указателя указателю другого типа. такое присваивание является чистым копированием без каких-либо преобразований. Такое употребление операций присваивания является непереносимым и может приводить к указателям, которые при использовании вызывают ошибки адресации. Тем не менее гарантируется, что присваивание указателю константы 0 дает нулевой указатель, который можно отличать от указателя на любой объект.

9.7.15. Операция запятая

Выражение-с-запятой:
  выражение , выражение

Пара выражений, разделенных запятой, вычисляется слева направо и значение левого выражения отбрасывается. типом и значением результата является тип и значение правого операнда. Эта операция группируется слева направо. В контексте, где запятая имеет специальное значение, как, например, в списке фактических аргументов функций. Или в списках инициализаторов. Операция запятая, описываемая в этом разделе, может появляться только в круглых скобках ; например, функция

f(a,(t=3,t+2),c)

имеет три аргумента, второй из которых имеет значение 5.

< Лекция 9 || Лекция 10: 1234567891011