C++中-1与自然数执行&&逻辑与运算结果为何为1?
问题描述
编写代码实现逻辑运算时,出现if语句未按预期进入的异常,经排查问题与-1和自然数执行&&(逻辑与)运算的规则有关。以下测试代码运行后打印值为1,尝试通过原码、反码、补码规则手动推导始终无法得到结果1,测试代码如下:
#include <iostream> using namespace std; int main() { int a = 10; int b = -1; int c = a && b; printf("test = %d",c); return 0; }
问题解答
出现这个疑惑的核心原因是搞混了*逻辑与运算符&&和按位与运算符&*的运算规则:
- C/C++里的
&&是纯逻辑判断运算符,根本不做二进制位层面的计算,判断规则非常简单:运算符左右两个操作数都不为0时,整个表达式返回1(代表逻辑真);只要任意一个操作数的值为0,表达式就返回0(代表逻辑假)。 - 你写的测试代码里,
a=10是非零值,b=-1同样是非零值,两个操作数都满足非零要求,因此a && b的返回值必然是1。这个计算过程和原码、反码、补码规则完全没关系,你之前的推导方向从根上就错了。 - 如果你本来要做的是两个整数的二进制逐位相与计算,那应该用单&符号的按位与运算符
&,这个场景下才需要用补码规则计算:32位int类型下10的补码高位全为0、低4位是1010,-1的补码是32位全1,逐位相与后结果是10,和逻辑与的运算结果完全不同。 - 额外提一句:
&&自带短路求值特性,如果运算符左侧的操作数已经是0,右侧的表达式会直接跳过不执行,这也是它和按位与运算符的核心差异之一。你之前遇到的if分支没按预期进入的问题,大概率就是混用了这两个运算符导致的。
内容的提问来源于stack exchange,提问作者Seongtaek OH
相关产品推荐
相关产品推荐

