C语言中的逻辑操作符&&和||

文章介绍了C语言中的逻辑与(&&),逻辑或(||)运算符的用法。逻辑与要求两边条件均真才为真,而逻辑或只需一边为真即为真。在使用中,如果已知某条件为真或假,可以避免后续表达式的计算。文章还给出了代码示例,解释了运算符的执行顺序和效率考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先:

"&&"是逻辑与运算符。它用于将两个条件进行逻辑与操作,只有当两个条件都为真时,整个表达式才为真。需要保证多个事件同时为真,才能达到目的。逻辑类似于串联电路。

"||"是逻辑或运算符。它用于将两个条件进行逻辑或操作,只要其中一个条件为真,整个表达式就为真。只需要保证一个事件为真,就能达到目的。

使用场景:

||:可以看到即使b不等于30仍不影响结果

 &&:当b不等于30时,影响结果改变

 

 运用环境:

如下代码,结果为haha

因为在C语言中代码总是从左到右执行,故先判断a是否小于c,若属实则返回TRUE对应的值为1

再将1和b比较,1<20,故打印haha

 在C语言中不能将多个表达式直接判断,可以将其表达式分开,采用&&或||按照需求来写代码

注意:

当有多个表达式相互||

例如 a || b ||c

若确定a为非0,则表达式b和c不会执行

当有多个表达式相互&&

例如 a && b && c

若确定a为0,则表达式b和c不会执行

### C语言逻辑或运算符 `||` 按位运算符 `&` 的区别 #### 定义功能 逻辑或运算符 `||` 是一种逻辑操作符,用于对布尔表达式进行求值。如果任意一个操作数为真,则结果为真;仅当两个操作数均为假时,结果才为假[^1]。 而按位运算符 `&` 则是一种按位操作符,它逐位比较两个整数值的二进制表示形式中的每一位。只有当对应位置上的两位都为 1 时,结果该位才是 1,否则为 0[^2]。 --- #### 数据类型支持 逻辑或运算符 `||` 主要作用于布尔类型的表达式,尽管在 C 中并没有显式的布尔类型(直到 C99 引入 `_Bool` 类型),但它实际上处理的是任何可以被解释为真假值的数据类型。通常情况下,非零值会被视为真,零值被视为假[^3]。 相比之下,按位运算符 `&` 可以应用于所有的整数数据类型,并且其操作基于这些整数的二进制表示形式。这意味着它的应用范围更广,不仅限于简单的真假判断。 --- #### 计算方式 对于逻辑或运算符 `||` 来说,在计算过程中存在短路特性(short-circuit evaluation),即一旦左侧的操作数已经能够决定最终的结果,右侧的操作数就不会再被执行。例如: ```c int x = 5; if ((x > 0) || some_function()) { printf("Condition is true\n"); } ``` 在此例中,由于 `(x > 0)` 已经成立,因此无论 `some_function()` 返回什么值都不会影响整体条件的结果,所以不会调用 `some_function()` 函数。 然而,按位运算符 `&` 并不具备这种短路行为。它总是会完全评估两侧的操作数后再得出结果。比如下面的例子展示了如何通过按位来提取特定比特的信息: ```c unsigned char byte_value = 0b01010101; bool fourth_bit_set = (byte_value & 0b00001000) != 0; // 结果为 false ``` 这里即使左边部分已知某些情况也不会跳过右边的部分。 --- #### 使用场景 - **逻辑或 (`||`)** 常见的应用是在控制流结构中作为复合条件的一部分,用来连接多个测试条件以便简化代码逻辑或者提高可读性。例如验证输入参数的有效性时可能会这样写: ```c void process_input(int input){ if(input < MIN_VALUE || input > MAX_VALUE ){ fprintf(stderr,"Invalid Input!\n"); exit(EXIT_FAILURE); } } ``` - **按位 (`&`)** 更多时候是用来实现低级别的硬件编程或者是优化算法性能等方面的任务。例如设置/清除标志位、掩码操作等都非常适合采用这种方式完成。如下所示是如何利用按位检测某个具体的位置是否开启的一个简单实例: ```c #define FLAG_ONE 0x01 unsigned flags = 0; void set_flag(){ flags |= FLAG_ONE; } bool check_flag_one_is_set(){ return !!(flags & FLAG_ONE); } ``` --- #### 性能考量 一般来说,因为涉及函数调用或者其他复杂计算的原因,使用带有副作用(如修改全局变量状态或是触发其他动作)的表达式配合逻辑运算符可能带来不可预期的行为变化。而对于纯粹数学意义上的按位运算来说,它们往往更加高效稳定,尤其是在嵌入式开发领域更是如此。 --- ### 示例对比 为了更好地理解两者的差异,考虑以下代码片段: ```c #include <stdio.h> void func() { puts("Function called!"); } int main(void){ int a=0,b=-1,c=7,d=8,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z; e=(a|b)?printf("%d ",e):puts(""); /* Prints "-1" */ f=a||func(); /* Calls function and prints message */ g=c&d?printf("%d ",g):puts(""); /* No output since 'g' remains uninitialized*/ h=c&&func(); /* Does not call the function*/ k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=0; i=k|(l|m)&~n^o?p:q; /* Complex bitwise expression evaluated strictly from left to right without short circuiting.*/ j=k||(l&&m)||!n&&!o?q:p; /* Logical ORs with potential side effects due to its lazy evaluation strategy.*/ return 0; } ``` 上述例子清晰地展现了两者不同的工作机制以及由此引发的各种可能性后果. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值