簡體   English   中英

將首先評估表達式的右側

[英]will right hand side of an expression always evaluated first

右側總是會在左側前方進行評估嗎? 然后右側的結果將傳遞到左側。 我不是在談論A[i]=i++等異常

我說的是正常情況:

A[i] = (j+32+43 & K); 
A[j] != (A[j] + A[k]); 

將所有這些表達式的正確部分首先評估,然后將結果與左側進行比較? (總是)

不,沒有這樣的保證,N1570§6.5.16/ p3(強調我的):

賦值運算符將值存儲在左操作數指定的對象中。 賦值表達式在賦值后具有左操作數的值,111)但不是左值。 賦值表達式的類型是左值操作數在左值轉換后將具有的類型。 在左右操作數的值計算之后,對更新左操作數的存儲值的副作用進行排序。 對操作數的評估是不確定的

請注意,賦值運算符“消耗”兩個操作數,並且具有修改左值的副作用。

一般來說,子表達式的評估順序是未指定的,有一些例外,例如邏輯和 邏輯或 逗號運算符等......

由於您的評論聲明您對一般規則感興趣:

任何操作員@YuHao,如果有任何一般規則

這將被覆蓋草案C99標准6.5 表達式3它說( 重點煤礦前進 ):

運算符和操作數的分組由語法表示.74) 除了稍后指定的 (對於函數調用(),&&,||,?:和逗號運算符), 子表達式的評估順序和順序發生哪些副作用都是未指明的

這在C11標准草案中基本相同,期望C11沒有列出異常,所以引用C99更方便。 C11第3段說:

運算符和操作數的分組由語法表示.85) 除了后面指出的,子表達式的副作用和值計算是未被排序的.86)

特別是對於賦值運算符 C99說:

操作數的評估順序未指定[...]

和C11說:

[...]對操作數的評估沒有統計。

我今天剛剛遇到這個,花了1個小時調試這樣的代碼:

int a[1], b=0;

a[b++] = b;

我希望a [0]在此之后包含0,但是編譯器實際上決定首先評估b ++,然后是賦值的右側,並將結果存儲在[0]中(因此左側的b ++工作正常)。 所以這有效地成了:

b++;
a[0] = b; // 1

這取決於所涉及的運營商的優先級和相關性。

完整列表可以在這里找到

暫無
暫無

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

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