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

Содержание
Возврат к предыдущей части 1.3.9-1.3.11 Поразрядные/логические/последовательные операции

В языке СИ имеется одна тернарная операция — условная операция, которая имеет следующий формат:

операнд-1 ? операнд-2 : операнд-3

Операнд-1 должен быть целого или плавающего типа или быть указателем. Он оценивается с точки зрения его эквивалентности 0. Если операнд-1 не равен 0, то вычисляется операнд-2 и его значение является результатом операции. Если операнд-1 равен 0, то вычисляется операнд-3 и его значение является результатом операции. Следует отметить, что вычисляется либо операнд-2, либо операнд-3, но не оба. Тип результата зависит от типов операнда-2 и операнда-3, следующим образом.

  • 1. Если операнд-2 или операнд-3 имеет целый или плавающий тип (отметим, что их типы могут отличаться), то выполняются обычные арифметические преобразования. Типом результата является тип операнда после преобразования.
  • 2. Если операнд-2 и операнд-3 имеют один и тот же тип структуры, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя.
  • 3. Если оба операнда имеют тип void, то результат имеет тип void.
  • 4. Если один операнд является указателем на объект любого типа, а другой операнд является указателем на vold, то указатель на объект преобразуется к указателю на vold, который и будет типом результата.
  • 5. Если один из операндов является указателем, а другой константным выражением со значением 0, то типом результата будет тип указателя.

Пример:

1
max = (d<=b) ? b : d;

Переменной max присваивается максимальное значение переменных d и b.

Читать далее. Раздел 1.3.13. Операции увеличения и уменьшения
Содержание

3 thoughts on “1.3.12. Условная операция”

  1. В предыдущую часть (там отписаться нельзя) закралась ошибка.

    Операция логического И (&&) вырабатывает значение 1, если оба операнда имеют нулевые значения.
    —>
    ненулевые

  2. ага и в примере
    int i=0x45FF, /* i= 0100 0101 1111 1111 */
    j=0x00FF; j= 0000 0000 1111 1111 */
    char r;
    r = i^j; /* r=0x4500 = 0100 0101 0000 0000 */
    r = i|j; /* r=0x45FF = 0100 0101 0000 0000 */ на самом деле 0100 010 11111 1111
    r = i&j /* r=0x00FF = 0000 0000 1111 1111 */

Добавить комментарий