Preguntas frecuentes de la entrevista de programación C | conjunto 3

P.1 ¿Escriba el código ejecutable más pequeño?  
Respuesta main es necesario para ejecutar el código. El código es

C

void main()
{
}
Producción: 

 

 

P.2 ¿Qué son los bucles de control de entrada y salida?  
Respuesta C admite solo 2 bucles:  

  1. Control de entrada : este bucle se clasifica en 2 parte 
    a. mientras bucle 
    b. en bucle
  2. Control de salida: en esta categoría, hay un tipo de bucle conocido como 
    a. hacer mientras bucle.

P.3 ¿Por qué la directiva de preprocesador no tiene un punto y coma al final?  
Respuesta El compilador necesita el punto y coma y, como sugiere el nombre, los preprocesadores son programas que procesan nuestro código fuente antes de la compilación. Por lo tanto, el punto y coma no es obligatorio.
P.4 ¿Cuál es la diferencia entre incluir el archivo de encabezado entre llaves angulares < > y comillas dobles ” “?  
Respuesta Si se incluye un archivo de encabezado dentro de < >, el compilador busca el archivo de encabezado en particular solo dentro de la ruta de inclusión integrada. Si se incluye un archivo de encabezado dentro de » «, entonces el compilador busca el archivo de encabezado en particular primero en el directorio de trabajo actual, si no lo encuentra, entonces en la ruta de inclusión integrada.
P.5 ¿Cuál es la diferencia entre punteros cercanos, lejanos y enormes? 
Respuesta Estos son algunos conceptos antiguos utilizados en las arquitecturas Intel de 16 bits en los días de MS DOS, que ya no son muy útiles. 
El puntero cercano se utiliza para almacenar medios de direcciones de 16 bits dentro del segmento actual en una máquina de 16 bits. La limitación es que solo podemos acceder a 64kb de datos a la vez. 
Un puntero lejano suele ser de 32 bits y puede acceder a la memoria fuera del segmento actual. Para usar esto, el compilador asigna un registro de segmento para almacenar la dirección del segmento, luego otro registro para almacenar el desplazamiento dentro del segmento actual. 
Al igual que el puntero lejano, el puntero enorme también suele ser de 32 bits y puede acceder al segmento externo. En el caso de punteros lejanos, se fija un segmento. En puntero lejano, la parte del segmento no se puede modificar, pero en enorme se puede 

Puntero cercano Puntero lejano
Su tamaño es de 2 bytes. Su tamaño es de 4 bytes.
Tienen la dirección entre 0-65535 (es decir, en el área de usuario) Tienen la dirección más de 65535 (es decir, fuera del área de usuario)
Por ejemplo:
punteros simples, que normalmente estudiamos en C y C++
Punteros que se utilizan en dispositivos, programas en ejecución, es decir, para atacar a otras computadoras a través de estos punteros lejanos.

P.6 ¿Por qué no existe “degradación de tipo” en lugar de “ascenso de tipo”? Además, consumiría menos recursos de espacio que al hacerlo desde el tipo de promoción.  
Respuesta Pongamos un ejemplo para entenderlo. 
Supongamos 
doble a=1.5; int b=10 y queremos calcular a+b 
Por degradación de tipo, el tipo flotante a se convertirá en int. Por lo tanto, a=1 y a+b=1+10=11, pero sabemos que la respuesta correcta es 11,5, que solo se obtendrá por tipo de promoción. Entonces la conclusión es que por tipo de degradación no obtendremos la respuesta correcta.
P.7 ¿Qué son las áreas de pila y montón? 

  1. Heap Area: Se usa para los objetos asignados dinámicamente (Usando malloc() y calloc()).
  2. Área de pila: se utiliza para almacenar variables locales y argumentos de un método. Esto permanece en la memoria solo hasta la finalización de ese método en particular.

Consulte la memoria stack vs heap para obtener más detalles. 
P.8 ¿Diferencia entre #include en C e import en Java?  
Respuesta  

