Рубрики

Язык C | Набор 3

Следующие вопросы были заданы на экзамене GATE CS.

1. Примите следующее объявление переменной C

 int *A [10], B[10][10];  

Из следующих выражений
И. А. [2]
II A [2] [3]
III B [1]
IV B [2] [3]
которые не приведут к ошибкам времени компиляции, если они будут использоваться как левые части операторов присваивания в программе на Си (GATE CS 2003)?

а) только I, II и IV
б) только II, III и IV
в) только II и IV
г) только IV

Ответ (а)
Смотрите ниже программу

int main()

  int *A[10], B[10][10];    

  int C[] = {12, 11, 13, 14};

  

  / * Нет проблем с оператором ниже, так как A [2] является указателем

     и мы присваиваем значение указателю * /

  A[2] = C; 

  

  / * Нет проблем с приведенным ниже оператором также как индексация стиля массива

      можно сделать с помощью указателей * /

  A[2][3] = 15;

  

  / * Простое присвоение элементу двумерного массива * /

  B[2][3]  = 15;

  

  printf("%d %d", A[2][0], A[2][3]);

  getchar();

}  

2. Рассмотрим следующее объявление двумерного массива в C:

 char a[100][100]; 

Предполагая, что основная память является адресуемой по байту и что массив хранится начиная с адреса памяти 0, адрес [40] [50] равен (GATE CS 2002)
а) 4040
б) 4050
в) 5040
г) 5050

Ответ (б)

Address of a[40][50] = 
     Base address + 40*100*element_size + 50*element_size
     0 + 4000*1 + 50*1
     4050

3. Язык Си есть. (GATE CS 2002)
а) язык без контекста
б) контекстно-зависимый язык
в) обычный язык
г) полностью разбирается только машиной Тьюринга

Ответ (б)
C и C ++ являются контекстно-зависимыми языками.

Есть несколько причин:

  1. Для разбора C и C ++ вы начинаете с использования очень мощного. Эти препроцессоры неизбежно пишутся от руки (они не основаны на теоретической основе, такой как регулярные выражения или грамматики без контекста).
  2. Грамматика неоднозначна: в ней есть конфликты LR, такие как конфликт if-then-else. Парсеры обычно разрешают это с помощью контекста («else» соответствует ближайшему «if»).
  3. Лексерам C и C ++ требуется лексическая обратная связь, чтобы различать имена и идентификаторы typedef. То есть, контекстно-зависимый лексер нуждается в помощи от «контекстно-свободного» парсера, чтобы различать идентификатор «foo» и имя определения типа «foo». В этом фрагменте
    int foo;
    typedef int foo;
    foo x;

    первый «foo» является идентификатором, в то время как второй и третий являются именами typedef. Вам нужно разобрать объявления typedef, чтобы понять это (и поскольку у типов есть вложенные скобки, это определенно так же сложно, как анализировать контекстно-свободный язык).
    Это означает, что синтаксический анализатор и лексер являются взаимно рекурсивными, поэтому нет смысла говорить, что синтаксический анализатор является контекстно-свободным, а лексер — контекстно-зависимым.

Ссылка: C и C ++ не являются контекстно-свободными


4 Наиболее подходящее соответствие для следующих пар (GATE CS 2000)

X: m=malloc(5); m= NULL;        1: using dangling pointers
Y: free(n); n->value=5;         2: using uninitialized pointers
Z: char *p; *p = ’a’;           3. lost memory is:

(а) X — 1 Y — 3 Z-2
(б) Х-2, Y-1, Z-3
(C) X-3 Y-2 Z-1
(d) X-3 Y-1 Z-2

Ответ (г)
X -> Указатель присваивается NULL без освобождения памяти, поэтому наглядный пример утечки памяти
Y -> Попытка получить значение после освобождения его таким висящим указателем.
Z -> Использование неинициализированных указателей

5. Рассмотрим следующую C-программу:

void foo(int n, int sum)

{

  int k = 0, j = 0;

  if (n == 0) return;

    k = n % 10; 

  j = n / 10;

  sum = sum + k;

  foo (j, sum);

  printf ("%d,", k);

}

  

int main ()

{

  int a = 2048, sum = 0;

  foo (a, sum);

  printf ("%d\n", sum);

    

  getchar();

}

Что печатает вышеприведенная программа? (GATE CS 2005)
(а) 8, 4, 0, 2, 14
(б) 8, 4, 0, 2, 0
(С) 2, 0, 4, 8, 14
(d) 2, 0, 4, 8, 0

Ответ (г)
sum не имеет смысла в foo (), ее просто путают. Функция foo () просто печатает все цифры числа. В основном после foo () есть еще один оператор printf, поэтому после всех цифр n печатается еще один 0.

Пожалуйста, пишите комментарии, если вы найдете какие-либо из приведенных выше ответов / объяснений неверными или хотите добавить больше информации о вопросах.

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

Язык C | Набор 3

0.00 (0%) 0 votes