簡體   English   中英

關於 C 中運算符優先級的問題

[英]Question regarding operator precedence in C

我開始學習在 c 中編程,我以為我已經對運算符的優先級很有信心,直到我這樣做了:

a > b ? c = a : (c = b);

當然,第一次我沒有在最后一句話上使用括號,但由於這最終導致了編譯問題,我在這個論壇上搜索了如何解決這個問題,我讀到添加括號可以完成這項工作。 但是,我認為括號內的表達式會在同一行中的其他任何內容之前執行,這意味着先執行c = b語句,然后執行三元運算符。 我做了一些類似但更容易閱讀的事情,以便更好地了解這個運算符優先級發生了什么,並嘗試執行這一行:

printf("Number is %d", i) + (i = 5);

我知道這個表達式返回一個值,但是因為我不需要它,而且這不是我將保留超過 5 秒的行,所以我不會將它存儲在任何變量中。 在這種情況下,引起我注意的是,當我執行代碼時,我並沒有以值 5 顯示在屏幕上,而是使用以前的值,這意味着計算機只是從左到右讀取它正確的。 當我做:

(i = 5) + printf(Numer is %d, i);

它首先進行 i 的分配,然后才執行 printf function 。 我的問題是:計算機如何執行使用不同優先順序的運算符的表達式? 它顯然不會首先運行具有最高優先級的運算符,因為在第一個 printf 中,存儲的值不是分配在括號中的值,但它也不只是從左到右讀取,因為在這種情況下會有沒有運算符優先級。 它是如何工作的?

括號和運算符優先級僅指示操作數的分組方式。 它不規定評估的順序

在這個表達式中:

a > b ? c = a : (c = b);

三元運算符的三個部分分別是a > bc = ac = b 該運算符還具有根據第一個子句的結果僅評估第二個和第三個子句中的一個的屬性。 從形式上講,在第一個子句的評估與第二個或第三個子句的評估之間存在一個順序點 所以首先評估a > b 如果它不為零,則評估 c = c = a ,否則評估c = b

在這個表達式中:

printf("Number is %d", i) + (i = 5); 

沒有什么可以決定是否首先評估printf("Number is %d", i)i = 5 與三元運算符不同, +運算符的操作數的求值之間沒有序列點。 這個表達式也有一個問題: i在沒有序列點的同一個表達式中被讀取和寫入。 這樣做會觸發未定義的行為 這也適用於:

(i = 5) + printf(Numer is %d, i);

順便說一句,這是:

a > b ? c = a : (c = b);

可以更清楚地寫成:

c = a > b ? a : b;

暫無
暫無

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

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