Red de conocimiento informático - Conocimiento sistemático - ¡Explore en profundidad la función printf y el autoincremento y autodecremento en lenguaje C!

¡Explore en profundidad la función printf y el autoincremento y autodecremento en lenguaje C!

LS Note no "no está claramente definido", pero está claramente definido que este uso de LZ puede conducir a un comportamiento indefinido. El comportamiento indefinido se basa en el mal uso del lenguaje o los datos por parte del usuario. El comportamiento de un programa con un comportamiento indefinido es completamente poco confiable (incluso si provoca que el compilador falle, es autoinfligido, aunque ningún fabricante permitirá que el compilador se comporte así). . falta de fiabilidad). El uso definido como comportamiento indefinido por ISO C/C puede considerarse estúpido sin importar los resultados definitivos que se den, por lo que el estándar no garantiza su comportamiento y los usuarios no deben esperar ningún resultado.

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

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.