#incluir importar
#include es una declaración, no una palabra clave. 
 
Mientras que import es una palabra clave.
Es procesado por un software de preprocesador. Es procesado por el compilador.
Aumenta el tamaño del código. No aumenta el tamaño del código. Aquí, incluso si escribimos 
import java.lang.*; 
no adjuntará toda la clase. Más bien, dará permiso para acceder a la clase de java.lang

P.9 ¿Diferencia entre ++*p, *p++ y *++p?  
1) La precedencia del prefijo ++ y * es la misma. La asociatividad de ambos es de derecha a izquierda. 
2) La precedencia del sufijo ++ es mayor que la de * y el prefijo ++. La asociatividad de postfix ++ es de izquierda a derecha.
(Consulte: Tabla de precedencia )
La expresión ++*p tiene dos operadores de la misma precedencia, por lo que el compilador busca asociatividad. La asociatividad de los operadores es de derecha a izquierda. Por lo tanto, la expresión se trata como ++(*p) . Por lo tanto, la salida del primer programa es » arr[0] = 10, arr[1] = 20, *p = 11 «.
La expresión *p++ se trata como *(p++) ya que la precedencia de postfix ++ es mayor que *. Por lo tanto, la salida del segundo programa es » arr[0] = 10, arr[1] = 20, *p = 20 «.
La expresión *++p tiene dos operadores de la misma precedencia, por lo que el compilador busca asociatividad. La asociatividad de los operadores es de derecha a izquierda. Por lo tanto, la expresión se trata como *(++p) . Por lo tanto, la salida del tercer programa es “ arr[0] = 10, arr[1] = 20, *p = 20
Consulte Diferencia entre ++*p, *p++ y *++p para obtener más información.
P.10 ¿Explicar Deep Copy y Shallow Copy con ejemplos? 
En el siguiente programa en C, la variable de estructura st1 contiene un puntero a la memoria asignada dinámicamente. Cuando asignamos st1 a st2, el puntero str de st2 también comienza a apuntar a la misma ubicación de memoria. Este tipo de copia se llama copia superficial

C

// C program to demonstrate shallow copy
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
 
struct test
{
  char *str;
};
 
int main()
{
  struct test st1, st2;
  st1.str = (char *)malloc(sizeof(char) * 20);
 
  strcpy(st1.str, "GeeksforGeeks");
 
  st2 = st1;
  st1.str[0] = 'X';
  st1.str[1] = 'Y';
 
  /* Since copy was shallow, both strings are same */
  printf("st1's str = %s\n", st1.str);
  printf("st2's str = %s\n", st2.str);
 
  return 0;
}
Producción: 

st1's str = XYeksforGeeks
st2's str = XYeksforGeeks

 

Para hacer Deep Copy , asignamos nueva memoria para miembros asignados dinámicamente y los copiamos explícitamente.

C

// C program to demonstrate deep copy
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
 
struct test
{
  char *str;
};
 
int main()
{
  struct test st1, st2;
  st1.str = (char *)malloc(sizeof(char) * 20);
 
  strcpy(st1.str, "GeeksforGeeks");
 
  st2 = st1;
 
  // We add extra statements to do deep copy
  st2.str = (char *)malloc(sizeof(char) * 20);
  strcpy(st2.str, st1.str);
 
  st1.str[0] = 'X';
  st1.str[1] = 'Y';
 
  /* Since copy was deep, both strings are different */
  printf("st1's str = %s\n", st1.str);
  printf("st2's str = %s\n", st2.str);
 
  return 0;
}
Producción: 

st1's str = XYeksforGeeks
st2's str = GeeksforGeeks

 

Artículos relacionados:

1. https://www.geeksforgeeks.org/commonly-asked-c-programming-interview-questions-set-1/ 
2. https://www.geeksforgeeks.org/commonly-asked-c-programming-interview- set-de-preguntas-2/

Publicación traducida automáticamente

Artículo escrito por AnshulVaidya 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 *