Является ли «истинным» результатом>, <,!, &&, ||или == определено? - PullRequest
19 голосов
/ 07 октября 2011

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

Ответы [ 4 ]

35 голосов
/ 07 октября 2011

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

Каждый из операторов <(меньше чем),> (больше чем), <= (меньше или равно) и> = (больше или равно) должно дать 1 , если указанное отношение истинно и 0 если оно ложно) Результат имеет тип 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 в качестве возможных значений.(Если только я не пропустил.)

14 голосов
/ 07 октября 2011

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

6 голосов
/ 07 октября 2011

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

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

Из раздела 6.5.9:

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

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

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

4 голосов
/ 05 февраля 2012

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

Этоне так для всех выражений C , которые дают логически истинные / ложные значения.Например, функции классификации символов is*(), объявленные в <ctype.h> (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, но для этого нет веских причин;для чего нужен оператор !.

...