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

取决于您对“更容易”的定义......对于少量比较,效率并不是真正的考虑因素;您可以测试单个值,或者如果这些值是连续的,请执行 a>=<=测试。如果您愿意,您可以随时使用宏或内联函数来整理内容,例如:

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()函数有时是如何定义的。由于单字节字符最多有 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

如果您正在测试的值是整数类型,则可以使用switchfall-through:

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 回答