運算子求值順序

2021-07-10 09:50:15 字數 2697 閱讀 1799

&&與||兩個運算子的求值順序是非常重要的,因為很多判斷語句都是基於它們擁有一定的求值順序才能正確進行的。

eg:

if((num1 != 0) && (num2 / num1 \ > num2 - num1))

上面的if()判斷語句合理的運用了&&運算子,使之不會出現0做除數的情況(num1 = 0時),因為&&運算子的求值順序是從左到右的,且它有乙個特性,就是當左邊的值為假時,就不用再求右邊的值了 —->> &&:與運算子,同真為真,一假為假。

||運算子的規則與&&很相似,求值順序也是從左到右,且它有乙個特性是,當左邊的值為真時,就不必再求右邊的值了—->>||:或運算子,一真為真,同假為假。

ps:這裡穿插一下&& || !與& | ~的區別

前面三個叫邏輯運算子,後面三個叫按位運算子,&& || & | 四個運算子是需要兩個運算元的,!和~是只需要乙個運算子的。

&&:當左邊的運算元為假時,右邊的運算元就不再求值了,因為&&運算子要求要兩個運算元都為真時表示式才為真,否則就為假。

||:當左邊的運算元為真時,右邊的運算元就不再求值了,因為||運算子要求要兩個運算元有乙個為真時表示式就為真,否則才為假。

&和|都要求必須對兩個運算元都求值,否則無法計算表示式的結果。

#include

int main()

printf("%d\n", num1);

system("pause");

return

0;}

#include

int main()

printf("%d\n", num1);

system("pause");

return

0;}

所以上面的兩段**都不會因為num = 0時,num2會除 0 而報錯,盡量兩段**的輸出是不相同的。

#include

int main()

上面這段**的輸出值為

,這就驗證了逗號運算子的結果是最右邊的值,特別要注意,函式引數之間的分隔符,並不是逗號表示式,它就是乙個分隔符。

因為其它運算子是沒有求值順序的,所以不能自己臆想它們的求值順序來方便自己的程式設計

#include

int main()

; int i = 0;

for (i = 0; i < sizeof(arr) / sizeof(arr[0]);)

for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)

system("pause");

return

0;}

#include

int main()

; int i = 0;

for (i = 0; i < sizeof(arr) / sizeof(arr[0]);)

for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)

system("pause");

return

0;}

上面兩段**儘管都能輸出想要的結果,但是它的邏輯卻是不嚴謹的,因為arr[i] = i++和arr[i++] = i這兩個語句有漏洞。那arr[i] = i++來說,賦值運算子(=)的求值順序是不確定的,那麼不知道是先算i++,然後arr[i]中的i是進入迴圈時的i自增之後的值,還是先確定arr[i]中i的值就是進入迴圈時i的值,然後再進行i++操作。

基於這種不確定性,這兩段**都不是正確的**。

可以改為

#include

int main()

; int i = 0;

for (i = 0; i < sizeof(arr) / sizeof(arr[0]);)

for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)

system("pause");

return

0;}

或者

#include

int main()

; int i = 0;

for (i = 0; i < sizeof(arr) / sizeof(arr[0]);i++)

for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)

system("pause");

return

0;}

最後介紹c語言裡的唯一一種三目運算子 —->> ?:

用乙個例項來說明:

a = 10;

b = 20;

int num = a > b ? a : b;

三目運算子的規則是,先求a > b 成立的話,num = a。不成立的話,num = b。

但是,當上述 a = b時該怎麼解決呢?

#include 

int main()

輸出為30,可以看出當三目運算子比較的兩個資料時相同的時,三目運算子所組成的表示式的最終值是」:」後面的資料的值

,四個運算子的求值順序

c語言中只有四個運算子 存在規定的求值順序。運算子 和運算子 首先對左側運算元求值,只在需要時才對右側運算元求值。運算子?有三個運算元 在a?b c中,運算元a首先被求值,根據a的值再求操作 數b或c的值。逗號運算子,首先對左側運算元求值,然後該值被 丟棄 再對右側運算元求值。注 分割函式引數的逗號...

運算子短路求值原理

運算子有乙個短路求值原理,比如a b,如果出現在條件判斷語句中,我們理解的就是a和b都要是true才能完成判斷,實際執行過程中,計算機先判斷a是否為真,若a為真再判斷b是否為真,但若a為假,則後面不會再看b的真假,也就是說如果b為乙個表示式,則不會執行這個表示式,這就是短路求值原理,舉例如下 實現求...

C 運算子順序

優先順序 運算子含義 結合方向1 域運算子 左 右2 括號,函式呼叫左 右 陣列下標運算子 指向成員運算子 成員運算子 自增運算子 後置 自減運算子 後置 3 自增運算子 前置 右 左 自減運算子 前置 按位取反運算子 邏輯非運算子 負號運算子 正號運算子 指標運算子 取位址運算子 型別 型別轉換運...