如何避免这种嵌套的if语句



我想检查一个文件是否存在于两个不同的路径中。如果第一个没有,请检查第二个。

filepath1 = "/path1/file.txt"
filepath2 = "/path2/file.txt"
file_descriptor = open(filepath1)
if ( !file_descriptor.open() )
{
print("file 1 did not work");

//try file 2
file_descriptor = open(filepath2);
if( !file_descriptor.open() )
{
print("could not open file 2. exiting.");
return false;
}
}
//we get here and file_descriptor should point to a valid file
read_file(file_descriptor);
return true;

如何避免嵌套的if语句?为了可读性,我最好不要嵌套if语句。这里的问题是,如果第一个语句有效,我不希望它检查第二个if语句。

我考虑过使用:

  • goto(我想避免这种情况(
  • 布尔值来检查一个是否有效(但现在我引入了额外的变量(

我想这种模式很普遍:你可以尝试任意多的路径:

auto filepath1 = "/path1/file.txt";
auto filepath2 = "/path2/file.txt";
// We assume file_descriptor has been declared earlier
for (const auto fpath: {filepath1, filepath2})
{
file_descriptor = open(fpath)
if (file_descriptor.open()) 
break;
else
printf("file %s did not workn", fpath);  
}
if (!file_descriptor.open()) return false;  // or throw
read_file(file_descriptor);
return true;

如果你不在乎打开哪个文件,你可以进行

filepath1 = "/path1/file.txt"
filepath2 = "/path2/file.txt"
if (!(file_descriptor = open(filepath1)).open() &&
!(file_descriptor = open(filepath2)).open())
{
print("could not open file 1 nor 2. exiting.");
return false;
}
...

否则,如果您真的只想要一个if,则可以进行

filepath1 = "/path1/file.txt"
filepath2 = "/path2/file.txt"
if (!(file_descriptor = open(filepath1)).open() &&
(print("file 1 did not work"),
!(file_descriptor = open(filepath2)).open()))
{
print("could not open file 2. exiting.");
return false;
}
...

但这使得代码不如两个ifs 清晰

附言:不要考虑使用goto

相关内容

  • 没有找到相关文章

最新更新