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

时间:2010-08-20 15:21:28

标签: c standards conditional

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标准对此有何看法?

4 个答案:

答案 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运算符