有人能解释一下这段代码吗?(为什么要在这里加大括号)?

9

非常抱歉提出一个过于简单的问题,但是我似乎无法理解我正在阅读的书中的这个例子:

void f5()
{
    int x;
    {
        int y;
    }
}

什么是包围 `int y` 的大括号?你可以随意放置括号吗?如果可以,那么在什么情况下会这样做?这是否只是书中的错误?

2
这是一种技术,主要应用于C语言中,在第一条语句之后创建本地临时值。当执行退出结束花括号时,该范围内创建的所有变量都会消失。 - Thomas Matthews
7个回答

13

这样的大括号表示其中的代码现在处于不同的作用域。如果你试图在大括号外访问y,将会收到一个错误。


有道理,但让我困惑的是,我原以为那应该在一个函数内部。如果你只能在一个函数里放置大括号,我就不明白为什么你会需要使用嵌套函数--或者我理解错了吗? - Gary
4
一个函数有其自己的作用域,但它也可能在函数内部有作用域。这非常有用,例如C++对象具有析构函数,可以在对象超出作用域时的特定点释放资源。您可能希望在函数执行期间进行此操作。 - Benj

6

这是关于变量作用域的问题,例如:

void f5()
{
    int x = 1;
    {
        int y = 3;
        y = y + x;          // works
        x = x + y;          // works
    }
    y = y + x;              // fails
    x = x + y;              // fails
}

4

定义变量作用域。变量Y在大括号外部无法访问。


4

花括号表示作用域,变量x将在内部花括号的作用域中可见,但y将不会在它所在的花括号作用域之外可见。


3
花括号定义了一个作用域级别。在花括号之外,y 将不可用。

3

作用域退出时,内部对象被销毁。例如,您可以在括号中包含关键部分,并在那里构建一个锁对象。这样,当退出作用域(无论是正常退出还是因异常而退出)时,析构函数会自动调用,您就不必担心忘记解锁。


1

看起来像是一个错误(不知道上下文)

这样做会将值y封装在大括号内,因此在外部不可用。

当然,如果他们试图解释作用域,那么这可能是有效的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接