C 为什么我们要在大括号中放一段代码?

C 为什么我们要在大括号中放一段代码?,c,syntax,coding-style,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); } 为什么需要这些花括号来括起这部分代码?如果没有括号有什么不同?在C99之前,变量总是需要在块的开头(

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

 check_eeprom_data();
 {

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

 }

为什么需要这些花括号来括起这部分代码?如果没有括号有什么不同?

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


请注意,许多C编译器(特别是嵌入式编译器,以及臭名昭著的Microsoft Visual C编译器)支持C99的速度非常慢,因此即使在今天,这种类型的C89编码也并不少见。

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


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

该代码块可能是为了限制
序列号的存在。当你在一些代码周围放上大括号时,你正在创建一个新的作用域块。

这个代码块可能是为了限制序列号的存在。当你在一些代码周围放大括号时,你正在创建一个新的作用域块。

因为在C89(和K&R C)中,声明必须位于块的开头。注意
unsigned char serial_num[5]的声明在打开
{
之后。最好的做法是使变量的范围尽可能小,并在使用它们的最内层块中声明它们

<99),在C99中,声明可以与代码混合,如在C++中.< /p> ,因为在C89(和K&R C)中,声明必须位于块的开始处。请注意“代码>未签名CHAR SerialSnUn[5 ];{
。最好将变量的范围尽可能小,并在使用它们的最内层块中声明它们


在C99中,声明可以与代码混合,如C++中的。

< P>引入一个新的范围来限制<代码> SerialPurnNU<代码>的生命周期(以及内部的任何其他声明)。这样,关闭CRACE后的代码不会被这些变量污染。< /P> < P>它们引入了一个新的范围来限制<代码> SerialPalm NU<代码>的生存期>(以及内部进行的任何其他声明)。这样,结束字符后的代码就不会被这些变量污染。

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


然而,在C89中,一个新的本地(块范围)的声明变量只能出现在块的开头。因此,可以使用C89编译器编译您的示例中编写的代码段。

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


但是,在C89中,新局部(块作用域)变量的声明只能发生在块的开头。因此,可以使用C89编译器编译如示例中所述编写的代码段。

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

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

这用于限制变量的范围

就你而言

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;
}
#包括
内部主(空){
{//范围开始
int p=5;
printf(“%d”,p);//这里已知p
}//范围结束
printf(“%d”,p);//等等,p是什么????
返回0;
}

有关编译结果,请参见a

这用于限制变量的范围

就你而言

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;
}
#包括
内部主(空){
{//范围开始
int p=5;
printf(“%d”,p);//这里已知p
}//范围结束
printf(“%d”,p);//等等,p是什么????
返回0;
}

有关编译结果,请参见a

花括号的存在是为了简化并行代码结构。也就是说,假设您想再次执行相同的操作。如果没有花括号,您将无法剪切和粘贴该代码块,可能需要进行修改。这是因为您只能声明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?因此,我甚至无法保持块不变,我必须删除该行。如果我想在向上移动声明之前引入类似的块。如果我