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

C++中if (! --rank[x])条件作用与非bool类型判断规则

if (! --rank[x]) 执行逻辑拆解

这个语句的运行顺序严格按照C++运算符优先级执行,从内到外、按优先级从高到低运行,一共4步:

  • 第一步:定位数组元素。根据索引x找到rank数组中对应的int类型元素rank[x]
  • 第二步:执行前置递减运算。--放在变量前面是前置自减操作,会先把rank[x]本身的数值减1,并且用减完之后的新值参与后续计算(注意和后置自减rank[x]--区分,后置是先返回变量原来的旧值参与计算,再给变量减1,写反了逻辑会完全错)
  • 第三步:执行逻辑非运算。!是C++的逻辑非运算符,会把后面跟着的数值转成布尔值之后取反
  • 第四步:判断分支走向。只有逻辑非的结果为true时才会进入if对应的代码块

实际运行效果等价于:把rank[x]的值减1之后,如果结果刚好等于0,就执行if块内的代码,举几个具体场景:

  • 执行前rank[x]值为1:自减后为0,!0结果为true,进入if分支
  • 执行前rank[x]值为3:自减后为2,!2结果为false,不进入if分支
  • 执行前rank[x]值为0:自减后为-1,!-1结果为false,不进入if分支
非bool类型做判断的语法规则

这种写法完全符合C++的标准语法,没有特殊技巧:

  • C++从C语言继承了标量类型到布尔类型的隐式转换规则:当整数、浮点数、指针等类型的值出现在需要布尔值的上下文(比如if的条件、逻辑运算符的操作数位置)时,零值会被转换为false,所有非零值(无论正负)都会被转换为true,不需要手动做类型转换。
  • 这种简写风格有历史原因:早期C语言没有内置的布尔类型,所有逻辑判断都靠整数的0和非0来区分真假,这个编码习惯被C++完整保留,哪怕后续语言新增了原生bool类型,这类简写写法依然在工业界广泛使用,尤其是在并查集、引用计数这类需要做计数、计数归零时触发清理/合并逻辑的场景里,这种写法非常常见。
  • 你看到的这个判断,和写全的if ( (--rank[x]) == 0 )逻辑完全一致,只是写法更简洁。

内容的提问来源于stack exchange,提问作者very_secret_agent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:45:41