为什么我们会在括号内放置一段代码?

时间:2015-07-09 07:50:48

标签: c syntax coding-style

我遇到了这个C代码,我无法向自己解释:

 check_eeprom_data();
 {

     unsigned char serial_num[5];
     printStr("\nSerNUM:");
     eeprom_read(confEE_SERIAL_NUM, serial_num, 5);
     printBuffAsHex(serial_num, 5);

 }

为什么需要这些大括号来包含这部分代码?如果没有括号,会有什么不同?

8 个答案:

答案 0 :(得分:4)

大括号是允许简单的并行代码结构。也就是说,假设您想再次执行相同的操作。如果没有大括号,您将无法剪切和粘贴该代码块,可能需要进行修改。这是因为您只能在任何范围的顶部声明 serial_num 一次。所以它会像这样出现:

unsigned char serial_num[5];
printStr("\nSerNUM:");
eeprom_read(confEE_SERIAL_NUM, serial_num, 5);
printBuffAsHex(serial_num, 5);

printStr("\nSerNUM:");
eeprom_read(confEE_SERIAL_NUM, serial_num, 5);
printBuffAsHex(serial_num, 5);

请注意我怎么不能再次声明 serial_num ?所以我甚至不能保持块我必须删除该行。如果我想在我需要移动声明之前引入类似的块。如果我想更改 serial_num 的长度,我会被卡住,因为你只能在任何范围内声明 serial_num 一次。

使用花括号,我有一个平行的视觉结构(适用于带或不带修改的剪切和粘贴),我还可以灵活地在每个范围内声明不同长度的 serial_num

{
  unsigned char serial_num[5];
  printStr("\nSerNUM:");
  eeprom_read(confEE_SERIAL_NUM, serial_num, 5);
  printBuffAsHex(serial_num, 5);
}

{
  unsigned char serial_num[8];
  printStr("\nSerNUM:");
  eeprom_read(confEE_SERIAL_NUM, serial_num, 8);
  printBuffAsHex(serial_num, 8);
}

注意单独的作用域如何允许每个块独立处理它们而不会产生干扰?因此我可以重新排序块,即使它们使用相同的符号名称 serial_num ,也不用担心更改 serial_num 的声明。实际上,无论符号名称是否与其他块匹配,我都可以在本地为每个块声明 serial_num

这种常见模式用于增加不同局部代码块之间的隔离,这些代码块不应相互干扰,声明从一个块泄漏到下一个块。它可以保护您免受符号名称冲突的影响,并防止在您希望每个块保留局部风味时意外重复使用符号,尽管它们与周围的其他块类似。

答案 1 :(得分:3)

在C99之前,总是需要在块的开头(任何语句之前)定义变量。因此,如果您想要定义一个接近其使用位置的变量(如果它只有一个短的生命周期),那么引入一个块(即将一段代码括在大括号中)是有意义的,就像你的例子一样。问题

请注意,许多C编译器(特别是嵌入式编译器和臭名昭着的Microsoft Visual C编译器)支持C99的速度非常慢,因此即使在今天看到这种C89编码风格也并不罕见。

答案 2 :(得分:2)

在花括号内声明的局部变量只存在于那里(并且只在那里可见)。因此,当代码离开花括号时,块serial_num将被销毁

答案 3 :(得分:1)

可能存在该代码块以限制def __init__(self, url, *args, **kwargs): super(DmozSpider, self).__init__(*args, **kwargs) self.start_urls = [url] 的存在。当您在某些代码周围添加大括号时,您将创建一个新的范围块。

答案 4 :(得分:1)

因为在C89(和K& R C)中,声明必须位于的开头。请注意unsigned char serial_num[5];开幕后{的声明。优良作法是使变量的范围尽可能小,并在它们所用的最里面的块中声明它们。

在C99中,声明可以与代码混合,就像在C ++中一样。

答案 5 :(得分:1)

他们引入了一个新范围来限制serial_num的生命周期(以及内部的任何其他declration)。这样,关闭之后的代码不会受到这些变量的污染。

答案 6 :(得分:1)

在C99和C11中,可以在语句块中的任何位置引入新的局部变量,因此您的代码段中的大括号不是必需的。

但是,在C89中,新的本地(块范围)变量的声明只能在块的开头发生。因此,可以使用C89编译器编译在示例中编写的代码段。

答案 7 :(得分:1)

这用于限制变量的范围。

在你的情况下,

check_eeprom_data();
 {

  unsigned char serial_num[5];
  printStr("\nSerNUM:");
  eeprom_read(confEE_SERIAL_NUM, serial_num, 5);
  printBuffAsHex(serial_num, 5);
 }

您无法在范围之外使用serial_num

此外,在C99之前,在块开始时强制要求变量声明。因此,要在特定范围内定义和使用变量,请使用此样式/方法/技术。

让我们将它与一个简单的程序进行比较,以便更好地理解。

#include <stdio.h>

int main(void) {

    {                           //scope starts
        int p = 5;
            printf("%d", p);    //p is known here
    }                           //scope ends

    printf("%d", p);  // wait, what is p????

    return 0;
}

有关编译结果,请参阅 LIVE EXAMPLE