是否有更快/更短的方法在C++而不是使用"if"进行这些测试?
Is there a faster/shorter way of doing these tests in C++ instead of using "if"?
...
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语句时,检查次数最多首先是常见的情况,然后逐渐减少到最不常见的情况。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 多个 if-else 测试的更简单方法
- 在单个if语句中测试多个布尔值
- 卡在测试'if':另一个代码的一部分
- C++ if 语句未正确测试
- ifs 是否按照它们的编写顺序进行测试是一个 if-else..如果-否则..如果-否则块
- 在函数开始时测试并返回,而不是嵌套的 if
- 如何使用if语句测试函数
- if/else优化测试结果令人震惊
- 有没有真正巧妙的方法来进行测试'if none in collection'?
- 对于循环数组迭代,if循环测试索引是否为真/假,计算结果不正确
- 是否有更快/更短的方法在C++而不是使用"if"进行这些测试?
- if语句-测试字符串或字符的大写,小写和数字
- c++基础- If语句测试
- C++ || 的排序和 &&在 if 语句中测试等式时
- 是否可以将任何类对象作为测试表达式传递给任何测试表达式,例如if,while like ifstream对象