2013-10-16 46 views
-2

我正在閱讀c中的Understanding Pointers。給出意想不到的值的指針

我在這裏找到了一個程序。

#include<Stdio.h> 
#include<conio.h> 
int main() 
{ 
    static int arr[]={97,98,99,100,101,102,103,104}; 
    int *ptr=arr+1; 
    printf("\nThe base Address is:%u\n",arr); 
    print(++ptr,ptr--,ptr,ptr++,++ptr); 
    return getch(); 
} 

print(int *a,int *b,int *c,int *d,int *e) 
{ 
     printf("%d %d %d %d %d",*a,*b,*c,*d,*e); 
} 

該計劃是完美的我認爲是它必須產生以下的輸出:99 99 98 98 100 但它提供了以下的輸出:100 100 100 99 99

我不能明白幫助我理解它。

+4

「該計劃是完美的」 - 著名的遺言。 –

+2

我們多久才能得到這個確切的問題? – Dan

+3

嗨@google,請在這裏詢問谷歌之前詢問你的問題。這裏已經有很多重複的答案。 –

回答

4

除了的功能參數是未指定的計算的順序,節目體育若干項具有未定義操作:

  • 它試圖到達下一序列點之前訪問具有副作用的表達式的值(它在print的調用中多次執行)和
  • 它嘗試使用%u格式說明符來打印指針。

程序編寫的方式,它可以打印任何東西,不打印任何東西,甚至崩潰:這是未定義行爲的後果。

如果你想要的參數的評估是在一個特定的順序,介紹臨時變量,並做連續評價,是這樣的:

#include<stdio.h> 
#include<conio.h> 
int main() 
{ 
    static int arr[]={97,98,99,100,101,102,103,104}; 
    int *ptr=arr+1; 
    printf("\nThe base Address is:%p\n",(void*)arr); 
    int *tmp0 = ++ptr; 
    int *tmp1 = ptr--; 
    int *tmp2 = ptr; 
    int *tmp3 = ptr++; 
    int *tmp4 = ++ptr; 
    print(tmp0, tmp1, tmp2, tmp3, tmp4); 
    return getch(); 
} 
print(int *a,int *b,int *c,int *d,int *e) 
{ 
     printf("%d %d %d %d %d",*a,*b,*c,*d,*e); 
} 
+0

您還可以在'完美的程序' –

+0

中包含'',謝謝這是知道的答案,我真的很高興能夠理解這一點。 –

2
print(++ptr,ptr--,ptr,ptr++,++ptr); 

是未定義的行爲,因爲評估參數的順序未由C標準指定。

相關問題