簡體   English   中英

運算符優先級在此程序中實際上如何工作?

[英]How does operator precedence actually work in this program?

#include<stdio.h>
int main()
{
        int i=-1, j=-1, k=-1, l=2, m;
        m = (i++ && j++ && k++) || (l++);
        printf("%d %d %d %d %d", i, j, k, l, m);
}

對於給定程序中的邏輯表達式的求值,運算符優先級的工作方式令人困惑。

變量m將根據其后面的邏輯表達式的值分配為01

將評估第一個括號,並且兩個AND運算的總結果為true或1 但是,由於使用了短路邏輯“或”,因此不會評估第二個括號。

因此,我的問題是,如果該表達式中括號比所有其他運算符具有更高的優先級,為什么不先對兩個括號都求值,然后再執行OR操作呢? 也就是說,為什么輸出0 0 0 2 1而不是0 0 0 3 1

編輯 :我所要問的與 (建議重復項)有所不同,因為我強調的是包圍OR運算符第二個操作數的括號。

存在歧義時,運算符優先級將生效。

在這種情況下,規格非常明確。

|| 如果運算符的兩個操作數都不等於0 ,則運算符將產生1 ; 否則,得出0 結果的類型為int

並且,( 重點是我的

不像按位| 運算符, || 運營商保證從左到右的評估; 如果對第二個操作數求值,則在第一個和第二個操作數的求值之間有一個序列點。 如果第一個操作數比較不等於0 ,則不計算第二個操作數。

就你而言

 (i++ && j++ && k++) || (l++);

(i++ && j++ && k++)是左操作數,而(l++); 是正確的操作數,其余的應該很清楚。 :)

運算符優先級(和關聯性)僅決定如何解析表達式。 將其與操作數的求值順序混淆是一個常見的錯誤,這是另一回事。 在此示例中,運算符優先級無關緊要。

對於大多數使用C的運算符,未指定操作數的求值順序。 你寫的true | l++嗎? true | l++然后l++將被執行。 “短路評估”是您的代碼中未發生這種情況的原因。 && || 運算符是一種特殊情況,因為它們明確定義了評估順序。 ||的右操作數 如果左操作數的計算結果為非零,則保證不會進行計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM