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