我遇到了一段代码百思不得其解,请看代码是C语言的
#include <stdio.h>
int a, b = 10;
void test()
{
a++;
printf("a=%d ", a);
int a = 0;
a++;
printf("a=%d\n", a);
}
int main()
{
test();
test();
test();
return 0;
}
这是C语言的代码,我想问为什么程序一开始a就直接成1了?不应该是10吗?
会不会是某处 a = 0了?
好奇怪啊
1
ss098 2015-06-17 00:36:36 +08:00 via iPad 1
int a, b=10; 等价于
int a; int b=10; |
2
moroumo 2015-06-17 00:37:33 +08:00
a在一开始不应该是内存随机数吗?
|
3
zhangchioulin OP @ss098我的天,原来如此
|
4
zhangchioulin OP 运行结果是:
a=1 a=1 a=2 a=1 a=3 a=1 |
5
Madimo 2015-06-17 00:38:34 +08:00 via iPhone 1
呃....其实最上面那个 int a, b = 10 只是把 b 初始化为10了,a的值其实是未定义的,运气好会是0。
如果按你说的应该是 int a = 10, b = 10; 这样 |
6
zhangchioulin OP @Madimo 谢谢!
|
7
ss098 2015-06-17 00:39:20 +08:00 via iPad
我好像没有看对问题,重新回答一遍。
第一条 a++ 是对全局的 a 赋值的,而 test() 中定义的是局部的。 |
8
zhangchioulin OP @moroumo 楼上解答了
|
9
ss098 2015-06-17 00:39:56 +08:00 via iPad
哦不 ... 刷新又出了这么多回答,我好像想多了。
|
11
weyou 2015-06-17 00:58:18 +08:00 1
a是一个全局变量, 放在静态(全局)数据区, 初始化时默认是0, 这个不是随机的。
|
12
sandideas 2015-06-17 00:59:42 +08:00 via iPhone
你们难道不知道c语言的全局变量会自动初始化为0么。???
|
16
Athrob 2015-06-17 02:00:34 +08:00
不明白为什么要写这种代码, 局部变量跟全局变量重名真的好吗, 看代码的人能理解为什么要这么写吗?
|
17
seki 2015-06-17 02:15:05 +08:00 1
这个问题给人一种熟悉的感觉,那感觉可以用三个字形容,谭浩强
|
19
loveuqian 2015-06-17 04:55:50 +08:00 via iPhone
逗号表达式
怎么还没学oc啊 |
20
loveuqian 2015-06-17 04:57:32 +08:00 via iPhone
int a = 10;
int b = a, 20; |
22
xvimer 2015-06-17 07:47:07 +08:00 1
有时候,局部变量和全局变量处理不好的话,编译也是可以通过的,然而,在链接的时候,链接器可以不动声色地影响程序的正确性。虽然题主的问题目前似乎和链接器关系不大,不过还是建议看看链接器方面的东西,对全局变量、局部变量什么的使用是很有好处的。
|
23
lifanxi 2015-06-17 09:05:06 +08:00
@moroumo
每个C程序员都需要一本ISO 9899,随时查阅。“全局变量”是会被保证自动初始化的,这是标准规定的,与编译器无关。 5.1.2 All objects with static storage duration shall be initialized (set to their initial values) before program startup. 6.2.4 An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. 6.7.8 If an object that has static storage duration is not initialized explicitly, then: — if it has arithmetic type, it is initialized to (positive or unsigned) zero; 不过@xvimer提醒得也很有道理,参考: http://coolshell.cn/articles/10115.html |
24
ChanneW 2015-06-17 09:06:26 +08:00
应该编译都通不过吧
|
26
xdeng 2015-06-17 09:25:31 +08:00
11楼正解
|
27
zhangchioulin OP @moroumo 默认情况下,全局变量初始值就是0
|
28
zhangchioulin OP @weyou 懂了,又修补了我的基础,谢谢!
|
29
zhangchioulin OP @xvimer 感谢回答,今天就会看!
|
30
zhangchioulin OP @weyou 正解
|
31
zhangchioulin OP @loveuqian 吐槽我。。。我想把基础学得牢靠点,我们这里的人都是专业术语。。。不学牢靠点都不知道怎么说话了
|
32
zhangchioulin OP @ChanneW 通过了系统是 优胜美地 C的编译器是Xcode带的
|
33
mocodo 2015-06-17 16:54:59 +08:00
@zhangchioulin 有些编译器会编译不过。不过变量不初始化就使用,一般编译器都会warning的吧。
|
34
loveuqian 2015-06-17 16:59:51 +08:00 via iPhone
@zhangchioulin
我这10天就把c讲完了,已经开始oc啦,10天就ui啦 |
35
loveuqian 2015-06-17 17:00:19 +08:00 via iPhone
@zhangchioulin
我这10天就把c讲完了,已经开始oc啦,10天后就ui啦 |
36
zhangchioulin OP @loveuqian 是我看的太慢了,一起加油!
|
37
louk78 2015-06-17 22:33:17 +08:00
a都没初始化
|
38
fulvaz 2015-06-18 04:39:59 +08:00
..............这么写代码会被打死
|