簡體   English   中英

下標運算符的評估順序

[英]Evaluation Order of Subscript Operator

在數組的情況下是否存在用於評估表達式的任何順序。 如果表達式E的形式為E1 [E2],其中E1和E2也是表達式,則E1和E2的評估順序是否固定?

這是我的代碼:

#include<stdio.h>
int main(){

    int a[5] = {1,2,3,4,5}; 
    (a + printf("1"))[printf("2")];
    (printf("3"))[a + printf("4")];

    return 0;
}   

它顯示輸出為:1243

我用gcc編譯它。

謝謝。

E1[E2]相當於*(E1 + E2)

標准告訴我們“子表達式的評估順序和副作用發生的順序都是未指明的”。 因此, E1[E2]的評估順序不固定。

N1256

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

所以簡短的回答是“不”; 對於像E1[E2]這樣的表達式,子表達式E1E2的評估順序不固定。

我希望你只是好奇地問這個問題而不是依賴於這種行為;

我附近沒有C標准,但我不明白為什么你不能將操作分成兩個單獨的語句,添加一個顯式序列點。 您和其他人可能不記得將來正確的訂單應該是什么,從而產生維護問題。

int * the_array = E1;
the_array[E2];

//or

int the_index = E2;
E1[the_index];

//is much clearer

下標運算符的評估順序未定義 讓我們舉一個不那么混淆的例子。

問題:請考慮以下表達式:

f() + g() * h()

優先級非常明確; 乘法勝過加法,如相應的解析樹所示:

       +
    /     \
   /       \
  f()       *
  /          \
  /           \
 g()           h()

優先級表只告訴我們如何對術語進行分組,而不是它們的評估順序。 使訂單可預測的唯一方法是引入C標准調用序列點的內容 例如,步驟:

x = g();
x = x * h();
x = x + f();

得到與以前相同的優先級,但是在保證順序g()h()f()調用函數。

因此,在您的示例中,您必須引入序列點以確保以所需順序執行printf語句。

暫無
暫無

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

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