2010-09-24 229 views
0

給定的程序是否定義良好?C程序混淆

#include <stdio.h> 
int main() 
{ 
    int a=2,*f1,*f2; 
    f1=f2=&a; 
    *f2+=*f2+=a+=2.5; 
    *f1+=*f1+=a+=2.5; 
    printf("\n%d %d %d\n",a,*f1,*f2); 
    return 0; 
} 
+2

這功課嗎? – alex 2010-09-24 02:10:37

+0

[任何人都可以解釋這些未定義的行爲(i = i ++ + ++ i,i = i ++等)]的可能的重複(http://stackoverflow.com/questions/949433/could-anyone-explain-these -undefined-behaviors-iiiii-etc) – 2010-09-24 06:57:43

回答

8

不是。與*f2 += *f2 += ...的位已經是未定義的行爲。對相同對象進行多次修改而不需要插入序列點。無需進一步觀察。

+2

...因爲它修改一個對象兩次而沒有中間的順序點。 '* f1 + = * f2 + = ...'同樣是未定義的。 – caf 2010-09-24 02:06:13

+0

以及'* f2 + = a + = ...' – AnT 2010-09-24 02:07:26

-2

編輯 - 當我說操作的括號控制順序時,我完全錯了。安德烈正確地糾正了我。 我發佈的原始代碼也有未定義的行爲。這是我的第二次嘗試。 我原來的帖子也在這個下面,所以可以看到更正。

將變量聲明分解爲多行是很好的編碼實踐,以便您可以看到發生了什麼。

//此代碼是具有指針的實驗

#include<stdio.h> 

int main() 
{ 
int a=2;      //initialize a to 2 
int *f1; 
int *f2; 

f1 = &a;      //f1 points to a 
f2 = &a;      //f2 points to a 

a += 2.5;      
*f1 += a;    
*f1 += a; 
*f2 += a; 
*f2 += a;  

printf("\n%d %d %d\n",a,*f1,*f2); 
return 0; 
} 

結果印刷品64 64 64

//我以前不正確的代碼如下:

的#include

int main() 
{ 
int a=2;      //initialize a to 2 
int *f1; 
int *f2; 

f1 = &a;      //f1 points to a 
f2 = &a;      //f2 points to a 

a += 2.5;      //2.5 + 2 = 4.5, but 4.5 as an int is 4. 
*f1 += (*f1 += a);    //4 + 4 = 8. 8 + 8 = 16. 
*f2 += (*f2 += a);    //16 + 16 = 32. 32 + 32 = 64.        

printf("\n%d %d %d\n",a,*f1,*f2); 
return 0; 
} 

結果打印64 64 64

您應該使用括號來確保首先發生哪些操作。希望這可以幫助。首先是 。希望這可以幫助。

+1

真的嗎?那麼爲什麼當我運行原始代碼時會打印72 72 72? :)答案:該程序沒有任何特定或可預測的輸出。這個程序的行爲是* undefined *。該程序已損壞(適用於原始代碼以及您的版本)。 – AnT 2010-09-24 06:31:31

+1

最重要的是,C中的括號不能保證首先發生哪種操作。括號影響操作數和操作符的分組,而不是評估的順序。 – AnT 2010-09-24 06:35:17

+0

我意識到我的錯誤。你絕對正確 - 我應該更仔細地閱讀你原來的文章。 – Locklier 2010-09-24 17:34:13