是否有更快/更短的方法在C++而不是使用"if"进行这些测试?

Is there a faster/shorter way of doing these tests in C++ instead of using "if"?

本文关键字:if 测试 方法 C++ 是否      更新时间:2023-10-16
...
int x;
int z1 = '-';
int z2 = '-';
int z3 = '-';
int z4 = 'a';
if ((z1 == 'a' || z1 == 'b')) x++;
 else if ((z1 == '-' && z2 == 'a' || z2 == 'b')) x++;
  else if ((z1 == '-' && z2 == '-' && z3 == 'a' || z3 == 'b')) x++;
   else if ((z1 == '-' && z2 == '-' && z3 == '-' && z4 == 'a' || z4 == 'b')) x++;
 else x = 0;
printf("x=%dn",x);
...

我的代码比这长得多,我想知道是否有一种更短的方法来获得相同的结果,或者一种更快的方法来执行程序!提前感谢您的帮助和关注!

为了使代码更短(并且更具可读性、可扩展性和更全面),将z变量放入数组中,然后循环遍历它。对于您想要拥有的任意数量的z变量,下面的解决方案将保持相同的行数。只需调整数组的大小。

int z[4];
for (int i = 0; i < 4; i++)
{
    if (z[i] != '-')
    {
        x += (z[i] == 'a' || z[i] == 'b'); // note the implicit conversion from boolean to int
        break;
    }
}

注意,您仍然需要考虑到最后一个索引是-, x从未被增加或设置为0,但这可以通过简单的修改来完成。我建议将上述内容放入它自己的评估函数中,这样您就可以简单地捕获所有return

注意:你可能应该使用char数据类型的变量,因为你是专门存储字符在他们。

就速度而言,该解决方案即使不比当前解决方案更好,也可能与当前解决方案相当。它的分支次数和if-else语句一样多,但在运行时可能有更好的分支预测(多亏了for-loop),并且计算的表达式更少。

您可以使用switch语句使其更快。

switch (z1)
{
   case 'a':
   case 'b':
      x++;
      break;
   case '-':
      switch ( z2 )
      {
         case 'a':
         case 'b':
            x++;
            break;
         case '-':
            x += (z3 == 'a' || z3 == 'b');
            x += (z3 == '-' && z4 == 'a' || z4 == 'b');
            break;
      }
      break;
   default:
      x = 0;
}

你可以这样做:

int main(void) {
    int x;
    char z[5] = "---a";
    for (int i = 0; i < 4; i++) {
        if (z[i] == 'a' || z[i] == 'b') { x++; break; }
        else if (z[i] != '-') { x = 0; break; }
    }   
    return 0;
}

这里有一些优化代码(运行更快)的技巧

++x是比x++更快的增加x的方法。(参考:避免后缀自增操作符)

如果你使用的是GNU C语言,你可以使用不太可能/可能的宏来优化你的If语句。为了有效地使用这些宏,您必须知道哪些if语句将被更频繁地执行。

如果你使用的是windows,你可以使用_assume()。但不建议使用此功能,因为它是危险的。看看英特尔是怎么说的

根据Intel的文件:

为了有效地编写代码来利用这些规则在编写if-else或switch语句时,检查次数最多首先是常见的情况,然后逐渐减少到最不常见的情况。