C条件语句总是返回[1或0],还是返回[0或'除零以外的值']。我问因为:
伪代码 -
foo(地址,应该发送):
注册>> = 1
寄存器<< = 1 //以清除第一位置的位
register | = shouldSend //表示是否应该发送
如果有人在一个大于1的shouldSend值中传递了一个问题,那么就会出现问题(因为只有0是假而其他所有都是真的,技术上这是有效的)。因为我直接用寄存器OR发送shouldSend的真值,所以最好不要说0xFF!我已经有了一个解决方案,所以问题更多的是出于好奇的缘故。我想知道是否:
foo(地址,应该发送):
注册>> = 1
寄存器<< = 1 //以清除第一位置的位
注册| = (shouldSend> 0) //表示是否应该发送
解决了这个问题?我认为现在传入的0xFF(或一般来说,大于1)的问题被C条件掩盖。但这只能保证IF C条件保证返回[0或1]。
ps - 我也意识到它可能依赖于编译器,但是ansi标准对此有何看法?
答案 0 :(得分:17)
Standard指定结果始终为整数值等于0或1
6.5.8 关系运算符
每个运营商< (小于),> (大于),< =(小于或等于 to),> =(大于或等于) 如果指定,则应收1 关系是真,如果是,则为0 false.92)结果的类型为int。
答案 1 :(得分:1)
是否指定无关紧要。最好始终针对false进行测试,并明确指出您的or-equals值。这消除了对编译器实现的任何担心,并且更清晰,更易于维护。
答案 2 :(得分:1)
而不是右移和左移再次清除LSB,我会按位 - 并且它用0xFE:
register = register & 0xFE;
[编辑:假设寄存器是8位。如果没有,请根据需要调整右手操作数]
但是,是的,如果shouldSend是条件测试的结果,则标准保证为0或1.如果对于是否可以从其他任何地方生成shouldSend有任何疑问,那么放入你有什么预防措施,或类似
register = register | (shouldSend ? 1 : 0);
答案 3 :(得分:0)
是。这在C99中得到保证。我没有方便的C89规格。当然,众所周知,编译器实现者有时会犯错误,所以YMMV。
C99在 6.5.8关系运算符的第6段中指定以下内容:
每个运营商< (小于),> (大于),< = (小于或等于)如果指定的关系为真,则> = (大于或等于)将产生1,如果为假,则为0。
相同或类似的条款出现在 6.5.9 Equality operator 的第3段, 6.5.13 Logical AND operator 的第3段和的第3段6.5.14逻辑OR运算符。