女朋友C代码中出现“!!”,把人看蒙了!
- 一、“缘起”
- 二、 解释一下上面那段代码
-
- 1、解释 `!!` 运算符的作用
- 2、代码示例分析
- 3、应用场景
- 4、对比单次 `!` 的差异
- 三、示例

一、“缘起”
首先看一下下面这段代码,这段代码是判断一个引脚的高底电平
u8 level = !!(GPIOA_Data & PIN_2);
这两个连续的感叹号把有些人给整蒙圈了,当然有些朋友会说到两个感叹号的作用是表示语气加重,事情非常紧急得尽快处理。
二、 解释一下上面那段代码
1、解释 !! 运算符的作用
在C/C++中,!! 是双重逻辑非运算符的组合,用于将任意值强制转换为布尔值 0 或 1。
- 第一个 ! 将非零值转换为 0,将零值转换为 1。
- 第二个 ! 再次反转结果,最终将非零值转换为 1,零值转换为 0。
2、代码示例分析
对于表达式 u8 level = !!(GPIOA_Data & PIN_2);:
3、应用场景
这种用法常见于以下场景:
- 需要明确将硬件寄存器读取的值转换为布尔状态。
- 确保存储或逻辑判断时使用标准布尔值而非原始数值。
4、对比单次 ! 的差异
- 单次 !:会反转布尔值(1 变 0,0 变 1)。
- 双重 !!:保留原始非零/零状态,仅标准化为 1/0。
例如:
- 若 GPIOA_Data & PIN_2 结果为 0x04:
- !0x04 → 0
- !!0x04 → 1
三、示例
#include <stdio.h>
int main() {
int a = 5;
int b = 0;
int c = –3;
// 使用 !! 将非零值规范化为 1
int norm_a = !!a; // 5 -> 1
int norm_b = !!b; // 0 -> 0
int norm_c = !!c; // -3 -> 1
printf("原始值: a=%d, b=%d, c=%d\\n", a, b, c);
printf("规范化: a=%d, b=%d, c=%d\\n", norm_a, norm_b, norm_c);
return 0;
}
输出结果:
原始值: a=5, b=0, c=-3
规范化: a=1, b=0, c=1

代码说明:
- 第一次 ! 将非零值转为 0,零值转为 1
- 第二次 ! 反转结果,最终非零值输出 1,零值输出 0



