[英]Precedence of the arrow operator and post increment?
C 的新功能。 所以我看到了這行代碼
system->word[system->index++] = system->next_char;
是否等同於:
system->word[system->index] = system->next_char;
index++;
職位增量的優先級是什么? 在線上的所有操作都執行完成后,它是否只將索引的值增加 1?
更新system->index
被定義為未排序(未指定在語句中的其他操作之前或之后)的副作用。 更新可能發生在其他操作之前、期間或之后。
只要它沒有在語句的其他地方使用,它沒有排序的事實就無關緊要,因為如果它沒有在其他地方使用,那么語句所做的任何事情都不會受到更新發生時的影響。 (注意,即使 memory 中的system->index
的更新在使用該值之前完成,編譯器也會響應確保使用更新前的值。)
如果正在更新的 object 在語句的其他地方以無順序的方式使用(即,沒有規則指定先更新還是其他使用),則程序的行為將不會由 C 標准定義。
這不是優先級的結果。 優先級決定了如何解釋表達式的結構,而不是它們操作的順序。
不是。
system->word[system->index++] = system->next_char;
相當於:
system->word[system->index] = system->next_char;
system->index++;
因為index
是system
指向的struct
上的一個字段。 如果您還有一個名為index
的標量變量,則您沒有錯誤,但應該增加錯誤的變量。
作為一般規則,所有一元運算符首先在變量的右側進行計算,然后是左側的運算符(右側運算符的優先級高於左側運算符)並從最接近操作數到最遠進行計算。 所以最靠近操作數的運算符首先計算,然后是右邊的下一個......所以直到右邊沒有更多的右運算符,然后是左邊最近的運算符,依此類推,直到沒有更多的左運算符在左邊。
那么如果我們有-x++
會發生什么? ++
首先被評估為x
的值,並且計划發生變量的后遞增,然后評估左側的值,作為結果給出x
在遞增之前的值,改變符號,以及變量x
使其值遞增(僅遞增,無符號更改)。
另一個例子:讓我們計算++x->field
:首先->field
(整個東西, ->
箭頭和字段名稱)被認為是右一元運算符,給定一個指針獲取名為field
fo 的字段中的值x
指向的結構。 該值遞增(並再次存儲在x->field
)並且返回的值是最終遞增的值。
最后一個例子:讓我們計算*p++
。 p
的值計划后遞增,但保留其先前的值。 然后p
的舊值被用來訪問它所指向的值,給原來指向的值。 最后p
遞增並指向訪問值旁邊的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.