初学者的问题:
如果我正在编写一个If语句,我希望与值范围相关,特别是标记,除了使用逻辑OR之外,还有更简单的方法吗?
if (tableView.tag == 1 || tableView.tag==2 || tableView.tag==3) { do something}
这看起来效率不高..
答案 0 :(得分:4)
if (tableView.tag >= minRange && tableView.tag <= maxRange)
{
}
答案 1 :(得分:1)
取决于您对“更容易”的定义......对于少量的比较,效率并不是真正的考虑因素;您可以测试单个值,或者如果值是连续的,请执行>=
和<=
测试。如果您愿意,您可以随时使用宏或内联函数来整理,例如:
NS_INLINE BOOL inRange(lower, value, upper) { return (lower <= value) && (value <= upper); }
对于大量测试或简单的美学,其他方法包括使用位掩码和数组。
如果您正在测试一个小数,最多32或64个连续值,那么您可以为要测试的集定义位掩码,并按位和操作进行。 E.g:
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个元素的布尔静态数组的声明非常有效。 E.g。
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
答案 2 :(得分: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;
}