[英]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
將根據其后面的邏輯表達式的值分配為0
或1
。
將評估第一個括號,並且兩個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.