组合多个条件检查的替代语法

时间:2016-12-19 05:57:17

标签: c if-statement syntax

我在c中实现了一个简单的if语句,我将比较整数' tile'的值。四个其他整数:w,a,s和d。

这是我的代码:

if(tile == w || tile == a || tile == s || tile == d )
{
    printf("legal\n");
    return true;
}

虽然以上是正确的,但语法很无聊。是否有更优雅的方式来编写条件"' tile'是以下整数之一..."

我是编程方面的新手所以我道歉,因为我怀疑答案是非常明显的。但是,我没有在其他地方找到它。

3 个答案:

答案 0 :(得分:3)

虽然eyalm's answer可能是您正在寻找的那个,但只是想在这里指出一个更重要的因素(正如您所提到的那样,"我&#39 ;编程中的新手" ),这是"编写代码,让人们更容易理解"。

虽然按位方法更短,但随着它的增长,通常似乎更难理解维护。

更简洁的方法是(虽然需要花费更多精力来编写代码),坚持使用if ( a || b || c)语法或降低switch的情况。它提供了更好的可读性。

  • 如果您的选项变长(您可能需要水平滚动条),您可以考虑添加一个函数来获取所需的值并在{的条件中使用返回值{1}}陈述。

最重要的是,没有正确或错误的方式,只选择使代码更易读和可维护的方式。

答案 1 :(得分:2)

我能想到的两个选择......

<强>按位

#define TILE_W 0x0001
#define TILE_A 0x0002
#define TILE_S 0x0004
#define TILE_D 0x0008

if (tile&(TILE_w|TILE_A|TILE_S|TILE_D))
{
    printf("legal\n");
    return true;
}

<强>的switch-case

switch (tile)
{
case w:
case a:
case s:
case d:
    printf("legal\n");
    return true;
default:
    return false;
}

答案 2 :(得分:1)

改进的解决方案可能取决于您与之比较的值。

如果wasd是具有连续值的整数(例如10,11,12和13),则if语句可以使用边界条件:

 if( tile >= w && tile <= d) { printf("legal\n"); }

如果值不同(例如6,32,142,55),您可以使用switch .. case构造,例如

 switch (tile)
 {
    case w:
    case a:
    case s:
    case d:
          printf("legal\n");
          break;
    default:
          printf("ILLEGAL\n");
          break;
 }

您也可以在一个或多个if中使用设置标记

int legal = 0;

// checking can be in different places of code
if (tile == w)
    legal = 1;
if (tile == a || tile == s)
    legal = 1;
if (tile == d)
    legal = 1;

if( legal )
{
   printf("legal\n"); 
}

并考虑将wasd值存储为有效值数组,因此可以使用循环进行检查:

int valArr[] = {101, 151, 333, 7}; // you can add any number of values here
int i;
int legal = 0;
for(i = 0; i < ( sizeof(valArr)/sizeof(valArr[0]) ); i++)
{
     if(valArr[i] == tile)
     {
         legal = 1;
         break;
     }
}
if( legal )
{
   printf("legal\n"); 
}
else
{
   printf("ILLEGAL\n");
}