| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4528 人关注过本帖
标题:我是斑竹。。。。。。
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
以下是引用vandychan在2011-8-25 19:07:09的发言:

全局变量与局部变量


别这么语焉不详嘛斑竹,到底是为什么呢?难道是全局变量就允许写两次定义么?那既然是这样,为什么我写:

int i = 10;
int i = 20;

却告诉我编译错误呢?

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-08-25 19:14
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:1 
回复 48楼 StarWing83
因为全局变量在连接的时候会合并成一个变量,所以允许重复声明,但是不允许重复定义。
如果这样写编译器就会扔给你个重复定义的错误:
程序代码:
int i = 0;
int i = 0;

...

int main(int argc, char * argv) {
    ...
}


局部变量不允许重复声明。
2011-08-25 19:18
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
以下是引用voidx在2011-8-25 19:18:25的发言:

因为全局变量在连接的时候会合并成一个变量,所以允许重复声明,但是不允许重复定义。
如果这样写编译器就会扔给你个重复定义的错误:
int i = 0;
int i = 0;

...

int main(int argc, char * argv) {
    ...
}

局部变量不允许重复声明。


哦?是么?难道

int i;

就不是定义?你心目中的定义是什么?是不是非要赋初始值才是定义呢?

还有哦,这问题是问斑竹的~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-08-25 19:29
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 53楼 StarWing83
正是这样,赋初值才叫做定义。不赋初值叫做声明,嗯~至少 gcc 是这样
2011-08-25 20:05
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
以下是引用voidx在2011-8-25 20:05:27的发言:

正是这样,赋初值才叫做定义。不赋初值叫做声明,嗯~至少 gcc 是这样


呵呵,还真会以其昏昏使人昭昭,那我问你:

int main(void)
{
    int i; // 请问这里是定义还是声明?

    return 0;
}

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-08-25 20:56
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
收藏
得分:1 
通常来讲:声明在编译的时候是不会申请空间的,只有定义了才会申请内存空间
楼上所写的那个例程,可以看看他的汇编指令,有没有申请空间,就清楚了!
如果在程序中用到这个变量,编译器会隐性的去定义这个变量,而这个变量所指的内存
空间里的值会是垃圾数据.
声明不一定不是定义,而定义一定是定义。
还要看具体的编译器和程序!
不知道这样说对不?
2011-08-25 21:16
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
以下是引用Luminal在2011-8-25 21:16:29的发言:

通常来讲:声明在编译的时候是不会申请空间的,只有定义了才会申请内存空间
楼上所写的那个例程,可以看看他的汇编指令,有没有申请空间,就清楚了!
如果在程序中用到这个变量,编译器会隐性的去定义这个变量,而这个变量所指的内存
空间里的值会是垃圾数据.
声明不一定不是定义,而定义一定是定义。
还要看具体的编译器和程序!
不知道这样说对不?


这年头的C语言程序员,真是把老毛那套经验主义学得是淋漓尽致。哎,难怪现在程序员素质这么差。不讲究严谨性的程序员对行业可是毁灭性的冲击呀~哎~

你的第一句话是对的
第二句话是扯淡
后面的话,直接就是自己的臆想

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-08-25 21:24
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 55楼 StarWing83
那里是声明。
你也不要不停的说别人不对,自己用 gcc 试试编译下面的代码,看看他给你的错误不就得了。
程序代码:
int i = 0;
int i = 0;

int main() {
    int j, j, k = 0, k = 0;
    return 0;
}


如下图
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 voidx 于 2011-8-25 21:44 编辑 ]
2011-08-25 21:40
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
收藏
得分:0 
也许我是在扯淡,不过没关系,哈哈!
我也不敢和严谨的程序员扯蛋啊!
向学习他们还来不及呢!
2011-08-25 21:42
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
难道你不觉得自己就是在扯淡吗?

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-08-25 21:46
快速回复:我是斑竹。。。。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073228 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved