📜  C |存储类和类型限定符|问题19

📅  最后修改于: 2021-05-28 05:56:33             🧑  作者: Mango

输出? (GATE CS 2012)

#include 
int a, b, c = 0;
void prtFun (void);
int main ()
{
    static int a = 1; /* line 1 */
    prtFun();
    a += 1;
    prtFun();
    printf ( "\n %d %d " , a, b) ;
}
   
void prtFun (void)
{
    static int a = 2; /* line 2 */
    int b = 1;
    a += ++b;
    printf (" \n %d %d " , a, b);
}

(A) 3 1
4 1
4 2
(B) 4 2
6 1
6 1
(C) 4 2
6 2
2 0
(D) 3 1
5 2
5 2

答案: (C)
说明: ‘a’和’b’是全局变量。 prtFun()还具有“ a”和“ b”作为局部变量。局部变量隐藏了全局变量(请参见C中的作用域规则)。第一次调用prtFun()时,本地’b’变为2,而本地’a’变为4。
当第二次调用prtFun()时,将使用本地静态“ a”的相同实例,并创建新的“ b”实例,因为“ a”是静态的而“ b”是非静态的。因此,“ b”再次变为2,而“ a”变为6。
main()还有一个自己的局部静态变量,名为“ a”,它在main中隐藏了全局变量“ a”。 main()中的printf()语句访问本地’a’并打印其值。相同的printf()语句访问全局’b’,因为main中没有名为’b’的局部变量。同样,静态和全局int变量的默认值是0。这就是为什么main()中的printf语句将0打印为b的原因。
这个问题的测验

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。