Я читал comp.lang.c Описание booleans values, pre-C99. Он упоминает, что некоторые люди предпочитают определять свои собственные логические значения, как:Nitpicking booleans in C
#define TRUE (1==1)
#define FALSE (!TRUE)
Однако стандарт определяет оператор равенства всегда возвращает подписанный Int со значением 1, если два значения считаются равными (C11 - 6,5. 9), а логический оператор не должен возвращать значение int со значением 0, если значение сравнивается не равным 0 (C11 - 6.5.3.3).
Если это так, и приведенные выше определения использовать литералы, не оценка произойдет во время компиляции и в результате определения быть:
#define TRUE (1)
#define FALSE (0)
И последующий вопрос. Есть ли случай, когда имеет смысл определять истинные и ложные метки для чего-либо, кроме 1 и 0, соответственно?
Прошу простить, что я ссылаюсь на C11, когда мой вопрос касается C89, но у меня есть только стандарт C11.
'TRUE = 1' и' FALSE = 0' привязаны к стандарту, как вы уже отметили. 'TRUE = (1 == 1)' и 'FALSE = (! TRUE)' привязаны к реализации, специфичной для компилятора. Поэтому, если вы получаете нестандартный компилятор (что плохо), вы все равно можете иметь несколько портативный код. –
Обратите внимание, что '1 == 1' ** является **' 1' и '! (1 == 1)' ** ** ** - поскольку они являются * постоянными выражениями *. Один случай, когда это имеет смысл, - e. г. когда вы хотите, чтобы ваш компилятор не принимал 'FALSE' как литерал нулевого указателя. –
Это также полезно, если сделано в файле заголовка, который может быть включен программой C++. Тогда 'TRUE' будет правильным' bool', набранным 'true'. – rodrigo