¡Explore en profundidad la función printf y el autoincremento y autodecremento en lenguaje C!
Este problema surgirá si los libros de texto que no establecen claramente que el comportamiento no está definido simplemente no cumplen con los estándares.
Base estricta de por qué el uso aquí es un comportamiento indefinido (LZ necesita agregar conocimiento sobre puntos de secuencia):
ISO C99:
3.4.3 p>
1 Comportamiento indefinido
Cuando se utilizan estructuras de programa no portátiles o incorrectas o datos incorrectos,
Esta Norma Internacional no impone requisitos
2 Tenga en cuenta que el posible comportamiento indefinido varía desde ignorar por completo situaciones con resultados impredecibles, hasta comportarse de una manera de registro específica del entorno durante la traducción o ejecución del programa (ya sea emitiendo o no mensajes de diagnóstico), hasta finalizar la traducción o ejecutar (emitir un mensaje de diagnóstico). ).
3 Ejemplo Un ejemplo de comportamiento indefinido es el comportamiento de desbordamiento de enteros.
4. Cumplimiento
2 Si se viola un requisito de "debería" o "no debería" que aparece fuera de las restricciones, el comportamiento no está definido.
El comportamiento indefinido se estandariza en este
comportamiento internacional mediante las palabras "comportamiento indefinido" u omitiendo cualquier definición explícita. No hay diferencia en el énfasis entre los tres; todos describen
''comportamiento indefinido''.
5.2.1.3
2 Acceder a objetos mutables, modificar objetos, modificar archivos o llamar a funciones
Estas operaciones son todas efectos secundarios, 11) son cambios de estado
Entorno de ejecución. La evaluación de expresiones puede tener efectos secundarios. En
ciertos puntos especificados en la secuencia de ejecución se denominan puntos de secuencia, todos los efectos secundarios
de las evaluaciones anteriores deben estar completos, sin efectos secundarios de las evaluaciones posteriores
Debería haber sucedido. (En el Apéndice c se proporciona un resumen de los puntos de secuencia).
6.5
2 Entre el punto de secuencia anterior y el siguiente, un objeto debe tener su valor almacenado
p>
Modificar como máximo una vez evaluando la expresión. Además, el valor a priori
debe ser de solo lectura para determinar el valor a almacenar.
Además, el orden en el que se evalúan las expresiones es un comportamiento indefinido, que puede ser un comportamiento correcto, pero el comportamiento no especificado depende de la implementación (aquí el compilador) y no debe confundirse con esto. El orden de entrada y salida de la pila implica la convención de llamada de la función, que es incierta en la especificación del lenguaje. Necesita encontrar otras especificaciones del modelo de programación (incluido ABI) (como la arquitectura de hardware); de hecho, el lenguaje C sí lo hace. No especificar funciones en absoluto. Debe implementarse mediante una pila (aunque todas las arquitecturas de hardware convencionales e incluso las máquinas virtuales que implementan lenguajes tipo C utilizan pilas para representar el comportamiento de las funciones estáticas integradas). En cuanto a las leyes asociativas, pueden deducirse completa y claramente de las reglas gramaticales de las expresiones (una lista larga, demasiado detallada para citarla), y sólo se utilizan para explicar qué operando realiza qué operación, independientemente del orden específico de evaluación.