C语言面试题---逻辑短路问题
2017-12-22 09:39
211 查看
版本声明:本文转载于公众号TeachPlus
C语言面试题---逻辑短路问题
写出下面程序的输出
#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); return 0; }
本题答案
答案为1,2
本题解析
本题的考察重点在于逻辑运算符的短路问题。
在逻辑判断中,常常需要判断多个条件,如:
if A and B;
这时,当A为false时,无论B值是什什么,结果都为false,
所以可以不用判断B,直接跳过。这种情况称为逻辑短路路。
逻辑短路有许多应用,如
if(name != NULL && name.equals("admin")) { //do somethings }
这种情况下当name为null时,直接跳过判断name.equals("admin"),
如果没有短路路效应,后面是有可能报空指针异常的。
还有,满足某条件时执行函数
f != null && ff();
这样的语句,等价于
if (f != null)
{
f();
}
但是写法更更为简练。
所以,对于本题来说,因为使用的是逻辑或运算符,
因此只要两个条件中有一个为真,则整体为
真,计算的时候先计算m=ad不予计算,故该程序的输出为1,2
相关知识点
如果对上面的程序作出如下修改:
# 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
该题的迷惑性更为大一点,程序首先计算m=a>b的值,
因为a=4,b=6,所以a>b不成立,取值为0,
即m=0,整体表达式为假。因为使用的是逻辑与运算符,
必须两遍都为真,整体为真,所以当程序
判断一个条件为假的时候,则进行短路路操作,
第二个表达式不予就算,故该程序的整体输出为0,2.
接下来可以看一道更更为巧妙的面试题,这是微软的一道题目:
原题是:求 1 + 2 + 3 + … + n
要求:
不能用乘除法,
不能用if if, while, do_while, for, switch, case,
不能用(a < b ? a : b)三目运算符
答案应为
# include <stdio.h> int test( int n , int *sum) { n&& test(n-1,sum); return *sum += n; } int main() { int ret = 0; test(100,&ret); printf("%d\n",ret); return 0; }
如果没有那么多的限制的话,这是一道入门级的题目,但是正是因为有那么多的限制,
所以这道题目才变得有意思起来,这道题目主要考察两个方面,
一个是递归的使用,一个就是逻辑短路的使用了。
递归的使用是显而易见的,不再赘述,而对于逻辑短路来说,
用的就比较精妙了,大家可以看一下,作为参考。
相关文章推荐
- C语言(10)--逻辑短路问题、显示安装进度、Bessel函数、消除多余的空格
- 【我解C语言面试题系列】007 运算符优先级问题
- 关于C语言的逻辑短路
- c语言中的逻辑运算符都是短路运算符
- 面试题,逻辑题-坐飞机和坐车走路早到20分钟的问题
- 【C语言】【面试题】5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果问题
- C语言面试题-----耶稣问题
- 【C语言】【面试题】5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果问题
- 关于“短路逻辑”问题
- 逻辑&&和逻辑||的短路问题
- C语言逻辑运算短路(与运算、或运算)
- 黑马程序员_逻辑与和逻辑或的短路问题:
- 逻辑表达式短路求值问题
- 面试题,逻辑题-坐飞机和坐车走路早到20分钟的问题!
- 一道C语言面试题——邮票组合问题
- C语言实现单链表面试题--进阶(带环问题)
- 【我解C语言面试题系列】004 数组的循环右移问题
- c++ || && 逻辑短路问题
- 微软面试题--10个问题的逻辑推理题
- 一道C语言面试题printf输出问题,高手们都来看看吧