0

ここでの初心者の質問:

値の範囲、特にタグに関係するIfステートメントを作成している場合、論理ORを使用する以外に、それを行う簡単な方法はありますか?

if (tableView.tag == 1 || tableView.tag==2 || tableView.tag==3) { do something}

これはあまり効率的に見えません。

4

3 に答える 3

4
if (tableView.tag >= minRange && tableView.tag <= maxRange)
{
}
于 2012-05-06T02:41:27.913 に答える
1

「より簡単」の定義に依存します...比較の数が少ない場合、効率は実際には考慮されません。>=個々の値をテストするか、値が連続している場合はテストを実行できます<=。必要に応じて、いつでもマクロまたはインライン関数を使用して整理できます。たとえば、次のようになります。

NS_INLINE BOOL inRange(lower, value, upper) { return (lower <= value) && (value <= upper); }

多数のテスト、または単に美学の場合、他の方法にはビットマスクと配列の使用が含まれます。

32 または 64 までの少数の連続する値をテストする場合は、テスト対象のセットのビットマスクを定義して、ビットごとの演算を行うことができます。例えば:

typedef enum { Sunday = 0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } Day;

int WeekendSet = (1 << Sunday | 1 << Saturday);

if ( (1 << day) & WeekendSet ) // day is a weekend

より大きくても大きすぎないセットの場合は、配列を使用できます。isletter()これは、標準ライブラリisdigit()などの関数が時々定義される方法です。1 バイト文字はせいぜい 255 であるため、256 要素のブール値の静的配列を宣言することは非常にうまく機能します。例えば

static uint8 isADigit[] = { 0, 0, ..., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ... }; // 256 values, only 10 1's for position's '0' through '9'

if ( isADigit[myChar] ) // myChar is a digit
于 2012-05-06T03:16:38.137 に答える
0

switchテストしている値が整数型の場合は、フォールスルーで使用できます。

switch(tableView.tag) {
    case 1:
    case 2:
    case 3:
        // do something
        break;
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
        // do something else
        break;
}
于 2012-05-06T16:41:02.067 に答える