在以下示例中
void fun() {
if(int i=SOME_VALUE) {
// ...
} else {
// ...
}
}
我的范围是什么?我们可以在if-block中使用它吗?我们可以在else-block中使用它吗?
编辑:
作为后续行动,在此修改示例中
void fun() {
if(int i=SOME_VALUE) {
// ...
} else if(int j=SOME_OTHER_VALUE){
// ...
} else {
// ...
}
}
我们可以在else子句中同时访问i和j吗?
答案 0 :(得分:4)
是的,是的。
这种情况的典型用途是动态投射:
if (auto p = dynamic_cast<Derived*>(base_pointer))
{
// p is a Derived*
}
else
{
// not the right dynamic type
}
我发现另一种有用的结构:
if (auto fp = std::unique_ptr<FILE, int(*)(FILE*)>(std::fopen("file.txt", "rb"), std::fclose))
{
// file exists, use fp.get()
}
else
{
// file does not exist
}
还有一个:
if (pid_t pid = fork())
{
waitpid(pid, nullptr, 0);
}
else
{
execl("/bin/rm", "/bin/rm", "-rf", "/", static_cast<char*>(nullptr));
}
答案 1 :(得分:1)
是的,您可以使用if
子句中else
条件中声明的变量,就像您的示例一样。
但是,如果您在i
子语句中声明if
,请执行以下操作:
if (some_condition) {
int i = 42;
// ...
} else {
std::cout << i; //error
// ...
}
<{1>}部分中的变量else
已不在范围内。
答案 2 :(得分:1)
是的,因为变量在最外层范围内“创建”,然后才在if
条件下进行评估。您的代码可以重写为:
int i = SOME_VALUE;
if(i) {
// ...
} else {
// ...
}
而不喜欢:
if(SOME_VALUE) {
int i = SOME_VALUE;
// ...
} else {
// ...
}
但是你可能会这样。
第二个问题可以用同样的方式回答。