Является ли «истинный» результат из>, <,!, &&, || или == определено?

Когда я, например, пишу 7>1 в C (скажем, C99, если это не всегда была функция), могу ли я ожидать, что результат будет ровно 1 или просто отличным от нуля? Это выполняется для всех операторов bool?

В C99 §6.5.8 Реляционные операторы, пункт 6 ( < , > , <= и >= ):

Каждый из операторов <(меньше),> (больше), <= (меньше или равен) и> = (больше или равен) должен давать 1, если указанное отношение истинно и 0, если оно false) Результат имеет тип int .

Что касается операторов равенства, то в § 6.5.9 ( == и != ) Это немного больше:

Операторы == (равно) и! = (Не равны) аналогичны операциям реляционной связи, за исключением их более низкого приоритета). Каждый из операторов дает 1, если указанное отношение истинно и 0, если оно ложно. Результат имеет тип int . Для любой пары операндов истинно одно из отношений.

Логические И и логические ИЛИ еще немного в § 6.5.13 ( && )

Оператор && должен давать 1, если оба его операнда сравниваются не равными 0; в противном случае он дает 0 . Результат имеет тип int .

... и §6.5.14 ( || )

|| оператор должен дать 1, если один из его операндов сравним неравномерно с 0; в противном случае он дает 0 . Результат имеет тип int .

И семантика унарного арифметического оператора ! закончились в п. 6.5.3.3 / 4:

Результат оператора логического отрицания! равен 0 , если значение его операнда сравнивается не равным 0, 1, если значение его операнда сравнивается с равным 0. Результат имеет тип int . Выражение! E эквивалентно (0 == E).

Тип результата - int через панель, с 0 и 1 как возможные значения. (Если я не пропустил некоторые.)

C следует закону Постела для его булевых операторов: быть консервативным в том, что вы делаете, быть либеральным в том, что вы принимаете от других. Он будет обрабатывать любое ненулевое значение как истинное в булевых выражениях, но оно всегда будет производить либо сам 0, либо 1. 2 != 3 всегда 1 .

Из стандарта ISO C99, раздел 6.5.8:

6 Каждый из операторов <(меньше),> (больше), <= (меньше или равен) и> = (больше или равен) должен давать 1, если указанное отношение истинно и 0, если оно false. Результат имеет тип int.

Из раздела 6.5.9:

Операторы == (равные) и! = (Не равные) аналогичны операторам отношения, за исключением их более низкого приоритета. Каждый из операторов дает 1, если указанное отношение истинно и 0, если оно ложно. Результат имеет тип int. Для любой пары операндов истинно одно из отношений.

То же самое происходит с логическими операторами ( && ) и дизъюнкцией ( || ).

PS: Кстати, именно поэтому побитовые операторы ( & и | ) обычно можно использовать в качестве короткозамкнутых версий логических операторов.

Все операторы C, которые дают логически истинные / ложные значения, всегда дают результат типа int со значением 0 для false, 1 для true.

Это не относится ко всем выражениям C, которые дают логически истинные / ложные значения. Например, функции classификации символов is*() объявленные в ( isdigit() , isupper() и т. Д.) Возвращают 0 если условие ложно, но может возвращать любое ненулевое значение, если условие правда.

Пока вы используете результат непосредственно как условие:

 if (isdigit(c)) ... if (!isdigit(c)) ... if (isdigit(c) || islower(c)) ... 

и не пытайтесь сравнивать его с чем-то:

 if (isdigit(c) == 1) ... /* WRONG */ if (isdigit(c) == true) ... /* ALSO WRONG */ 

это не должно вызывать никаких проблем.

(Вы можете смело сравнивать результат с 0 или false , но для этого нет веских оснований, для чего ! оператор ! ).