Для сравнения значений используются следующие операции:
||.draw||Операция | Описание
--|--
``x==y`` | x равно y
``x!=y`` | x не равно y
``x>y`` | x больше y
``x>=y`` | x больше или равно y
``x<y`` | x меньше y
``x<=y`` | x меньше или равно y
Результатом этих операций является булево значение 0 или 1.
При сравнении вещественных значений необходимо учитывать точность вычислений, вместо
``x==y`` лучше проверить ``fabs(x-y)<1e-9``, если абсолютная точность вычислений равна `10^{-9}`.
Простые условия объединяются в сложные с помощью логических операций:
||.draw||Операция | Альтернативное обозначение | Описание
--|--|--
``!x`` | ``not x`` | НЕ x
``x&&y`` | ``x and y`` |x И y
``x\|\|y`` | ``x or y`` | x ИЛИ y
Аргументы этих операций могут быть не булевыми, любое ненулевое значение интерпретируется как 1 (истина), нулевое -- как 0 (ложь). Если аргумент операции отрицания нетривиальный, то его необходимо записывать в скобках, так как операция имеет высокий приоритет. Вычисление аргументов операции И выполняется слева направо, если аргумент является ложным, то результатом операции является ложь, и второй аргумент не вычисляется. Аналогично для операции ИЛИ: если первый аргумент операции является истинным, то результатом операции является истина, и второй аргумент не вычисляется.
Альтернативные обозначения для логических операций в С определяются в заголовочном файле <iso646.h>, в С++ они являются частью языка.
Условное выражение ``x?y:z`` интерпретируется так "если истинно выражение x, то результат равен y, иначе z". Например, для нахождения максимума из двух чисел a и b нужно написать ``a>b?a:b``.
В языке С (в С++ нет) есть специальная операция, которую можно назвать "выбором по типу" :\
``_Generic(`` `x, "тип"_1 : "выр"_1, "тип"_2 : "выр"_2, ..., bb"default": "выр"_n` ``)``\
Результатом операции является одно из `"выр"_i` в зависимости от типа `x`; `"выр"_n`, помеченное ``default``, выбирается, если тип `x` не совпадает ни с одним из `"тип"_i`. Обычно эта операция используется в [макросах препроцессора](53429.html), позволяя вызывать нужный вариант функции как в ``<tgmath.h>``.
```c
short a;
int r=_Generic(a/2.0, int:1, double:2, float:3, default:0); // r=2
```