在c语言里变量的定义和声明?急急急!

(以谭浩强的c语言绿皮书为准啊)int a;是定义还是声明?谭浩强的书一会说是定义一会又说是声明!我都晕了!
int a;和int a=1;的区别?(我知道定义是分配存储空间;而声名不分配,但int a;到底分配没啊?我就纠结int a;和int a=1;还有我也知道external int a;绝对是声明!函数的都能理解)求高人指点迷津,小弟感激不尽!

int a;和int a=1;
这两个既可以叫声明,也可以叫定义,
“int a=1;”相当于“ int a;a=1;”两条语句,
“int a;”是简单地定义一个变量,编译器会为其在内存中分配一个内存单元,该内存单元中的值在上电后可能不确定,也可能编译器将未初始化的变量统一初始化为0;
如果这样定义:“int a=1;”那么编译器在为a变量分配内存的同时,还会负责将其初始化为1.

不知道这样说是否明白了?

LS不用纠结于是定义还是声明,关键是明白这两个语句代表了做什么就可以了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-30
//c语言的源码f1.c 用gcc汇编
int a;//全局定义
int b = 3;//全局变量
extern int c;//外部变量
void fun1(){
int d;//局部变量
int e = 12;
}
//gcc -S f1.c -o f1.s
// 汇编代码
.file "f1.c"
.comm _a, 16 # 4 ;将a做为连接时的标号,指定了大小
.globl _b ;将b做为全局的一个标号,分配了空间
.data
.align 4
_b:
.long 3
.text
.globl _fun1
.def _fun1; .scl 2; .type 32; .endef
_fun1:
pushl %ebp
movl %esp, %ebp
subl $16, %esp ;函数调用时,在栈中给局部变量分配空间
movl $12, -4(%ebp)
leave
re
;根本没有出现c,说明外部变量只用于编译检查,并没有生成代码,而是在汇编时处理的
第2个回答  2012-05-30
int a;是声明,int a=1;是定义,a=1;是为该变量赋值
声明为变量在内存中分配一个合适的存储空间追问

那书里为啥又说int a是定义 说是int a已经分配了空间 只是没有赋值而已,还有定义包含了声明吗?

第3个回答  2012-05-30
int a=1定义时付初值
相似回答