0

私が書いたら

#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);
}

出力は常に、A がどこで発生しても、rest は 0 です。MYDIVISOR を中間整数変数に格納することで解決しましたが、事前定義された定数では機能しない理由を知りたいです。何か案は?

4

1 に答える 1

3

MYDIVISORこれは、定義を括弧で囲まなかったためです。

#define MYDIVISOR (1000/ANOTHER_CONSTANT)

括弧がない場合、プリプロセッサによる置換後のコードは次のようになります。

int rest = range.location % 1000 / ANOTHER_CONSTANT;

%/は同じ優先順位を持ち、左から右に適用されるため、コンパイラは除算の余りを取得するコードを生成し、1000結果をですばやく除算し200ます。これは確かに期待したことではありません。

一般に、マクロ全体を常に括弧で囲むことをお勧めします。パラメータを持つ関数のようなマクロの場合は、各パラメータにも括弧を付けることをお勧めします。

于 2013-03-07T16:44:58.717 に答える