Afaik,代码中的每对{ }
都会创建一个新范围。即使它只是为了它使用而没有任何if
,for
,函数或其他要求它的语句:
void myFun(void)
{
int a;
{
int local;
}
}
我开始想知道 - 当if
语句是在不使用大括号(带有1行主体)的情况下编写的时候,它是否还会创建一个新的范围?
voidmyFun(int a)
{
int b;
if (a == 1)
int tmp; // is this one local to if?
else
int tmp2; // or this one?
b = 2; // could I use tmp here?
}
答案 0 :(得分:4)
N4140 [stmt.select] / 1读取:
selection-statement 中的子语句(每个子语句,
else
语句的if
形式)隐式定义块范围
所以,代码
if (a == 1)
int tmp; // is this one local to if?
else
int tmp2; // or this one?
相当于
if (a == 1)
{
int tmp; // yes, this one is local to if
}
else
{
int tmp2; // and this one as well
}
答案 1 :(得分:2)
是的,即使if和for没有{}
,其中声明的变量也是本地变量。
所以,如果你尝试类似
的话if ( something )
int a = 3;
std::cout << a; // there is no other identifier called a in your program
它不会编译,因为它与
相同if ( something )
{
int a = 3;
}
std::cout << a;
并且您将获得未在此范围错误中声明的变量。
所以,
voidmyFun(int a)
{
int b;
if (a == 1)
int tmp; // is this one local to if? Ans:- Yes
else
int tmp2; // or this one? Ans:- It is local to else block
b = 2; // could I use tmp here? Ans:- No
}
因此,else
(tmp2
)中的变量是else
的本地变量,而不是if
。
答案 2 :(得分:2)
总之 - 是的。这是一个单行范围。
换句话说,写作:
if (someCondition)
int i = 7;
在范围方面与写作相同:
if (someCondition)
{
int i = 7;
}
答案 3 :(得分:2)
是的! tmp
位于if
的本地,tmp2
位于else
的本地。如果您尝试在外部使用tmp
或temp2
,则应该获得未定义的变量错误。这是因为,
if(<condition>) <my-statment>
if(<condition>)
{
<my-statment>
}
对于编译器,它们都是相同的。