嵌套 if 中没有返回评估
No return evaluation in nested if
在仔细观察以下代码后,我不明白为什么编译器会用"警告:控制到达非无效函数的末尾"来警告我。
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
}
else
{
return false;
}
}
我看不出问题出在哪里,else 语句应该关心在每种情况下返回 false,第一个 if 不真实。
当regIOobject::read()
为 true 但permeabilityModelPtr_->read(subDict("permeability"))
或magnetizationModelPtr_->read(subDict("magnetization"))
为假时跟踪代码路径。在这种情况下,您输入顶部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"));
}
嵌套的if是问题所在。
如果不采用该分支,则没有其他路径可走
else 语句应该注意在第一个 if 不为真的每种情况下返回 false。
正确,但如果第一个if
条件为真,但第二个if
条件不为真怎么办?
也就是说:如果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
是多余的:如果条件为真,则评估为真,否则评估为假?好吧,这就是条件本身的作用:
return COND1 && COND2;
或者用你的具体表达:
return regIOobject::read()
&& permeabilityModelPtr_->read(subDict("permeability"))
&& magnetizationModelPtr_->read(subDict("magnetization"));
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- std::condition_variable::wait()如何评估给定的谓词
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 嵌套 if 中没有返回评估
- 尝试创建一个评估字符的bool函数,如果字母数字为字母,则返回true