C語言中短路求值問題

2021-10-14 06:15:51 字數 2007 閱讀 5878

以下表示式就是短路現象的其中一種

x & y & z;
如果x為假,直接返回假;若x為真,則執行y;只有x和y都為真才執行z。我們來看以下**,求想x, y, z和b的值。

#include

#include

intmain()

這裡我們執行到bool b = x++ && ++y && ++z;這條語句時,編譯器會先執行x++,因為x++是後置++,得等到整條語句執行完x的值才+1。此時x = 0,為假,b為false,此時b已經得出結構,根據短路現象可知,所以後面的++y 和++ z都不會執行。整條語句執行完了,x = x+1。

執行結果截圖:

以下表示式就是短路現象的其中一種

x || y || z;
當x為真時,不會執行y和z;當x為假時才執行y;當x和y都為假時,才執行z。我們來看以下**,求想x, y, z和b的值。

#include

#include

intmain()

這裡我們執行到bool b = x++ && ++y && ++z;這條語句時,編譯器會先執行x++,因為x++是後置++,得等到整條語句執行完x的值才+1。此時x = 0,為假。繼續執行第二個判斷++y,++y是前置++,所以此時的y = 2,不等於0,條件為真,b = true,根據短路現象可知,++z;這條語句不會被執行。x = x + 1 = 2。

執行結果截圖:

短路求值的方法我們還是比較常見的,下面我們再做一道題來加深對短路的理解

題目

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(a?b:c)。

示例 1

輸入: n = 3

輸出: 6

示例 2

輸入: n = 9

輸出: 45

函式介面

int sumnums(int n);

解題思路

這道題的解題方法當然有很多種,這道題既然放到這裡,我們就用所講的短路求值的方法做,我們可以利用遞迴,只要求sumnums(n - 1) + n的值就行,一直遞迴下去,但是遞迴必須有結束條件,而判斷結束條件的往往是if、else語句,但是題目有要求,我們當然不可以使用,那麼就可以用到短路求值的方法。n && (n+=sumnums(n - 1));當n為真時,也就是非0時,就呼叫遞迴,當n為假,也就是值為0時,就不呼叫後面的遞迴。最後累加求值。

後面就省略了…

大家可以自行上機除錯

C語言中的短路現象

比如有以下表示式 a b c只有a為真 非0 才需要判斷b的值 只有a和b都為真,才需要判斷c的值。求最終a b c d的值。main 因為a 是先判斷a的值再自加,而a初始值為0,所以 a 為假,由短路現象可知 後面式子b 和 c就都不會執行 對於賦值語句,是先將a的值賦值給d,然後再自加,所以d...

C 語言 邏輯運算和短路求值

運算子含義 優先順序 邏輯非高 邏輯與中 邏輯或低 舉例 a 如果 a 為真,a 為假 如果 a 為 假,a 為真 a b a 和 b 同時為真,結果才為真 a 和 b 有乙個為假,結果就為假 a b a 和 b 有乙個為真或 a 和 b 全為真,結果就為真 a 和 b 全為假,結果才為假 用邏輯運...

C語言中union REGS問題

c語言中union regs問題 2009 5 19 22 45 提問者 xac210 瀏覽次數 1945次 在c語言中,union regs結構體是怎麼定義的,還有它一般是用在哪方面問題上的。希望大家能給我點詳細的介紹.謝謝!我來幫他解答 檢舉 2009 5 20 02 18 滿意回答 vc 沒有...