一个C语言的问题,求大神解答原因!

不多说,直接上图!

1、sub1中的变量a,b是其所在文件中定义的,其中a是静态全局变量,b是全局变量
a会默认初始化为0,因此第一次执行sub1()时输出结果中a=0+2=2, b=3+3=6。
sub2中的变量a是其所在文件中定义的静态全局变量,因为与sub1()所处不同文件,因此变量a是不同的;而变量b是与另一个文件共享的全局变量。因此第一次执行sub2()时输出结果中a=10+10=20, b=6+2=8。
再次执行sub1(),a=2+2=4, b=8+3=11
再次执行sub2(),a=20+10=30, b=11+2=13
最后在main函数中输出的a仍然是文件中的静态全局变量,a=4,而b=13

2、注释1去掉static,a变为全局变量,但不会产生影响,因为sub2中仍使用的是其文件内定义的静态全局变量

3、加上注释2的语句后,sub1中的变量a变为其函数内定义的局部变量,每次进入都重新初始化为5
而b不受影响,sub2()中执行也不受影响,只列出与1中不同的输出结果
因此,第一次sub1(), a=5+2=7
第二次sub1(), a=5+2=7
最后main函数中的a是文件中的静态全局变量,其值为初始值,即a=0

4、加上static后,sub1中的变量a变为静态局部变量,在运行初始化时其值为5,之后进入函数不再初始化,其余不受影响(与3中相同)
因此,第一次sub1(), a=5+2=7
第二次sub1(), a=7+2=9
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-05-13
变量和函数的存储类以及链接性有关

一个C语言的问题,求大神解答原因!
1、sub1中的变量a,b是其所在文件中定义的,其中a是静态全局变量,b是全局变量 a会默认初始化为0,因此第一次执行sub1()时输出结果中a=0+2=2, b=3+3=6。sub2中的变量a是其所在文件中定义的静态全局变量,因为与sub1()所处不同文件,因此变量a是不同的;而变量b是与另一个文件共享的全局...

一道c语言编程题求大神解答,找一下我错在哪了,谢谢了?
没有语法错误,只能说明在格式上没有找到错误,还不一定是正确的,更不要说能够正确执行了。没有语法错误,有三种可能:1、格式没问题,但算法错误;2、格式没问题,但不符合要求,导致计算结果错误;3、格式没问题,且算法没问题,能够计算出正确结果。只有符合第3种情况,才是正确的程序。

C语言问题,求大神解决,谢谢啦,我是小白,最好能够解释下。
题中,a=3 ,二进制为:0011;b=6,二进制值为:0110。所以(a^b)按位异或后的值为0101也就是5,左移两位后值(二进制)为:010100 也就是 :20

c语言的题,求大神解答
题1:i++先进行表达式运算,最后再自增;++i先自增,再进行表达式运算,从结果上看最终都会导致i+1,所以结束后i,j,k都分别加1了。题2:C的写法就是强制类型转换,a1+a2的结果本来还是int,但是被强制转换成了char。A、B是普通的加法运算,D是可以说是赋值运算 ...

C语言问题,求大神解决,谢谢啦,我是小白,最好能够解释下原因..
第一项的结果不正确。第二项和第四项结果等同都是指向指针的指针操作。可以将二维数组看成一个双重指针,第一个中括号是一个一重指针。比如说a[n][m]中a[0]是一个指向a[0][m]数组首位a[0][0]的指针,而a则是指向指针数组*a[n]的首位a[0]的指针。这样我们来看B选项,*(a+2)表示一...

C语言的一道题不会做了,求大神帮一下
第一题: a=4,b=8, 所以 (b==a) 为假,假就是 0,c= (b==a); c 得 0。语句中 a,b 数值 未发生过变化,保持初始值 a=4,b=8。所以输出 a,b,c 印出: 4,8,0 第二题:输入58,a=58;a>50 的条件成立,输出a值,印58 a>40 的条件成立,输出a值,印58 a>...

发现了一个有趣的c语言问题,请各位大神帮忙解释一下。
1.之所以再次编译值不改变,乃是因为系统在加载可执行镜像时所选取的栈的初始地址是相对固定的,a就在这个栈上,而且程序开始到main函数执行,这是一段按部就班的例程,没有什么变数,所以a的地址不变是可以理解的。2.scanf("%d",20000)这句合法并没有什么难以理解的地方,因为指针归根到底也只是一...

大神帮忙看看,c语言题目,要有解析!!
A 运行正确,结果输出正确。B 运行正常,输出不正确,原因:union缺省赋值是给第1个元素。C 运行不正常。原因:comm={12.5} 后 缺少语句结束符 ;D 运行不正常。原因:comm=5; union 赋值语法错误

C语言问题,求大神解决,谢谢拉。。我是小白,解释下原因
主要考察你c语言三目运算符的结合方向 是自右向左的 所以a<b?a:c<d?c:d 可以看成 a<b?a: (c<d?c:d) 1 < 4 ? a : (c < d ? c:d)括号内的表达式也可以看做是一个元素 因为 a = 1 b = 4 所以 条件 a < b 成立 所以选前者 a 答案就是 A) 1 ...

c语言小问题,向大神求解。。
原因:int i=8,j=9;printf("i=%%d,j=%%%d\\n",i,j);\/\/因为%%表示输出一个%号,i=%%d,则输出i=%d,j=%%%d,前面两个%%输出一个%,后面%d的值为i值,i=8,则输出j=%8 加起来就是i=%d,j=%8 第二个问题:int a[][3]={8} ,第一个忽略不写,编译器会在编译的时候指定计算,比如这...

相似回答
大家正在搜