Will a C conditional always return 1 or 0?

Do C conditional statements always return [1 or 0], or do they return [0 or 'something other than zero']. I ask because:

pseudo code -

foo(address, shouldSend):
register >>= 1
register <<= 1 // to clear bit in first position
register |= shouldSend // to signal whether it should send or not

the problem occurs if somebody passin IN a shouldSend value of true greater than one (as only 0 is false and all else is true, technically this is valid). since i am directly OR'ing the truth value of shouldSend with the register, it better not be say 0xFF! i already have a solution, so the question is more for curiousity sake. i am wondering though if:

foo(address, shouldSend):
register >>= 1
register <<= 1 // to clear bit in first position
register |= (shouldSend > 0) // to signal whether it should send or not

solves the problem? i would think that now the problem of an 0xFF(or in general, something greater than 1) passed in is masked by the C conditional. but this only holds IF C conditionals are guaranteed to return [0 or 1].

ps - i also realize that it is probably compiler dependent, but what does the ansi standard say about this?

9
задан trh178 20 August 2010 в 15:21
поделиться

4 ответа

Стандарт определяет, что результатом всегда является целочисленное значение, равное 0 или 1

6.5.8 Реляционные операторы

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

17
ответ дан 4 December 2019 в 11:03
поделиться

Неважно, указано это или нет. Лучше всегда проверять на ложность и четко указывать свои значения «или равно». Это избавляет от каких-либо проблем с реализацией компилятора, делает его более понятным и удобным в обслуживании.

1
ответ дан 4 December 2019 в 11:03
поделиться

Вместо того, чтобы сдвигать вправо и снова сдвигать влево, чтобы очистить младший бит, я бы использовал побитовое - и это с помощью 0xFE:

register = register & 0xFE;

[править: предполагается, что регистр 8 бит. Если нет, при необходимости измените правый операнд]

Но да, если shouldSend является результатом условной проверки, тогда стандарт гарантирует, что он будет равен 0 или 1. Если есть какие-либо сомнения относительно того, может ли shouldSend быть сгенерировано из в любом другом месте было бы разумно принять меры предосторожности, которые есть у вас, или что-то вроде

register = register | (shouldSend ? 1 : 0);
1
ответ дан 4 December 2019 в 11:03
поделиться

Да. Это гарантировано в C99. У меня под рукой нет спецификации C89. Конечно, разработчики компиляторов иногда допускают ошибки, поэтому YMMV.

C99 определяет следующее в параграфе 6 6.5.8 Операторы отношения :

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

Такие же или похожие статьи включены в пункт 3 6.5.9 Операторы равенства , параграф 3 6.5.13 Логический оператор AND и параграф 3 из 6.5.14 Логический оператор OR .

0
ответ дан 4 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: