2013-08-31 40 views
-2

我發現,如果我給你x的值5裏面的文件並運行它,如下面的代碼我得到的差值輸出爲392就是以下兩個C代碼

#include<stdio.h> 
#define CUBE(r) ((r)*(r)*(r)) 
int main() 
{ 
    int x; 
    x=5; 
    printf("%d\n", CUBE(++x)); 
    return 1; 
} 

但是,當我使用「scanf()的」獲得x的值,給輸入爲5以下的代碼我得到的輸出爲336

#include<stdio.h> 
#define CUBE(r) ((r)*(r)*(r)) 
int main() 
{ 
    int x; 
    scanf(" %d",&x); 
    printf("y is %d\n", CUBE(++x)); 
    return 1; 
} 

爲什麼我得到這樣的輸出

+0

我正在使用gcc編譯器 – siva

+0

也打印'x'的值。學習使用調試器。測試'scanf'的結果。瞭解[未定義行爲](http://en.wikipedia.org/wiki/Undefined_behavior)。用'gcc -Wall -g'編譯(用'gdb'調試)。改進代碼直到沒有警告。 –

+0

順便說一下,你的'cube'應該是一個內聯函數'inline int cube(int z){return z * z * z; }' –

回答

5

這是因爲你在做什麼是不明確的,因此編譯器可以自由地做就是了。如果沒有中間順序點,您不能多次更改變量的值,其列表可以在C99或C11的附錄C中找到。

你表達CUBE(++x)計算結果爲:

((++x)*(++x)*(++x)) 

爲什麼你得到不同的結果,最可能的原因是,與x = 5版本,編譯器可以計算在編譯時的結果,很可能只是給你機器代碼打印出它計算的常量值。

對於數據錄入版本,計算很可能留在運行時間中,這可能會使用不同的計算方法。

一種解決方法是不使用的代碼宏,這是我沒有了時間內完成 - 我只使用他們的條件編譯,因爲現在的宏代碼可以做的內聯函數和常量宏可以做到與枚舉。

換句話說,使用方法:

inline int cube (int r) { return r * r * r; } 

這不是正是喜歡,因爲inline代碼宏僅僅是一個建議(當然,功能不會未定義行爲遭受),但我通常沒有找到現在有用的內聯建議,因爲編譯器比以前更關注優化。

1

的兩個將給你一個undefined behaviour。使用適當的功能。喜歡你的立方體內聯函數,這樣的事情: -

inline int cube(int z) 
{ 
return z*z*z; 
}