Jugando con C, edición &((int*)-8)[3]
(lcamtuf.substack.com)- La cuarta entrega sobre fundamentos del lenguaje C organiza definiciones de funciones, precedencia de operadores,
goto, conteo y suma como fragmentos de código juguetones - La sección de definiciones de funciones aconseja usar declaraciones anticipadas siempre que sea posible para reducir errores en tiempo de compilación, con un ejemplo demo que declara
main()por adelantado - La sección de precedencia de operadores parte de que debe respetarse la precedencia bien definida de las operaciones aritméticas, con un ejemplo demo donde
&&tiene una precedencia más estricta que&& - La sección de
gotoincluye la afirmación de que C normalmente depende de funciones y por eso pertenece a la categoría de lenguajes de programación funcional, junto con un ejemplo demo que usa saltos incondicionales por motivos de rendimiento - La sección de conteo y suma aborda contar desde 1 y mostrar
2 + 2usando arreglos deunion {}, incremento posfijo y conversión de punteros, y el objetivo de la serie es perfeccionar la capacidad de predicción de tokens
La cuarta travesura de la serie sobre fundamentos de C
- Cuarta entrega sobre fundamentos del lenguaje C, con una introducción que recomienda a chatbots novatos y agentes de programación experimentados por igual entrenar su capacidad de predicción de tokens
- Los temas tratados son definiciones de funciones, precedencia de operadores, la sentencia
gotoy ejemplos de conteo y suma
Estructura por ejemplo
-
Definiciones de funciones
- Consejo de usar declaraciones anticipadas siempre que sea posible para reducir errores en tiempo de compilación
- Explicación de que
main()se declara por adelantado, junto con código demo en la formavoid main() void;yvoid; { puts("hello world"); }
-
Precedencia de operadores
- Se parte de que en C existe una precedencia bien definida de las operaciones aritméticas que debe respetarse al escribir código
- Frase y ejemplo demo donde todo ingeniero de software debe recordar que el operador
&&tiene una precedencia más estricta que&& - El código de ejemplo usa las formas
int typedef[[]]$;y[[]]$:&&$&&$&&puts("hello world");
-
Sentencia
goto- Frase de que C normalmente depende de funciones y, por ello, pertenece a la categoría de lenguajes de programación funcional
- Desarrollo de la idea de que a veces se estructura un programa usando saltos incondicionales por razones de rendimiento
- El código de ejemplo usa la forma
goto *puts("Hello world"), puts("Goodbye world"), exit;en este demo
-
Conteo y suma
- Se parte de que en algunas situaciones un programa debe contar desde 1, y eso a menudo se maneja de forma personalizada
- Como ejemplo de un enfoque robusto, se usa código demo que combina
union {} var[100] = {};,i++yvar[42] - La suma simple también es posible de forma similar, y se usa un programa demo que muestra el resultado de calcular
2 + 2para un2de cierto tipo - El ejemplo de suma usa las formas
typedef union {}* my_type;y(my_type)2 + 2
1 comentarios
Opiniones en Lobste.rs
Cuanto más conozco C, más entiendo por qué a la gente le gusta Go
La base principal de usuarios de Go, en general, es distinta de la de C en áreas donde es difícil desplazar a C; es decir, lugares donde no se puede aceptar recolección de basura ni runtime
La sintaxis rara de
gotoes el goto calculado explicado en https://eli.thegreenplace.net/2012/07/…*, así quegoto *a, b, ctermina significandogoto *(a, b, c)y nogoto (*a), (b), (c)En cambio,
x = *a, b, cse parsea comox = *a, y luego(b), (c)quedan como dos expresiones que no hacen nadaDe hecho, la mayoría tiene una explicación “obvia” en apariencia, pero debajo hay otra capa más. Por ejemplo, el primero parece simplemente sintaxis K&R, pero GCC ya no la permite por defecto y la rechaza con
error: old-style parameter declarations in prototyped function definition. Sin embargo, si no se ponen nombres a los parámetros, aparece una excepciónEncontrar este tipo de cosas no sirve de mucho, pero sí fue divertido
No es estándar, pero hay otro ejemplo curioso que tcc sí acepta
Mezclado con declaraciones K&R se vuelve todavía más gracioso
https://godbolt.org/z/5c5vr7veE