“&&”和“||”的短路特性与简单分支语句、三目运算符与简单分支语句


在C语言中,逻辑与和逻辑或是常常使用的逻辑运算符,下面来讨论一下它们的短路特性。


(表达式1) && (表达式2)
大家都知道,对于逻辑与 “&&” 来说,只有当其两端均为逻辑真时,结果才是真,那么,它是如何判断为假呢?在书本上给出的是这样的:
False && True 为 False
True && False 为 False
False && False 为 False
可以知道,对于人类来说,判断真假的方法是:只要有一端是False,结果就是False。但是,计算机是如何判断逻辑运算的结果呢?在计算机中,会优先判断表达式1的结果,当其结果为True时,再去判断表达式2的结果。但是,如果表达式1的结果判断为False时,已经可以判断逻辑运算结果是False了,计算机是不会再去判断表达式2的。这就是我们所说的短路特性。
(表达式1) || (表达式2)
对于逻辑或 “||” 来说,当表达式1为True时,已经可以判断逻辑运算结果是True,自然也不会判断表达式2。


那么如何在C语言编程中利用 && 和 || 的短路特性去简化代码呢?请看下面的列子:

int i=0;
if(0==i)
{
	printf("hello world\n");
}
else
{
	printf("bye, world\n");
}

其实这里可以写成这样:

int i=0;
i==0 && printf("hello world\n") || printf("bye, world\n");

这样就可以简化代码了。这里要记住,&& 的优先级大于 || 的优先级,所以其实是:

(i==0 && printf("hello world\n")) || printf("bye, world\n");

如去分析上式呢?我们先要明确一点,printf()这个函数是有返回值的,它返回的是打印在屏幕上的字符的个数。
这样的话,判断时从左向右开始,(i == 0)为True,&& 的右端会继续判断,printf(“hello world\n”)执行结束后返回一个大于0的值,即返回为True,那么,(i==0 && printf(“hello world\n”))的结果是True,这样 || 右边的表达式就不会执行,即输出“hello world”。那么,同样的道理,将 i 的值改为非0的数,上式将执行输出“bye, world”。看到这里可以发现,&& 和 || 能够实现简单的分支语句,能够达到简化代码的作用。


三目运算符((表达式1) ? (表达式2) : (表达式3))
同样的,三目运算符也能实现简单的分支语句。
我们看下面的代码:

int i=0;
i==0 ? printf("hello world\n") : printf("bye, world\n");

这里实现了和上面相同的功能,但是这里使用的是三目运算符,i==0 为True则输出“hello world”,否则输出“bye, world”。


但是,新的问题出现了,如果随意使用逻辑或、逻辑与、三目运算符,是很有可能会出错的,因为在它们中,是不能够使用跳转语句的(break, continue, goto, return)。下面来结合一个具体的案例来进行说明(例子可能不是很好…)。

//判断一个数是不是素数。
int is_prime(int num)
{
	if(num <= 1)
	{
		return 0;	//素数必须大于1
	}
	for(int i=2; i<=sqrt(num); i++)
	{
		if(num%i == 0)
		{
			return 0;
		}
	}
	return 1;
}

这里如何用前面所说的简化代码呢?可能会有人写成下面的样子。

int is_prime(int num)
{
	num<=1 && return 0;	//素数必须大于1
	for(int i=2; i<=sqrt(num); i++)
	{
		num%i==0 && return 0;
	}
	return 1;
}

但是前面已经说了,不能在 &&、|| 和三目运算符中使用跳转语句,所以上面的写法会报错。可以使用下面的方法。

int is_prime(int num)
{
	int flag=1;
	num<=1 && (flag=0);	//素数必须大于1,"="的优先级很低,要用()括起来。
	for(int i=2; i<=sqrt(num) && flag; i++)//如果不是素数,flag可以减少循环次数。
	{
		!(num%i) && (flag=0);
	}
	return flag;
}

好了,这就是今天想讲的,以前虽然知道短路特性和三目运算符,但是从来没有想过用它们来简化代码,一点一点积累吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值