Возвращаемое значение оператора "==" в C
Можно ли предположить, что в C оператор "==" всегда будет оценивать до 1, если два значения равны или могут быть оценены другими "истинными" значениями?
struct ss {
int id;
};
struct os {
int sid;
int state;
};
int count(struct ss *s, int state)
{
int num = 0;
// foreach o (of type os*) in a hash table
num += o->state == state && (s ? o->sid == s->id : 1);
return num;
}
Итак, o->sid == s->id
будет возвращать всегда 1 или 0 или может возвращать другие значения?
Ответы
Ответ 1
Можно ли предположить, что в C оператор "==" всегда будет оценивать до 1, если два значения равны или могут быть оценены другими "истинными" значениями?
Да, и поэтому !=
>
<
>=
<=
весь реляционный оператор.
C11 (ISO/IEC 9899: 201x) §6.5.8 Операторы отношения
Каждый из операторов < (меньше), > (больше), <= (меньше или равно) и >= (больше или равно) дает 1, если указанное отношение истинно и 0, если оно false.107) Результат имеет тип int.
Ответ 2
Операторы сравнения (равенства и реляционные) (==
, !=
, <
, >
, <=
, >=
) все возвращают 0 для false и 1 для true - и никакие другие значения.
Логические операторы &&
, ||
и !
менее суетливы в отношении своих операндов; они обрабатывают 0 как ложные и любые ненулевые значения как истинные. Однако они также возвращают только 0 для false и 1 для истины.
Ответ 3
Из стандарта:
6.5.8 Операторы отношения
Каждый из операторов < (меньше), > (больше), <= (меньше или равно) и >= (больше или равно) должно давать 1, если указанное отношение истинно и 0, если оно ложно. Результат имеет тип int.
6.5.9 Операторы равенства
Операторы == (равно) и!= (не равные) аналогичны реляционным операторов, за исключением их более низкого приоритета. Каждый из операторов дает 1, если указанное отношение истинно и 0, если оно ложно. Результат имеет тип int. Для любой пары операндов, верно одно из отношений.
Для логических операндов (&&
, ||
):
6.5.13 Логический оператор И (или 6.5.14 Логический оператор ИЛИ)
Оператор & (или ||) должен давать 1, если оба его операнда сравниваются не равными 0; в противном случае он дает 0. Результат имеет тип int.
Здесь вы можете проверить последний черновик: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
Вывод:
-
Все равенство и реляционный оператор (==
, !=
, <
, >
, <=
, >=
) возвращают 0
для false
и 1
для true
.
-
Логические операторы (==
, ||
, !
) рассматривают 0
как false
и другие значения как true
для своих операндов. Они также возвращают 0
как false
и 1
как true
.
Ответ 4
Можно ли предположить, что в C оператор "==" всегда будет оценивать до 1, если два значения равны или могут быть оценены другими "истинными" значениями?
Да, для стандартного совместимого компилятора это предположение верно:
Языки программирования - C, §6.5.9 Операторы равенства (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):
Каждый из операторов дает 1, если указанное отношение истинно и 0 если оно ложно. Результат имеет тип int.