Will a C conditional always return 1 or 0?

狂风中的少年 提交于 2019-12-05 02:12:41

Standard specifies that the result is always integer value equals to 0 or 1

6.5.8 Relational operators

Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.92) The result has type int.

Doesn't matter if it is specified or not. It is best to always test against false and be explicit about your or-equals values. This removes any worry about compiler implementations and is clearer and more maintainable.

Rather than right shifting and left shifting back again to clear the LSB, I would bitwise-and it with 0xFE:

register = register & 0xFE;

[edit: assuming register is 8 bits. If not, adapt right hand operand as necessary]

But yes, if shouldSend is a result of a conditional test then it is guaranteed by the standard to be either 0 or 1. If there's any doubt about whether shouldSend could be generated from anywhere else it would be wise to put in the sort of precaution you have, or something like

register = register | (shouldSend ? 1 : 0);

Yes. This is guaranteed in C99. I don't have the C89 spec handy. Of course, compiler implementers have been known to make mistakes on occasion so YMMV.

C99 specifies the following in paragraph 6 of 6.5.8 Relational operators:

Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.

The same or similar clauses appear in paragraph 3 of 6.5.9 Equality operators, paragraph 3 of 6.5.13 Logical AND operator, and paragraph 3 of 6.5.14 Logical OR operator.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!