c/c++语言开发共享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段中。

      以上就是c/c++开发分享C条件总是会返回1还是0?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560586.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