2015-06-02 79 views
1

今天我看到printf()函數的匿名行爲。 任何人都可以告訴我爲什麼它的行爲如此。 是否printf()中的函數執行順序相反? 請解釋或共享有用的鏈接。Printf在c中的匿名行爲

我的代碼

#include <stdio.h> 
int fun(){ 
    static int c=15;c++; 
    return c; 
} 
int main() 
{ 
    printf("%d %d %d",fun(),fun(),fun()); 
} 

實際輸出:18 17 16 預期輸出:16 17 18

編輯2: 我還有一點我注意到,它的行爲只能用不功能,但也與變量

#include <stdio.h> 
static int c=15; 
int fun(){ 
    c++; 
    return c; 
} 
int main() 
{ 
    printf(" %d %d %d %d %d",c,fun(),fun(),fun(),c); 
} 

實際輸出:18 18 17 16 15 預計產量:15 16 17 18 18

感謝提前:)

+9

你在*未定義的行爲*的土地。注意惡魔。 –

+1

在調用printf的過程中,唯一可以確定的是所有參數都在控制傳遞給printf之前進行了評估,它們的評估順序由編譯器決定。 –

+1

未定義的行爲永遠不會令我驚歎 – asimes

回答

0

標準中未定義函數的參數的順序,由編譯器使用的調用約定確定。

你可以參考this

+0

編譯器也可能爲了優化原因重新組織它們 –

-1

我運行該程序,並得到一個輸出18 17 16

這意味着不同的fun()從右側運行到左側。

但是,它仍然是一個未定義的行爲。它們的順序在C中沒有明確定義,並且取決於編譯器。

+1

它沒有指定,但沒有定義。 –

2

參數的評估順序是未指定。這意味着它依賴於編譯器實現。您示例中的實際順序似乎爲:

printf("%d %d %d",fun(),fun(),fun()); 
/*    (3) (2) (1) */ 

但這是任意的,很可能是6種可能性中的任何一種。

2
int main() 
{ 
    int a, b, c; 
    a = fun(); 
    b = fun(); 
    c = fun(); 
    printf("%d %d %d", a, b, c); 
} 

而你得到你所需要的。

參數評估訂單由編譯器控制,但報表評估訂單由您控制。

+0

感謝您的回答,但問題是爲什麼它的行爲如此 – Anonymous

+0

是的,當然。我只想證明,即使參數評估訂單不受影響,評估訂單也在您的控制之下。 – dlask