В C условно-ориентированные операторы оценивают либо 1
, либо 0
типа int
(даже если он имеет выделенный тип _Bool
). Ссылаясь на проект C11 N1570:
C11 §6.5.8/6 Реляционные операторы
Каждый из операторов
<
(меньше),>
(больше),<=
(меньше или равно), а>=
(больше или равно) должно давать 1, если указанное отношение истинно и 0, если оно ложно. 107) Результат имеет типint
.C11 §6.5.9/3 Операторы равенства
Операторы
==
(равно) и!=
(не равные) аналогичны реляционные операторы, за исключением их более низкого приоритета. 108) Каждый из операторы дают 1, если указанное отношение истинно и 0, если оно false. Результат имеет типint
. Для любой пары операндов точно верно одно из соотношений.C11 6.5.13/3 Логический оператор И
Оператор
&&
должен давать 1, если оба его операнда сравнивают неравные до 0; в противном случае он дает 0. Результат имеет типint
.C11 6.5.14/3 Логический оператор OR
Оператор
||
должен давать 1, если один из его операндов сравнивается не равный 0; в противном случае он дает 0. Результат имеет типint
.
Как я заметил, С++ кажется другим в этом вопросе, как в следующем примере (см. http://ideone.com/u3NxfW):
#include <iostream>
#include <typeinfo>
int main() {
double x = 10.0;
std::cout << typeid(x <= 10.0).name() << std::endl;
return 0;
}
выводит b
, который, как я думаю, указывает тип bool
. С++ гарантирует, что все эти операторы всегда оценивают тип bool
(в отличие от C)?