2011-08-05 70 views
-1

可能重複:
Order of evaluation in C++ function parameters
Parameter evaluation order before a function calling in C請解釋此行爲?

:~/work_space/cprogs$ !cat 
cat expression_associativity.c 
#include<stdio.h> 

int main() 
{ 

    int i = 0; 

    printf("\n no-incr:%d pre-incr:%d post-incr:%d no-incr:%d post-incr:%d no-incr:%d \n", i, ++i, i++, i, i++, i); 

    return 0; 
} 

:~/work_space/cprogs$ !./ 
./expression_associativity 

no-incr:3 pre-incr:3 post-incr:1 ***no-incr:3*** post-incr:0 ***no-incr:3*** 
:~/work_space/cprogs$ 

爲什麼最後和中間的 「無增量」 的值被印刷爲3?我期待最後一次「不加入」爲零,中間的「不加入」爲1.

有人可以解釋表達式的順序是什麼,爲什麼我們看到這個值?

回答

2

這是造成未定義的行爲。

未指定函數參數的評估順序,因此結果是未定義的。

未定義行爲意味着任何事情都可能發生,行爲無法定義。

+0

它實際上是「未指定」,與「未定義」明顯不同。 – cnicutar

+0

@cnicutar:我的答案已經表明它是未指定的,在這種情況下未指定的行爲會導致未定義的行爲。 –

+0

必須看到早期版本 – cnicutar

1

參數的評估順序未定義;唯一確保的是所有的增量和減量都將在調用函數之前完成。 C標準根本不允許您預測將在此處打印的內容。