c语言解逻辑问题的一般步骤,C语言面试题---逻辑短路问题

版权声明:本文转载于公众号TeachPlus---C语言面试题---逻辑短路问题

写出下面程序的输出

#include 

int main()

{

int a=5,b=6,c=7,d=8,m=2,n=2;

(m=ad);

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 

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 

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;

}

如果没有那么多的限制的话,这是一道入门级的题目,但是正是因为有那么多的限制,

所以这道题目才变得有意思起来,这道题目主要考察两个方面,

一个是递归的使用,一个就是逻辑短路的使用了。

递归的使用是显而易见的,不再赘述,而对于逻辑短路来说,

用的就比较精妙了,大家可以看一下,作为参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值