我遇到了这个C代码,我无法向自己解释:
check_eeprom_data();
{
unsigned char serial_num[5];
printStr("\nSerNUM:");
eeprom_read(confEE_SERIAL_NUM, serial_num, 5);
printBuffAsHex(serial_num, 5);
}
为什么需要这些大括号来包含这部分代码?如果没有括号,会有什么不同?
答案 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