2014-02-23 31 views
2
#include<stdio.h> 
#include<conio.h> 
#define CUBE(y)y*(y*y) 
main() 
     { 
     int j; 
     j = CUBE(-2+4); 
     printf("value of j = %d",j); 
     getch(); 
     } 

此代碼的輸出爲-26。我只是想知道這個代碼如何將-26作爲輸出。 #define如何在此代碼中工作。我知道#define永久固定值爲一個變量或方法,但不是這裏如何工作CUBE。有人可以請一步一步來形容這一點,方法簡單。#define如何工作?奇怪的結果爲CUBE(y)y *(y * y)

+2

你知道一個宏的工作原理是直接進行文本替換嗎?因此,請手動執行替換,並考慮結果的含義。 –

+2

此代碼不符合conio。h是過時的,非標準的,你不應該使用,見http://en.wikipedia.org/wiki/Conio.h – kebs

+1

@kebs:我願意打賭OP是使用古老的可怕編譯器,可能是Turbo C++。 – duskwuff

回答

8

它的作用:

j = -2 + 4 * (-2 + 4 * -2 + 4) 

CUBE的更正確的定義是

#define CUBE(y) ((y)*(y)*(y)) 
+0

是的,除非你有一個很好的理由否則,*總是*在宏擴展中用'()'包圍替換變量。通過'()'來包圍整個擴展通常也是一個好主意。 –

5

你應該自己弄清楚使用-E標誌:

gcc test.c -E

# 1 "test.c" 
# 1 "<command-line>" 
# 1 "test.c" 

main() 
     { 
     int j; 
     j = -2+4*(-2+4*-2+4); // <-- Check this substitution 
     printf("value of j = %d",j); 
     getch(); 
     } 

要立方體號碼,你應該使用()改變評價的優先級和順序: -

#define CUBE(y) ((y)*(y)*(y))

將使用-E標誌後給予:

j = ((-2+4)*(-2+4)*(-2+4));

+2

這是一個有用的技能,所有預處理的濫用者必須學習! –

2

I t擴展爲是:

-2+4*(-2+4*-2+4) = -2 +4(-6)= -26 

提供()

#define CUBE(y) ((y)*(y)*(y)) 

環繞修復Ÿ所以你會得到:

((-2+4) * (-2+4) * (-2+4)) 
3

我知道中的#define永久固定值一個變量或方法

你不知道,因爲它是錯誤。預處理器的工作原理是令牌更換。每當它看到該令牌序列CUBE(some tokens)

some tokens * (some tokens * some tokens) 

取代它現在做更換一些令牌-2+4自己和做數學題。

預處理器甚至不知道變量或對象或方法是什麼。它純粹根據預處理令牌(小字符;請參閱ISO C標準瞭解詳細信息)。

相關問題