Для сравнения значений используются следующие операции:
Операция | Описание |
---|---|
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.
Простые условия объединяются в сложные с помощью логических операций:
Операция | Альтернативное обозначение | Описание |
---|---|---|
!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,... )
Результатом операции является одно из "выр"_i в зависимости от типа x; "выр"_n, помеченное default
, выбирается, если тип x не совпадает ни с одним из "тип"_i. Обычно эта операция используется в макросах препроцессора, позволяя вызывать нужный вариант функции как в <tgmath.h>
.
short a;
int r=_Generic(a/2.0, int:1, double:2, float:3, default:0); // r=2