免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2628 | 回复: 10
打印 上一主题 下一主题

问一个变量定义和声明的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-15 23:25 |只看该作者 |倒序浏览
如下的程序
#include <stdio.h>
#include <stdlib.h>

int a;

int main(int argc, char *argv[])
{
  printf("%d",a);
  
  system("PAUSE");       
  return 0;
}
int a = 5;

运行的结果是5,可是我在main前面已经定义int a;了啊,而且全局变量默认初始化值为0,为什么printf里面用的是后面的那个定义而不前面的那个?

论坛徽章:
0
2 [报告]
发表于 2006-10-16 09:02 |只看该作者
int a = 5;这个才是定义。int a;是个声明。

论坛徽章:
0
3 [报告]
发表于 2006-10-16 09:04 |只看该作者
而且无论如何,全局变量都会在执行之前有初始化好了。

extern int a;
int main()
{
    ...
}
int a = 1;

这样 a的值在main中还是1,哪怕a定义在别的文件。

论坛徽章:
0
4 [报告]
发表于 2006-10-16 10:09 |只看该作者
#include <stdio.h>
#include <stdlib.h>

int a;

int main(int argc, char *argv[])
{
  printf("%d",a);
  
  system("PAUSE");      
  return 0;
}
int a = 5;          ###是不是这一句在编译的时候被提到了前面
                  ###就是这个样子

论坛徽章:
0
5 [报告]
发表于 2006-10-16 10:50 |只看该作者
#include <stdio.h>
#include <stdlib.h>

int a;

int main(int argc, char *argv[])
{
  printf("%d",a);
  
  system("PAUSE");      
  return 0;
}
int a = 5;   // 这个本来就是个全局变量的定义    与顺序无关.

论坛徽章:
0
6 [报告]
发表于 2006-10-16 11:07 |只看该作者
知道,可能是我没讲明白,我是想问编译的时候是不是将int=5提到main()之前
还有阿,我是新手但是发现你们水平都好高,所以想学习一下,所问之处难免幼稚,请大家多多包涵~~~
就是这个样子

论坛徽章:
0
7 [报告]
发表于 2006-10-16 12:30 |只看该作者
原帖由 flw2 于 2006-10-16 09:02 发表
int a = 5;这个才是定义。int a;是个声明。


晕,用C++编译器编译就报重定义错误,用C编译器编译才能通过,都是devcpp……

论坛徽章:
0
8 [报告]
发表于 2006-10-16 12:43 |只看该作者
关注楼上的问题。

论坛徽章:
0
9 [报告]
发表于 2006-10-16 13:05 |只看该作者
在C语言中,一个有外部链接的对象声明如果有初始化操作,是一个定义。如果没有初始化又没有extern关键字,则被认为是临时的定义,如果一个编译单元中没有其他地方对它进行定义,则该语句成为定义;如果发现其他地方有它的定义,则被认为是冗余的声明。

这里
int a; //临时定义
int a = 5; //定义

所以a的初始值是 5;

看来c对冗余声明不作为错误。

论坛徽章:
0
10 [报告]
发表于 2006-10-16 13:16 |只看该作者
原帖由 kaddmus 于 2006-10-16 12:30 发表


晕,用C++编译器编译就报重定义错误,用C编译器编译才能通过,都是devcpp……

c++  不是 c
int a;//1
int a = 5;//2
编译器首先认为1是个定义。如果在以后没有发现别的地方有类似的,它就是定义。
否则就认为是一个声明。

所以1是个声明。

没有什么好说的了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP