2013-06-18 101 views
0

無論我讀了多少主題,我都無法理解評估策略。你能用一個例子向我解釋三個評估命令嗎?我正在寫下面的代碼。你能否按需要解釋呼叫(懶惰評估),按名稱呼叫(正常的訂單評估),使用下面的代碼通過參考呼叫。你也可以用你的例子來解釋它們。我只想要了解他們,但我無法理解。Dummies評估訂單

int a[4] = {10,20,30,40}; 
int i = 0; 
int *p; 
void test(int x, int y, int z) 
{ 
    p = (int *)malloc(sizeof(int)); 
    *p=x; 
    x++; y++; z++; 
    p = &z; 
    printf("%d %d %d\n",x,y,z); 
    x++; y++; z++; 
    p = &z; 
    printf("%d %d %d\n",x,y,z); 
} 
main() 
{ 
    test(i,a[0],a[i]); 
    printf("%d %d %d %d %d\n", a[0],a[1],a[2],a[3],*p); 
} 

在此先感謝。

}

+0

我認爲這些概念在C語言中沒有力量,評估總是「正常」的,評估順序問題只出現在帶有副作用的語句中。我看到的最接近的是按值或通過引用/指針調用函數的區別。 ...另一方面,如果你想要的只是你的代碼的每一行的詳細解釋,我可以做。 – Medinoc

回答

1

這裏沒有懶惰,因爲受影響的一切都是按值傳遞和全局指針永遠不會解除引用,直到它的未定義行爲這樣做(指向一個已經一個函數的局部變量回)。

程序行爲,以及它們出現在調試器的監視列表上的相應表達式的值。請注意0​​是一個表達式,而不是一個變量:調試器會懶惰地評估它,但它不是真的在內存中。

  1. 電話測試()計算表達式i,分別a[0]a[i]和向01010
  2. test(0,10,10)開始 - > {x,y,z,p,* p} = {0,10,10,(未初始化),(無效)}
  3. p = (int *)malloc(sizeof(int)); - > (x,y,z,p,* p)= {0,10,10, {0,10,10,(某處在堆上),0}
  4. x++; y++; z++;→{x,y,z,p,* p} = {1,11,11, (內存泄漏,malloc內存的地址「被遺忘」而沒有被釋放) - > {x,y,z,p,* p} = {1,11,11,& z,11}
  5. printf("%d %d %d\n",x,y,z);顯示器1 11 11
  6. x++; y++; z++; - > {X,Y,Z,P,* P} = {2,12,12,& Z,12}
  7. p = &z;無變化,對已經指向到z 。
  8. printf("%d %d %d\n",x,y,z);顯示2 12 12
  9. 函數返回。 p現在是一個懸掛指針!當你解除引用時可能會發生任何事情。
  10. 大printf():第五個數字是未定義的(應用甚至可能在函數被調用之前崩潰),但如果星星是正確的,它可能是12。 在這種情況下,它會顯示10 20 30 40 12

事實上,指針是不是真的用於演示的指針在這裏是如何工作的:這是一種浪費許多潛在的。就指針而言,這是一個糟糕的示例代碼。