2012-12-02 34 views
1

我正在用C編寫一個程序,該程序確定評估子程序參數的順序。確定子程序參數評估順序

我有什麼到目前爲止是這樣的:

int i=1; 
printf("%d %d %d\n", i++, i++, i); 

,但我不知道如果我是正確的道路上或會更容易在不同的語言像Ruby編寫。

如何在C(或Ruby)中編寫一個程序來確定子例程參數的評估順序?

+2

我真的不明白你的問題;你正在嘗試做什麼/提出問題? –

+0

請給出一個清晰的圖片,你問什麼 – Fyre

+0

我想在C中編寫一個程序,它決定了子程序參數的評估順序。 @jonallard – user1585646

回答

4

printf()函數參數的評估順序是未指定。所以你不能確定他們評估的順序。如果這是你想要確定的,那麼也許你會選擇一種語言,評估順序是明確定義的

此外,你的代碼有未定義行爲在修改不止一次i更沒有插入順序點。

3

要做到這一點,而不必調用不確定的行爲是簡單地打印一條消息的一種方法,因爲每個參數計算:

#include <stdio.h> 

static void foo(int a, int b, int c) {} 

static int argument(int n) 
{ 
    printf("Argument %d.\n", n); 
    return n; 
} 

int main(void) 
{ 
    foo(argument(0), argument(1), argument(2)); 
    return 0; 
} 

不過,這隻能說明你在一個特定的執行參數計算的順序該程序。參數評估的順序不是C標準規定的,可能因各種原因而改變。例如,如果你傳遞一個函數簡單參數,編譯器可能會先評估它們,以便它可以按照在該平臺上調用子例程所需的順序輕鬆地將它們放到堆棧上。但是,假設使用相同的編譯器版本和編譯開關,您可以傳遞一些複雜參數的函數,其中一些參數具有相同的子表達式。編譯器可能決定首先評估這些參數,以利用常見的子表達式。

編譯器甚至可以評估一個參數的一部分,然後是另一個參數的一部分,然後是第一個參數的一部分,然後是第三個參數,然後計算函數調用之前的表達式(保留所提供的序列點行爲),然後完成第二個論點。

參數評估的順序不是你可以依賴的。