c语言&&和||的短路性质分析
2016-09-05 00:06
791 查看
今天看到微软的一道面试题,如下
原题是:求 1 + 2 + 3 + … + n
要求:不能用乘除法,不能用if,while, switch,case, 不能用(a < b ? a : b)三目运算符
这道题主要考察了&&运算的短路性质以及递归
答案如下:
递归很容易看出,但是&&的短路性质运用的很细节。所以我就短路性质,做了一些整理:
假如expr1和expr2都是表达式,并且expr1的值为0,在下面这个逻辑表达式的求值过程中:
expr1 && expr2
若是expr1确定为假,expr2将不会进行求值,因为整个逻辑表达式的值已经可以确定为0。
类似地,如果expr1的值不是0,expr2会进行求值。
expr1 || expr2
若是expr1为真,expr2将不会进行求值,因为整个逻辑表达式的值已经确定为1。
反之,expr2将进行求值。
例题:
||逻辑短路
输出的结果为1,2.
因为a
输出的结果为0,2。
因为a>b为0,m=0,整个“与”逻辑判断就为“假”,所以后面的“c>d”就被短路掉了,所以n还是等于原先的2
总结:“或”逻辑前面为1,“与”逻辑前面为0就会发生短路
原题是:求 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语言】要求找出具有下列性质的数的个数(包含输入的自然数n): 先输入一个自然数n(n<=500),然后对此自然数按照如下方法进行处理:
- C语言:内存地址分析 & sizeof和strlen用法总结
- C语言的词法语法分析lex&yacc 经典收藏
- C语言中char*和char[]用法区别分析&微软编译器的坑
- 关于AT&T汇编和c语言的相互调用的分析
- C语言中的static 详细分析 & C++中的static关键字的总结
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- C语言测试题的讲解分析
- "陷阱"技术探秘──动态汉化Windows技术的分析
- 【转】C语言测试题的讲解分析
- C语言中字符数组和字符串指针分析
- Hying's PeLock v0.7x 外壳完全分析篇
- C语言测试题的讲解分析
- "新 CIH" 病毒的部分反汇编分析
- C语言测试题的讲解分析
- 绝对能够测试你的C语言功力的几个问题及其讲解分析
- Hying's arm v0.7x外壳分析(上)
- 关于"建立空文档失败"的问题的分析!(转载)
- baidu & google maps 分析
- 使用TC调试c语言的时候运行时出现“unable to open input file 'cos.obj'