仔细查看以下代码后,我看不到编译器为什么通过“警告:控制到达非void函数的末尾”来警告我。
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
}
else
{
return false;
}
}
我看不出问题出在哪里,在每种情况下,如果第一个if不为true,则else语句应注意返回false。
答案 0 :(得分:2)
当regIOobject::read()
为true,但是permeabilityModelPtr_->read(subDict("permeability"))
或magnetizationModelPtr_->read(subDict("magnetization"))
为false时,跟踪代码路径。在这种情况下,您输入顶部的if
块(不可以输入附加的else
块),但随后无法输入嵌套的if
块:
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
// Cool, read() was true, now check next if...
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
// Oh no, it was false, now we're here...
}
else
{
// First if was true, so we don't go here...
return false;
}
// End of function reached, where is the return???
}
最低限度的解决方法是仅除去else { }
换行符,因此任何失败都将落在return false;
上:
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
// Cool, read() was true, now check next if...
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
// Oh no, it was false, now we're here...
}
// Oh, but we hit return false; so we're fine
return false;
}
或者,完全避免特别提及true
或false
,因为从逻辑上说,您的功能只是and
将三个条件放在一起的结果:
bool Foam::solidMagnetostaticModel::read()
{
// No need to use ifs or explicit references to true/false at all
return regIOobject::read() &&
permeabilityModelPtr_->read(subDict("permeability")) &&
magnetizationModelPtr_->read(subDict("magnetization"));
}
答案 1 :(得分:1)
嵌套的if是问题。
不采用该分支时,没有其他可采用的路径
答案 2 :(得分:1)
else语句应在每种情况下(如果第一个if不为真)返回false。
正确,但是如果第一个if
条件为true,但是第二个if
条件为true,怎么办?
也就是说:如果regIOobject::read()
返回true
,但是permeabilityModelPtr_->read(subDict("permeability"))
返回false
会怎样?
然后,控制流进入第一个if
块,不返回,但不进入else
块(因为第一个条件为真),所以它刚好落在该功能而无需点击return
语句。
如果您希望else { return false; }
部分适用于任一条件,则可以天真地复制/粘贴它:
if (COND1) {
if (COND2) {
return true;
} else {
return false;
}
} else {
return false;
}
但这是很多代码重复。更好的解决方案是用单个条件替换嵌套的if
:
if (COND1 && COND2) {
return true;
} else {
return false;
}
仍然有一些重复:两个分支都包含一个return
语句,后跟一些表达式。
我们可以分解出公共部分(return
)并将条件推入表达式:
return COND1 && COND2 ? true : false;
但是? true : false
是多余的:如果条件为true,则求值为true,否则为false?好吧,这就是条件本身所做的:
return COND1 && COND2;
或使用您的具体表达方式:
return regIOobject::read()
&& permeabilityModelPtr_->read(subDict("permeability"))
&& magnetizationModelPtr_->read(subDict("magnetization"));