C条件总是会返回1还是0?

C条件语句总是返回[1或0],还是返回[0或’除零以外的值’]。 我问因为:

伪代码 –

foo(地址,应该发送):
注册>> = 1
寄存器<< = 1 //清除第一个位置的位
register | = shouldSend //表示是否应该发送

如果某人在一个大于1的shouldSend值中传递了一个问题,那么就会出现问题(因为只有0是假而其他所有都是真的,技术上这是有效的)。 因为我直接用寄存器对theSend的真值进行OR运算,所以最好不要说0xFF! 我已经有了一个解决方案,所以问题更多的是出于好奇的缘故。 我想知道如果:

foo(地址,应该发送):
注册>> = 1
寄存器<< = 1 //清除第一个位置的位
register | = (shouldSend> 0) //表示是否发送

解决了这个问题? 我认为现在传入的0xFF(或一般来说,大于1的东西)的问题被C条件掩盖。 但这只能保证IF C条件保证返回[0或1]。

ps – 我也意识到它可能依赖于编译器,但是ansi标准对此有何看法?

Standard指定结果始终为整数值等于0或1

6.5.8关系运算符

如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)将产生1,如果是,则为0 false.92)结果的类型为int。

如果指定与否则无关紧要。 最好始终针对false进行测试,并明确指出您的or-equals值。 这消除了对编译器实现的任何担心,并且更清晰,更易于维护。

而不是右移和左移再次清除LSB,我会按位 – 并且它与0xFE:

 register = register & 0xFE; 

[编辑:假设寄存器是8位。 如果没有,请根据需要调整右手操作数]

但是,是的,如果shouldSend是条件测试的结果,则标准保证为0或1.如果对是否可以从其他任何地方生成shouldSend有任何疑问,那么放置这种预防措施是明智的你有,或类似的东西

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

是。 这在C99中得到保证。 我没有方便的C89规格。 当然,已知编译器实现者偶尔会犯错误,因此YMMV。

C99在6.5.8关系运算符的第6段中规定了以下内容:

如果指定的关系为真,则每个运算符< (小于), > (大于), <= (小于或等于)和> = (大于或等于)将产生1,如果是,则为0假。

相同或类似的条款出现在6.5.9等式运算符的第3段, 6.5.13逻辑AND运算符的第3段和6.5.14逻辑OR运算符的第3段中。