您的位置:首页 > 编程语言 > C语言/C++

c语言&&和||的短路性质分析

2016-09-05 00:06 791 查看
今天看到微软的一道面试题,如下

原题是:求 1 + 2 + 3 + … + n

要求:不能用乘除法,不能用if,while, switch,case, 不能用(a < b ? a : b)三目运算符

这道题主要考察了&&运算的短路性质以及递归

答案如下:

int foo(int n, int *sum)
{
int ret;
ret = n&&fun3(n-1, sum);  //n=0时,递归结束,返回结果
return (*sum += n);
}


递归很容易看出,但是&&的短路性质运用的很细节。所以我就短路性质,做了一些整理:

假如expr1和expr2都是表达式,并且expr1的值为0,在下面这个逻辑表达式的求值过程中:

expr1 && expr2

若是expr1确定为假,expr2将不会进行求值,因为整个逻辑表达式的值已经可以确定为0。

类似地,如果expr1的值不是0,expr2会进行求值。

expr1 || expr2

若是expr1为真,expr2将不会进行求值,因为整个逻辑表达式的值已经确定为1。

反之,expr2将进行求值。

例题:

||逻辑短路

#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a<b)||(n=c>d);
printf("%d\t%d",m,n);
}


输出的结果为1,2.

因为a

#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a>b)&&(n=c>d);
printf("%d\t%d",m,n);
}


输出的结果为0,2。

因为a>b为0,m=0,整个“与”逻辑判断就为“假”,所以后面的“c>d”就被短路掉了,所以n还是等于原先的2

总结:“或”逻辑前面为1,“与”逻辑前面为0就会发生短路
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言