В 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)?