减少if语句

时间:2014-01-02 09:33:32

标签: c if-statement

我有3个define声明:

#define LOCATION_SEA 1
#define LOCATION_AIR 2
#define LOCATION_GROUND 3

我有两种方法可以针对那些define s检查特定变量:

int IsLocationGround(TreeNode *node)
{
 return (node->node_type == LOCATION_GROUND);
}

int IsAnyLocation(TreeNode *node)
{
 return (node->node_type == LOCATION_GROUND ||
         node->node_type == LOCATION_AIR    ||
         node->node_type == LOCATION_SEA );
}

在我的部分代码中我这样做:

if (IsLocationGround(node))
  statements A.....
else if (IsAnyLocation(node))
  statements B.....
else 
  statements C

由于函数IsLocationGround()和IsAnyLocation()彼此非常接近,是否可以通过这种方式更改它,我将只使用1个if-else块?

2 个答案:

答案 0 :(得分:2)

如果类别不是独占,标准的C / UNIX方式是使用位掩码。我创建了函数static,它可以引导编译器使它们内联。

#define LOCATION_SEA 1
#define LOCATION_AIR 2
#define LOCATION_GROUND 4
#define LOCATION_ALL ( LOCATION_SEA | LOCATION_AIR | LOCATION_GROUND )

static int IsLocationGround(TreeNode *node)
{
 return (node->node_type & LOCATION_GROUND);
}

static int IsAnyLocation(TreeNode *node)
{
 return (node->node_type & LOCATION_ALL);
}

答案 1 :(得分:0)

您可以使用此等效代码替换所有if / else if / else代码函数IsLocationGround / IsAnyLocation代码:

switch (node->node_type) {
  case LOCATION_GROUND:
    statements A.....
    break;
  case LOCATION_AIR:
  case LOCATION_SEA:
    statements B.....
    break;
  default:
    statements C.....
}