2011-03-07 111 views
3

我想解決兩個預處理器相關的問題,但在這兩個程序中我得到的結果,我無法弄清楚如何。下面是我的程序:爲什麼我的C程序輸出這個?

#include<stdio.h> 
#define SQUARE(x) x*x 
int main() 
{ 
float s=10,u=30 ,t=2,a; 
a=2*(s-u*t)/SQUARE(t); 
printf("Result:%f\n",a); 
return 0; 
} 

據對我來說,這個程序的輸出應該是-25.000但我正在逐漸-100.000

而在第二個方案:

#define FUN(i,j) i##j 
int main() 
{ 
int val1 = 10; 
int val12 = 20; 
clrscr(); 
printf("%d\n",FUN(val1,2)); 
getch(); 
} 

輸出應該是102但我正在逐漸20; 這是爲什麼呢?

+0

我懷疑的#include> stdio.h>中 甚至會編... – PhiLho 2011-03-07 12:01:39

+0

對不起@PhiLho它的#include 2011-03-07 12:18:56

+0

你的第二個例子就不會編譯。請複製/粘貼您使用的確切源代碼。 – 2011-03-07 12:33:13

回答

4

第一個:

a=2*(s-u*t)/SQUARE(t); 

更換後定義,我們得到:

a=2*(s-u*t)/t*t; 

現在,因爲我們沒有在SQUARE的定義()我們得到:

a=2*(10-30*2)/2*2; --> a=2*(-50)/2*2; --> a=-100/2*2; --> a=-50*2; --> a=-100 

如果你想得到-25你應該定義SQUARE(x)(x*x)

編輯:添加關於第二個例子的解釋。

printf("%d\n"FUN(val1,2)); 

再次,我們首先應該更換的定義(提醒:##「會連接」的字符串的定義 - 我無法找到完美的話,以解釋所以只是來看看的例...):

printf("%d\n",val12); [note: the comma (,) is missing - so it won't compile.] 

val1220那就是你會得到什麼。

的那些兩個例子的一點是要記住,我們要始終處理定義第一(因爲「現實生活」的編譯器(或預處理器)做它的運行時間之前)

希望它可以幫助..

+0

感謝@SivGo爲您解釋,並且還有一個事實,即/ *操作符具有從左到右的關聯性.... – 2011-03-07 12:25:47

+0

並且無法獲得第二個問題 – 2011-03-07 12:26:56

+0

printf(「%d \ n」,FUN(val1 ,2));這裏val1的值不會替換爲10?這是我感到困惑的地方......我認爲它應該被10代替...... – 2011-03-07 13:00:45

11
#define SQUARE(x) x*x 

應該

#define SQUARE(x) ((x)*(x)) 

事實上,如果沒有括號,如

2*(s-u*t)/t*t 

這被解釋爲

(2*(s-u*t)/t)*t 

關於你的第二個問題2*(s-u*t)/SQUARE(t)擴大, 0根據##運算符的語義,將被擴展爲val12。它仍然是不明確你的目的是什麼:在printf線將被理解爲

printf("%d\n", val12); 

,它將打印20

+0

同樣舉例二,'(i ## j)' – alternative 2011-03-07 11:57:14

+0

謝謝@Alexandre。這個a =(2 *(s-u * t)/ t)* t;表達式是根據#define SQUARE(x)x * x,這就是你想說的 – 2011-03-07 12:22:31

+0

爲什麼要這樣定義FUN:#define FUN(i,j)(i ## j)會解決這個問題嗎? – SivGo 2011-03-07 13:16:11

3

對於第一種情況,

a=2*(s-u*t)/SQUARE(t); 

會在編譯時轉換爲

a=2*(s-u*t)/t*t; 

。這是預處理器常犯的錯誤。

相關問題