Estoy siguiendo los pasos de Barry Rountree, haciendo preguntas para ver quién puede resolver algunas preguntas difíciles que surgen en situaciones de programación en C. Tenga en cuenta que estoy considerando “C en la práctica” en lugar de “C como lo define el estándar”. Estos son dos idiomas diferentes. Como Barry me otorgó varios créditos por resolver sus preguntas difíciles, también les otorgaré una recompensa de crédito.
[ EDITAR : Ver más abajo. He agregado algunas nuevas preguntas difíciles.]
- (500 créditos: Resuelto. Vea el comentario de Sepehr Sameni a continuación, especialmente sobre la importancia de los puntos de secuencia ) .
En el código fuente de DOOM, sí, ese DOOM, por idSoftware, se ve el idioma P_Random()-P_Random()
para generar un número aleatorio firmado con una distribución triangular.
¿Qué preocupación de portabilidad plantea este modismo y por qué? ¿Cómo solucionaría esto y por qué funciona?
(Aquí hay un ejemplo de ese idioma en el código fuente de DOOM: @https: //github.com/id-Software/D…)
- (500 créditos: Resuelto. Vea el comentario de Stéphane Zuckerman a continuación para conocer la gran
restrict
ganancias que ofrece ) .
¿Cuál es el papel de la palabra clave restrict
C99? Dé un ejemplo concreto de su eficacia, no solo una reiteración de su definición.
- (1k créditos: Resuelto. Vea los comentarios de Vignesh Kannan a continuación. Todavía me encantaría saber de los usos prácticos reales que la gente ha encontrado para los símbolos débiles ) .
¿Qué es un símbolo débil y por qué usaría uno? Da un ejemplo concreto.
Haría más preguntas difíciles y / o asignaría recompensas más altas a algunos, pero todavía no tengo muchos créditos para otorgar.
Ok, entonces he decidido agregar algunas preguntas nuevas y difíciles.
1. (100 créditos: resuelto por Ray Doyle a continuación) La intención del siguiente código es proporcionar un búfer circular de 100 elementos. La idea es que en todo el rango de índices, obtendrá o establecerá solo uno de los 100 valores en el búfer circular, en virtud del direccionamiento del módulo.
Sin embargo, este código falla o produce resultados incorrectos en la mayoría de los sistemas cuando el índice es negativo. ¿Por qué?
#definir N (100)
int circular_buffer [N];
int get_from_circular_buffer (int index)
{
return circular_buffer [índice% N];
}
void put_in_circular_buffer (int index, int value)
{
circular_buffer [índice% N] = valor;
}
Repase su solución con un ejemplo concreto que demuestre el comportamiento erróneo. Explique qué garantía del lenguaje C lleva a este comportamiento.
2. (400 créditos: resuelto por Ray Doyle a continuación) Con base en la respuesta a la pregunta anterior, ¿qué implicación tiene esto en la relación entre estas dos expresiones? ¿Cómo se relaciona esto con la pregunta anterior? Proporcione un ejemplo concreto de dónde expresión_1 y expresión_2 terminan con resultados diferentes. (Debe responder a ambas partes y proporcionar un ejemplo concreto para los 400 créditos).
int x;
// supongamos que algunos conjuntos de códigos ‘x’ tienen un valor significativo aquí
int expresión_1 = x / 2;
int expresión_2 = x >> 1;
Nota: Soy consciente de que C no requiere implementaciones para firmar los cambios a la derecha extendidos. Deja esta implementación definida. Suponga que la implementación firma extender los desplazamientos a la derecha, de modo que desplazar a la derecha un número negativo produce un número negativo. Esta pregunta trata más sobre el comportamiento de la división que sobre el comportamiento del cambio.
3. (100 créditos: Resuelto por Ray Doyle a continuación.) ¿Cuál es la diferencia entre estas dos expresiones?
flotador a, b;
// supongamos que algunos conjuntos de códigos ‘a’ y ‘b’ tienen valores significativos aquí
expresión flotante_1 = 1.0 + a + b;
expresión_2 flotante = 1.0f + a + b;
4. (400 créditos: Resuelto por Ray Doyle a continuación) ¿ Cuándo darían resultados diferentes las expresiones de la pregunta anterior?
Proporcione un ejemplo concreto.
5. (200 créditos: Resuelto por Peter Poon a continuación.) ¿Por qué esta afirmación if nunca ejecuta su cláusula ‘entonces’? Suponga que x
es de tipo int
.
si (x & 1 == 0)
printf (“x =% d es par \ n”, x);
Dicho de otra manera, ¿por qué este programa no produce resultados?
#include
int main ()
{
int x;
para (x = 0; x <1000; x ++)
si (x & 1 == 0)
printf (“x =% d es par \ n”, x);
devuelve 0;
}