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?
Стандарт определяет, что результатом всегда является целочисленное значение, равное 0 или 1
6.5.8 Реляционные операторы
Каждый из операторов < (меньше чем), > (больше чем), <= (меньше или равно к), и >= (больше или равно) должен давать 1, если указанное отношение истинно и 0, если оно false.92) Результат имеет тип int.
Неважно, указано это или нет. Лучше всегда проверять на ложность и четко указывать свои значения «или равно». Это избавляет от каких-либо проблем с реализацией компилятора, делает его более понятным и удобным в обслуживании.
Вместо того, чтобы сдвигать вправо и снова сдвигать влево, чтобы очистить младший бит, я бы использовал побитовое - и это с помощью 0xFE:
register = register & 0xFE;
[править: предполагается, что регистр 8 бит. Если нет, при необходимости измените правый операнд]
Но да, если shouldSend является результатом условной проверки, тогда стандарт гарантирует, что он будет равен 0 или 1. Если есть какие-либо сомнения относительно того, может ли shouldSend быть сгенерировано из в любом другом месте было бы разумно принять меры предосторожности, которые есть у вас, или что-то вроде
register = register | (shouldSend ? 1 : 0);
Да. Это гарантировано в C99. У меня под рукой нет спецификации C89. Конечно, разработчики компиляторов иногда допускают ошибки, поэтому YMMV.
C99 определяет следующее в параграфе 6 6.5.8 Операторы отношения :
Каждый из операторов < (меньше чем), > ( больше чем), <= (меньше или равно) и > = (больше или равно) должны дать 1, если указанное отношение истинно, и 0, если оно ложный.
Такие же или похожие статьи включены в пункт 3 6.5.9 Операторы равенства , параграф 3 6.5.13 Логический оператор AND и параграф 3 из 6.5.14 Логический оператор OR .