【问题标题】:Function of curly bracket without keyword unclear [duplicate]没有关键字的大括号的功能不明确[重复]
【发布时间】:2013-08-21 03:03:15
【问题描述】:

我在一个程序中发现了那个代码片段

   {
      Aux_U16 =  16;

   }

所以问题是:为什么会有这个大括号。没有可见 if 或 switch 之类的关键字。

那么在编程语言C中什么函数有花括号,如果它们没有任何关键字编写

【问题讨论】:

标签: c


【解决方案1】:

{} 括号定义scope。这些括号必须在任何函数或方法中。 如果你在一个函数中,你可以拥有{} 块。

注意:-如果您只是添加它们并在没有任何作用域的情况下进行编译,则会出现编译时错误。

【讨论】:

    【解决方案2】:

    它有时很好,因为它为您提供了一个新范围,您可以在其中更“干净”地声明新的(自动)变量。

    那些大括号控制着变量的作用域。而且由于具有自动存储的变量在超出作用域时会被销毁。

    它只是隔离实现特定(子)目的的代码块。很少有单个语句达到我想要的计算效果;通常需要几个。

    【讨论】:

    • 是的,除了 C 没有析构函数 :)
    • @CapelliC... 是的,s my mistake... But if I check any program with objdump` util 我找到了一个名为DTOR的部分...那是什么?
    【解决方案3】:

    通常它们用于限制变量的范围,但在您的示例中 Aux_U16 = 16; 没有定义新变量,因此必须有一个名为 Aux_16 的预先存在的变量,并且超出块它将继续在块中具有上次设置的任何值。

    限制范围允许您创建一个名为i 的新变量,而无需考虑该块之外的任何i 的状态——不幸的是,就像您给出的示例一样,编译器不会注意到定义和赋值之间的区别,您最终可能会破坏您认为已保护的变量。

    以这种方式查找内容的另一个常见原因是简单的剪切和粘贴。像这样的独立积木并没有什么问题,有时人们只是忘记删除剩菜。或者他们可能在那里有临时变量,直到他们编辑了代码然后他们离开了。或者他们可能将其作为对自己的说明,即块内的代码属于一起。

    【讨论】:

    • 为什么编译器不会注意到定义和赋值之间的区别?定义不需要类型吗?
    • 我的意思是,编译器不会引发错误,因为您认为是定义(如果您认为)实际上是一个赋值,因为您忘记使用类型并且命名变量已在父范围中定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2012-12-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多