欢迎光临
我们一直在努力

女朋友C代码中出现“!!”,把人看蒙了!

女朋友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);:

  • GPIOA_Data & PIN_2 执行按位与操作,结果是一个整数值。
  • !! 将整数值转换为标准的布尔值 0 或 1,确保 level 只能是 0 或 1。
  • 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
  • 适用于需要将任意整数明确转换为布尔值(0/1)的场景,如状态标志处理或位操作简化
  • 赞(0)
    未经允许不得转载:171主机测评 » 女朋友C代码中出现“!!”,把人看蒙了!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址