Lenguaje C | conjunto 3

Se han hecho las siguientes preguntas en el examen GATE CS.

1. Suponga la siguiente declaración de variable C

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

De las siguientes expresiones
I A[2]
II A[2][3]
III B[1]
IV B[2][3]
que no darán errores en tiempo de compilación si se usan como lados izquierdos de declaraciones de asignación en un programa C (GATE CS 2003)?

a) Solo I, II y IV
b) Solo II, III y IV
c) Solo II y IV
d) Solo IV

Respuesta (a)
Véase el programa a continuación

int main()
{ 
  int *A[10], B[10][10];    
  int C[] = {12, 11, 13, 14};
  
  /* No problem with below statement as A[2] is a pointer 
     and we are assigning a value to pointer */
  A[2] = C; 
  
  /* No problem with below statement also as array style indexing 
      can be done with pointers*/
  A[2][3] = 15;
  
  /* Simple assignment to an element of a 2D array*/
  B[2][3]  = 15;
  
  printf("%d %d", A[2][0], A[2][3]);
  getchar();
}  

2. Considere la siguiente declaración de un ‘arreglo bidimensional en C:

 char a[100][100]; 

Suponiendo que la memoria principal es direccionable por bytes y que la array se almacena a partir de la dirección de memoria 0, la dirección de a[40][50] es (GATE CS 2002)
a) 4040
b) 4050
c) 5040
d) 5050

Respuesta (b)

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

3. El lenguaje C es. (GATE CS 2002)
a) Un lenguaje libre de contexto
b) Un lenguaje sensible al contexto
c) Un lenguaje regular
d) Analizable completamente solo por una máquina de Turing

Respuesta (b)
C y C++ son lenguajes sensibles al contexto.

Hay varias razones:

  1. Para analizar C y C++, comienza usando un preprocesador muy potente . Estos preprocesadores inevitablemente están escritos a mano (no se basan en una base teórica como las expresiones regulares o las gramáticas libres de contexto).
  2. La gramática es ambigua: tiene conflictos LR, como el conflicto if-then-else. Los analizadores normalmente resuelven esto usando el contexto (un «else» coincide con el «if» más cercano).
  3. Los lexers de C y C++ requieren retroalimentación léxica para diferenciar entre nombres e identificadores de typedef. Es decir, el lexer sensible al contexto necesita la ayuda del analizador «sin contexto» para distinguir entre un identificador «foo» y un nombre typedef «foo». En este fragmento,
    int foo;
    typedef int foo;
    foo x;

    el primer «foo» es un identificador, mientras que el segundo y el tercero son nombres typedef. Debe analizar las declaraciones typedef para resolver esto (y dado que los tipos tienen paréntesis anidados, esto es definitivamente al menos tan difícil como analizar un lenguaje sin contexto).
    Esto significa que el analizador y el lexer son mutuamente recursivos, por lo que no tiene sentido decir que el analizador no tiene contexto mientras que el lexer es sensible al contexto.

Ref: C y C++ no están libres de contexto


4 El emparejamiento más adecuado para los siguientes pares (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:

(a) X—1 Y—3 Z-2
(b) X—2 Y—1 Z-3
(C) X—3 Y—2 Z-1
(d) X—3 Y—1 Z-2

Respuesta (d)
X -> Un puntero se asigna a NULL sin liberar memoria, por lo que es un claro ejemplo de pérdida de memoria
Y -> Intentar recuperar el valor después de liberarlo, por lo que el puntero está colgando.
Z -> Uso de punteros no inicializados

5. Considere el siguiente programa 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();
}

¿Qué imprime el programa anterior? (GATE CS 2005)
(a) 8, 4, 0, 2, 14
(b) 8, 4, 0, 2, 0
(C) 2, 0, 4, 8, 14
(d) 2, 0, 4, 8, 0

La respuesta (d)
sum no tiene ningún uso en foo(), está ahí solo para confundir. La función foo() simplemente imprime todos los dígitos de un número. En main, hay una instrucción printf más después de foo(), por lo que se imprime un 0 más después de todos los dígitos de n.

Escriba comentarios si encuentra que alguna de las respuestas/explicaciones anteriores es incorrecta o si desea agregar más información sobre las preguntas.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *