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;
}
如果沒有那么多的限制的話,這是一道入門級的題目,但是正是因為有那么多的限制,
所以這道題目才變得有意思起來,這道題目主要考察兩個方面,
一個是遞歸的使用,一個就是邏輯短路的使用了。
遞歸的使用是顯而易見的,不再贅述,而對于邏輯短路來說,
用的就比較精妙了,大家可以看一下,作為參考。
總結
以上是生活随笔為你收集整理的c语言解逻辑问题的一般步骤,C语言面试题---逻辑短路问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言归并排序代码详细注释,C语言实现排
- 下一篇: c语言计算输入的字母数字个数字,请问这个