C语言的花括号具体原理
在c语言中
如果有
void fun(void)
{
int a = 0;
int b = 1;
a = b;
//然后在声明变量c
int c = 0;
}
则程序编译不过
但是如下代码却可以编译通过
void fun(void)
{
int a = 0;
int b = 1;
a = b;
//然后在声明变量c
{
int c = 0;
}
}
为什么啊?能否从深层次点 比如从c语言和汇编 寄存器的角度给予解释?
[解决办法]
{ } 产生了一个局部域吧。
现在的C还是这个样子的吗?好生硬啊。不符合“需要时再定义”,收小范围的风格。我不喜欢。
[解决办法]
进入一个大括号,就进入了一个新的作用域。相当于在这个作用域的开始定义变量,与C语言定义变量的规则相符。
[解决办法]
int a = 0;
int b = 1;
a = b;
int c = 0;
是不是这样:
_a dd 0
_b dd 1
mov eax,[_b]
mov [_a],eax
_c dd 0 ;汇编成机器码后这里当指令执行,会引起错误
而:
int a = 0;
int b = 1;
a = b;
{
int c = 0;
}
则是:
_a dd 0
_b dd 1
mov eax,[_b]
mov [_a],eax
jmp _start
_seg:
_c dd 0
_start:
....
仅仅猜测而已,不知道是不是这样。以前写6502的程序时就犯过第一种的错误,把数据定义在代码中了
[解决办法]
void fun(void)
{
int a = 0;
int b = 1;
a = b;
//然后在声明变量c
int c = 0;
}
这种声明方式在C89规范中是不支持的。
但是在C99规范中,就是一个正确的使用方法,如果使用gcc编译,只要加上-std=c99选项,就可以编译通过了