You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:01:13