我第一次使用 gcovr ,并且遇到了以下代码令人困惑的问题:
for (int i = 0; i < 4; i++)
{
bool a = i & 1;
bool b = i & 2;
if (a && b)
printf("a and b\n");
else if (a && !b)
printf("a not b\n");
else
printf("the other two\n");
}
(代码按您的预期工作,所以我不会粘贴输出。)
但是,gcovr决定我没有完整的分支机构报道:
✓✓ 5 for (int i = 0; i < 4; i++)
{
4 bool a = i & 1;
4 bool b = i & 2;
✓✓✓✓ 4 if (a && b)
1 printf("a and b\n");
✓✓✓✗ 3 else if (a && !b)
1 printf("a not b\n");
else
2 printf("the other two\n");
}
很明显,四个排列之一不是由else if
处理的,而仅仅是因为它是由第一个if
处理的。
我脾气暴躁,因为最终结果是分支覆盖率不到100%。这只是“方式”还是我致命地误解了某些东西?
答案 0 :(得分:1)
您可能要重构:
if (a)
{
if (b)
{
std::cout << "a and b\n";
}
else
{
std::cout << "a and not b\n";
}
}
else
{
std::cout << "not a\n";
}
在您发布的代码中,a
在两个if
语句中求值。
上面的示例删除了else if
条件。
答案 1 :(得分:0)
我找到了批发重构的简单替代方法:
import "./App.scss";
import React from "react";
import StatelessComponent from "./components/stateless-component";
import StatefullComponent from "./components/statefull-component";
function App() {
return (
<div className="App">
<StatefullComponent />
</div>
);
}
export default App;
我喜欢这种方法,因为它仍然封装了我想要的逻辑,没有多余的检查(因此有问题)。