你知道C语言中的与或非运算吗?

C语言中的与或非运算究竟有何妙用?

在C语言中,与、或、非运算分为逻辑运算和按位运算两类,它们通过简洁的语法实现复杂的条件与数据操作,是底层开发与高效编程的核心工具。

逻辑与&&、逻辑或||、逻辑非!主要用于条件判断。逻辑与具有短路特性:当左侧表达式为假时,右侧表达式不再执行。这一特性常用来避免效计算或错误访问,例如判断指针是否有效后再读取成员:`if (ptr && ptr->value > 10) { ... }`,若ptr为空,右侧的`ptr->value`便不会执行,防止程序崩溃。逻辑或则相反,左侧为真时直接返回真,适合处理默认值场景:`int len = input_len || DEFAULT_LEN;`,当input_len为0假时,自动使用DEFAULT_LEN。逻辑非!将非0值转为0,0转为1,常用于明确条件:`while (!is_complete()) { ... }`,用!将函数返回的非0“未成”状态转为循环条件所需的1。

按位与&、按位或|、按位非~则直接操作数据的二进制位,是硬件与状态管理的利器。按位与可提取特定位,比如从16位数据0x3F8A中提取高8位,只需与0xFF00按位与:`0x3F8A & 0xFF00 = 0x3F00`。在嵌入式开发中,它还用于清除标志位,若寄存器REG的第3位需置0,可执行`REG &= ~(1 << 3)`,先用`1 << 3`定位第3位,按位非~将该位转为0、其余为1,再按位与保留其他位不变。

按位或|的核心作用是设置标志位。定义状态变量stat后,要开启第5位功能,直接执行`stat |= (1 << 5)`,论原第5位是否为1,操作后必为1。例如文件权限中,`mode |= S_IRUSR`可确保拥有读权限。它还能合并多个状态,如`FLAGS = FLAG_A | FLAG_B | FLAG_C`,一次性设置A、B、C三种状态。

按位非~是逐位取反操作,0变1、1变0。对8位数据0x0500000101取反得0xFA11111010,常用于生成掩码。比如要将整数x的低4位保留、高4位取反,可结合按位与和按位非:`x = (x & 0x0F) | (~x & 0xF0)`,用`0x0F`保留低4位,`~x & 0xF0`取反高4位后合并。

论是逻辑运算的条件优化,还是按位运算的二进制操控,与或非运算通过对“真/假”“0/1”的精准,让C语言能高效处理从上层逻辑到底层硬件的各类需求。它们的简洁性与功能性,使其成为C语言“贴近机器”特性的经典体现。

延伸阅读: