if语句没有内部范围?

时间:2015-04-29 07:24:08

标签: c++ variables if-statement scope

Afaik,代码中的每对{ }都会创建一个新范围。即使它只是为了它使用而没有任何iffor,函数或其他要求它的语句:

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?
}

4 个答案:

答案 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
}

因此,elsetmp2)中的变量是else的本地变量,而不是if

答案 2 :(得分:2)

总之 - 是的。这是一个单行范围。

换句话说,写作:

if (someCondition) 
    int i = 7;

在范围方面与写作相同:

if (someCondition) 
{
    int i = 7;
}

答案 3 :(得分:2)

是的! tmp位于if的本地,tmp2位于else的本地。如果您尝试在外部使用tmptemp2,则应该获得未定义的变量错误。这是因为,

if(<condition>) <my-statment> 
if(<condition>) 
{ 
  <my-statment> 
}

对于编译器,它们都是相同的。