Рубрики

C | Классы хранения и классификаторы типов | Вопрос 19

Выход? (GATE CS 2012)

#include <stdio.h>

int a, b, c = 0;

void prtFun (void);

int main ()

{

    static int a = 1; /* строка 1 */

    prtFun();

    a += 1;

    prtFun();

    printf ( "\n %d %d " , a, b) ;

}

   

void prtFun (void)

{

    static int a = 2; / * строка 2 * /

    int b = 1;

    a += ++b;

    printf (" \n %d %d " , a, b);

}

(А) 3 1
4 1
4 2
(Б) 4 2
6 1
6 1
(С) 4 2
6 2
2 0
(D) 3 1
5 2
5 2

Ответ: (с)
Пояснение: «a» и «b» являются глобальной переменной. prtFun () также имеет 'a' и 'b' в качестве локальных переменных. Локальные переменные скрывают глобальные переменные (см. Правила области действия в C ). Когда prtFun () вызывается в первый раз, локальный 'b' становится 2, а локальный 'a' становится 4.
Когда prtFun () вызывается во второй раз, используется тот же экземпляр локальной статической «a» и создается новый экземпляр «b», потому что «a» является статическим, а «b» не является статичным. Таким образом, «b» снова становится 2, а «a» становится 6.
У main () также есть собственная локальная статическая переменная с именем «a», которая скрывает глобальную «a» в main. Оператор printf () в main () обращается к локальному 'a' и печатает его значение. Тот же оператор printf () обращается к глобальному 'b', поскольку в main нет локальной переменной с именем 'b'. Кроме того, значение по умолчанию для статических и глобальных переменных типа int равно 0. Поэтому оператор printf в main () печатает 0 как значение b.
Тест на этот вопрос

Рекомендуемые посты:

C | Классы хранения и классификаторы типов | Вопрос 19

0.00 (0%) 0 votes