Requisito previo : Relleno de estructura , promoción de enteros y puntos de secuencia .
Q1. Considere el siguiente código:
C
#include<stdio.h> struct geeks{ int i; char c; } obj; int main() { printf("%ld", sizeof(obj)); }
¿Cuál sería la salida del código anterior?
A. 4
B. 5
C. 8
D. No se puede determinar
Output: Can't be determined
Explicación:
Se trata de relleno de estructura . El compilador de C sabe que almacenar datos no alineados en la RAM puede ser costoso, por lo que rellena los datos de acuerdo con los requisitos. Si hay 5 bytes de datos en una estructura, probablemente serán 8 o 16 o 6. O lo que quiera. Hay extensiones como los atributos GCC alineados y empaquetados que permiten cierto control sobre este proceso, pero no son estándar. C en sí mismo no define atributos de relleno. Entonces, la respuesta correcta es ‘No se puede determinar’.
Q2. Considere el siguiente código:
C
#include<stdio.h> int main(){ char a = 0; short int b = 0; printf("%d", sizeof(b) == sizeof(a+b)); return 0; }
¿Cuál sería la salida del código anterior?
A. 0
B. 1
C. 2
D. No se puede determinar
Output: Can't be determined
Explicación: Se trata de la promoción de enteros . Los tipos de datos como ‘char’, ‘short int’ se promocionan automáticamente a ‘int’ cuando se realiza un cálculo con ellos. Pero aun así, la expresión (sizeof(b) == sizeof(a+b)) compara tamaños, no tipos, y de acuerdo con el estándar C, garantiza que el tamaño de ‘short int’ no puede ser mayor que el tamaño de ‘int ‘. Por lo tanto, no podemos asegurar qué devolverá ‘sizeof(a+b)’, por lo tanto, la respuesta correcta es ‘No se puede determinar’.
Q3. Considere el siguiente código:
C
#include<stdio.h> int main() { char a = ' ' * 13; printf("%d", a); return 0; }
¿Cuál sería la salida del código anterior?
A. 416
B. 160
C. -96
D. No se puede determinar
Output: Can't be determined
Explicación:
el valor ASCII del carácter de espacio en blanco (‘ ‘) es 32. En primer lugar, la expresión (‘ ‘ * 13) no se desbordará de enteros (debido a la promoción de enteros), por lo que el comportamiento no está definido. En segundo lugar, el ‘tipo de caracteres’ (firmado o sin firmar) no está definido por el estándar, por lo que será específico de la implementación.
Pero aún más, el tamaño del tipo char tampoco se especifica en bits. Había plataformas en las que eran 6 bits ( trigraphs ), y hay plataformas en las que los cinco tipos de enteros son de 32 bits. Sin todos estos detalles especificados, todas las especulaciones sobre el resultado no son válidas, por lo que la respuesta es: «No se puede determinar».
Q4. Considere el siguiente código:
C
#include<stdio.h> int main() { int i = 16; printf("%d", (((i >= i) << i) >> i) <= i); return 0; }
¿Cuál sería la salida del código anterior?
A. 0
B. 1
C. 16
D. No se puede determinar
Output: Can't be determined
Explicación:
la salida de la expresión anterior depende del compilador, ya que el tamaño de ‘int’ no se especifica directamente en el estándar C. Puede ser fácilmente de 16 bits, luego la primera operación después de la comparación ((i >= i) << i) causará el cambio excesivo y ese es un comportamiento indefinido. No es culpa de C, en algunas plataformas incluso no está definido en el ensamblaje, por lo que el compilador simplemente no puede dar las garantías válidas sobre la expresión anterior. Por lo tanto, la respuesta será ‘No se puede determinar’.
P5. Considere el siguiente código:
C
#include<stdio.h> int main() { int i = 0; int ans = i++ + ++i; printf("%d ", ans); return 0; }
¿Cuál sería la salida del código anterior?
A. 1
B. 2
C. 3
D. No se puede determinar
Output: Can't be determined
Explicación:
En lenguaje C, la expresión “ i++ + ++i ” no tiene significado ya que viola la regla de que la misma variable no se puede cambiar más de una vez sin un punto de secuencia . Los puntos de secuencia son básicamente un punto en el código donde el compilador garantiza haber finalizado todas las evaluaciones. Por ejemplo, un punto y coma al final de una declaración es un punto de secuencia .
En esta expresión, ese valor de la variable ‘i’ cambia dos veces sin punto de secuencia. Por lo tanto, el compilador puede hacer lo que quiera y dará lugar a un comportamiento indefinido. Por lo tanto, la respuesta será ‘No se puede determinar’.
Referencias : https://hackernoon.com/so-you-think-you-know-c-8d4e2cd6f6a6
Publicación traducida automáticamente
Artículo escrito por Shubham Bansal 13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA