邏輯運算符及其優先級,C語言邏輯運算符及其優先級詳解


C 語言提供了以下三種邏輯運算符。

  1.  一元:!(邏輯非)。
  2.  二元:&&(邏輯與)、||(邏輯或)。


以上三種邏輯運算符中,邏輯非 ! 的優先級最高,邏輯與 && 次之,邏輯或  ||  優先級最低。即算術、邏輯、賦值運算符的優先級順序為:

邏輯非 ! >算術 > 邏輯與 &&、邏輯或 || > 賦值=

邏輯表達式的值為邏輯值,即布爾型(bool),該類型為 C99 新增的,一些編譯器可能還不支持該類型。

邏輯值分為邏輯真值和邏輯假值。一般情況下,在判斷時,僅有零值被判斷為邏輯假值(false),一切非零值均可被判斷為邏輯真值(true);在存儲和表示時,通常,使用 1 表示邏輯真值,0表示邏輯假值。

邏輯與 && 運算符的運算規則:只有兩個操作數均為邏輯真時,結果才為真。其余情況,結果均為假。

邏輯或 || 運算符的運算規則:只有兩個操作數均為邏輯假時,結果才為假。其余情況,結果均為真。

例如,設有定義語句

  1. int a=3,b=5;

則有:

  • !a:由於 a 非零,為真,!a 為假,其值為 0。
  • a||b:由於 a 和 b 均非零,均為真,故邏輯或的結果為真,其值為 1。
  • a&&b:由於 a 和 b 均非零,均為真,故邏輯與的結果為真,其值為 1。
  • !a||b&&2:由於邏輯非 ! 優先級最高,首先與 a 結合,而 && 優先級高於 ||,相當於(!a)||(b&&2), 即 0||1 為真,其值為 1。


邏輯與 &&、邏輯或 || 均有“短路”特性:

  • 邏輯與&&“短路”:當邏輯與&&的左操作數為邏輯假時,就足以判斷該邏輯運算的結果為假了,故右操作數就不再被執行。
  • 邏輯或||“短路”:當邏輯或||的左操作數為邏輯真時,就足以判斷該邏輯運算的結果為真了,故右操作數就不再被執行。


例如:

  1. int a=1,b=2,c;
  2. c=a||++b;
  3. printf("a=%d,b=%d,c=%d\n",a,b,c);

由於 a 為非零值,即為真,而當邏輯或 || 的左操作數為真時,就足以判斷該邏輯操作的結果為真。故發生“短路”,即右操作數 ++b 不被執行。輸出結果為:a=1,b=2,c=1。

分析以下程序,輸出其運行結果。

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a=0,b=2,c;
  5. c=!a||++b&&a--;
  6. printf("a=%d,b=%d,c=%d\n",a,b,c);
  7. return 0;
  8. }

代碼分析:
混合表達式 c=!a||++b&&a-- 中含有的運算符有邏輯非 !、邏輯或 ||、邏輯與 &&、算術前綴 ++、算術后綴 --、賦值號 = 等6個運算符。邏輯運算符、算術運算符、賦值運算符的優先級的關系為:

邏輯非! > 算術 > 邏輯與&&、邏輯或 || > 賦值 =

由於該表達式中賦值運算符優先級最低,故最后賦值。

根據優先級的高低,表達式 !a||++b&&a-- 等價於 (!a)||((++b)&&(a--)),而邏輯或 || 的左操作數 !a 為真,此時足以判斷該表達式的值為真。故發生“短路”,即 || 的整個右操作數 ((++b)&&(a--)) 不再被執行。

運行結果為:
a=0,b=2,c=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM