C語言面試題 邏輯短路問題

2021-08-13 21:49:36 字數 1360 閱讀 3713

寫出下面程式的輸出

#includeint main()

本題答案

答案為1,2本題的考察重點在於邏輯運算子的短路問題。

在邏輯判斷中,常常需要判斷多個條件,如:

if a and b;

這時,當a為false時,無論b值是什什麼,結果都為false,

所以可以不用判斷b,直接跳過。這種情況稱為邏輯短路路。

邏輯短路有許多應用,如

if(name != null && name.equals("admin"))

這種情況下當name為null時,直接跳過判斷name.equals("admin"),

如果沒有短路路效應,後面是有可能報空指標異常的。

還有,滿足某條件時執行函式

f != null && ff();

這樣的語句,等價於

if  (f != null)

但是寫法更更為簡練。

所以,對於本題來說,因為使用的是邏輯或運算子,

因此只要兩個條件中有乙個為真,則整體為

真,計算的時候先計算m=ad不予計算,故該程式的輸出為1,2

如果對上面的程式作出如下修改:

# include int  main()

則輸出值為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)

int main()

如果沒有那麼多的限制的話,這是一道入門級的題目,但是正是因為有那麼多的限制,

所以這道題目才變得有意思起來,這道題目主要考察兩個方面,

乙個是遞迴的使用,乙個就是邏輯短路的使用了。

遞迴的使用是顯而易見的,不再贅述,而對於邏輯短路來說,

邏輯面試題

1 有兩個桶,乙個能盛5公升水,乙個能盛3公升水,如何用測量出4公升水?2 編寫程式求解 1 2 3 4 5 n 3 20個球,其中乙個比其它的重一點,請用最快的方式找它出來。4 27個運動員在參加完比賽後,口渴難耐,去小店買飲料,飲料店搞 憑三個空瓶可以再換一瓶,他們最買多少瓶飲料才能保證一人一瓶...

C語言面試題 耶穌問題

耶穌有13個門徒,其中有乙個就是出賣耶穌的叛徒,請用排除法找出這位叛徒 13人圍坐一圈,從第乙個開始報號 1,2,3,1,2,3.凡是報到 3 就退出圈子,最後留在圈子內的人就是出賣耶穌的叛徒。請找出它原來的序號。解題思路 1 如何表示13個人?通過陣列表示,有13個元素,賦初值是,可以賦值為1 1...

C語言面試題

基礎篇 1 區域性變數能否和全域性變數重名?可以2 如何引用乙個已經定義過的全域性變數?直接呼叫並初始化 3 全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?可以,6 堆和棧有什麼區別?7 什麼是預編譯,何時需要預編譯 8 c和c 中的struct有什麼不同?9 memset me...