求C语言大神详解下这几个题,谢谢了。

如题所述

依次:
C)——因为局部变量的优先级高于全局变量,所以输出的是主函数中的x,它一直是0。
A)——printf不在for循环里,所以输出是最后一次func返回的结果。
D)——函数中的y=s[i--];由于i是静态变量且初值是3,所以实质输出是s[3]、s[2]、s[1]、s[0]。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-03-11
看得出来你学习C语言很认真,在学校经常给学弟学妹讲C语言二级课程,给你也解答一下吧
这几题主要用到的知识点就是静态变量(static)。在函数中,你定义的普通变量使用之后是不会储存函数值的,每次进入函数后这个变量的值都会被清空。
但static变量不同,它在函数中运算得到的结果会保存下来,下次函数再被调用时它的值是上次剩下的那个,不会被清空。有了这个基础,再来看这三个题目。
第一题:首先定义了一个全局变量x(在主函数的外面),又定义了一个sub函数。这个函数的意思很简单,就是累加a数组的各个元素赋给形参x。在这一题中,主函数也定义了一个局部变量x。根据C语言的规则,局部变量和全局变量同名时,局部变量优先,因此自动忽略全局变量x。所以,sub函数中的调用的x是一个局部变量,进入函数后它的值与数组的某元素相加,但函数结束后它的值不保存(是形参,而且是个普通的局部变量),所以输出的4个都是0(在主函数中x的值是0,所以四次下来x的值没改变,都是0),选C。已经编程验证过,绝对正确。如果要调用全局变量x,则把所有的x变成::x,这样就能调用
第二题:定义了func函数,它的目的要看懂。首先定义了一个静态变量z,它的值的变化可以保存。z的初值是3,每进入一次函数,z先赋值给x,再自加一次,最后返回x。由此可知,这个函数的结果跟调用的参数x无关,因为x的值被调用进入函数后会被x=z++改变,返回的实质上是z的值,y在这里不起任何作用。
在主函数中,a的初值是2。主函数里变量i循环两次,把func函数的返回值赋给b,最后printf。值得注意的是,在for循环里面,只有b=func(a++)紧紧跟着for。在for循环全部结束后,才执行printf。

如果这么写: for(i=0;i<2;i++)
{ b=func(a++);
printf("%d\n",b);
}
则i循环一次,就printf一次。但该题目里没有大括号,所以是把所有的i循环结束后才执行一次printf。注意区别。
现在来看主函数的过程,定义了变量后进入for循环,一共循环两次。第一次,i=0,a=2,运行b=func(a++)。由于前面分析了func()函数里的参数对函数结果不影响,影响的是z的值,所以压根就不看a++那一句,只看z的值。第一次进入函数时,z=3赋给x,然后z++变成4,函数的返回值是3。接下来第二次进入函数(i=1),由于z是静态变量,z=4的结果不会被清空,所以把z=4赋给x,然后z++变成5,函数的返回值是4。此时两次循环结束,退出循环,执行printf语句。由于函数的第二次返回值是4,这个值给了b,所以printf的结果是4,选A。绝对正确。

如果这一题把for循环改一下,for(i=0;i<100;i++),你也应该知道结果,就是3+100-1=102

第三题留给你自己思考吧,实在不会再来追问
第2个回答  2017-03-04
bad,,....,..........
第3个回答  2017-03-03
BBD追问

详解,我不要答案。

追答

那你可得好好看书了,涉及到好几个知识点

相似回答