复习c语言深度剖析(15)—逻辑运算符分析

1. 有趣问题

逻辑运算符&&,||和!真的很简单吗?
#include <stdio.h>

int main()
{
int i = 0;
int j = 0;
int k = 0;

// 等价于(true && ++i) ||(++j && ++k)可见整个表达式为或运算,从左向右进行
// 或运算,先计算或左边的(true && ++i)结果为true,根据“或”的短路规则,不再
// 进行右边的(++j && ++k)。
++i || ++j && ++k;

printf("%d\n", i); // i为1
printf("%d\n", j); // 0
printf("%d\n", k); / 0

return 0;

}
2. 程序中的短路

||从左向右开始计算
当遇到为真的条件时停止运算,整个表达式为真
所有条件为假时表达式才为假
&&从左向右开始计算
当遇到为假的条件时停止运算,整个表达式为假
所有条件为真时表达式才为真
3. 逻辑表达式中,&&比||具有更高的优先级

在&&和||混合运算时,整个表达式被看作||表达式,编译器从左向右开始计算&&表达式,当某个&&表达式的值为真时,停止计算,整个表达式的值为真。
4.编程实验

程序中的短路规则
#include <stdio.h>
#include <stdlib.h>

int g = 0;

int f()
{
printf(“In f()…\n”);

return g++;

}

int main()
{
// 等价(true && g) || (f() && f())
// 或的左边为false,继续计算右边的(f() && ())
// 所以先输出f中的printf语句,由于第1个f返加0
// 而或右边的表达式是“与”运算,所以短路,即右
// 则表达式返回false,整个表达式为false。下列的
// if语句中的printf不被执行。
if (g || f() && f())
{
printf(“In if statement: %d\n”, g);
}

printf("In main(): %d\n", g);

system("pause");

return 0;

}

//输出结果
// In f()…
// In main(): 1
5. “!”究竟是神马

逻辑非运算符的使用
#include <stdio.h>

int main()
{
printf("%d\n", !0); // 1
printf("%d\n", !1); // 0
printf("%d\n", !100); // 0
printf("%d\n", !-1000); // 0

return 0;

}
C语言中的逻辑非“!”只认得0,只知道见了0就返回1。当碰见其它值时,返回0。
6. 小结

程序中的逻辑表达式遵循短路规则
在&&与||混合运算时
整个表达式被看作||表达式;
从左向右计算&&表达式;
最后计算||表达式
逻辑非!运算符只认得0。碰见0返回1,否则统统返回0。(只有0才表示假,其余均为真)
————————————————
版权声明:本文为CSDN博主「小虾米_2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22847457/article/details/98737572

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值