2013-03-07 57 views
0

如果我寫司通過在OBJ - C的定義常量不起作用

#define ANOTHER_CONSTANT 200 
#define MYDIVISOR 1000/ANOTHER_CONSTANT 

然後方法

- (void)result { 
    NSRange range = [@"--BB-------A----" rangeOfString:@"A" options:NSBackwardsSearch]; 
    int rest = range.location % MYDIVISOR; 
    NSLog(@"Rest is %i", rest); 
} 

輸出始終是其餘爲0,不管其中A發生。我已經通過將MYDIVISOR存儲到一箇中間整數變量中解決了這個問題,但我想知道爲什麼它不適用於預定義的常量。有任何想法嗎?

回答

3

這是因爲你沒有把周圍的MYDIVISOR定義括號:

#define MYDIVISOR (1000/ANOTHER_CONSTANT) 

沒有括號,代碼看起來像這樣由預處理器,取代後:

int rest = range.location % 1000/ANOTHER_CONSTANT; 

因爲%/具有相同的優先級並從左到右應用,編譯器將生成代碼,該代碼將獲得除以1000的餘數,然後快速地將t他的結果是200,這當然不是你所期望的。

總的來說,總是在整個宏周圍放置圓括號是個好主意。對於帶參數的類似函數的宏來說,將每個參數括起來也是一個好主意。

+1

如果整數常量不能均勻分配,還有一個潛在的問題。 – rmaddy 2013-03-07 17:37:59

+0

如果他更改爲float/double,則%不起作用。 – 2013-03-07 17:43:41