Turbo C ++: ¿Por qué printf imprime los valores esperados, cuando no se le pasan variables?

5 minutos de lectura

Turbo C ¿Por que printf imprime los valores esperados
SgrA

Se hizo una pregunta en una prueba de opción múltiple: ¿Cuál será el resultado del siguiente programa:

#include <stdio.h>

int main(void)
{
    int a = 10, b = 5, c = 2;

    printf("%d %d %d\n");

    return 0;
}

y las opciones fueron varias permutaciones de 10, 5 y 2. Por alguna razón, funciona en Turbo C++, que usamos en la universidad. Sin embargo, no lo hace cuando se compila con gcc (que da una advertencia cuando -Wall está habilitado) o clang (que tiene -Wformat habilitado y da una advertencia de manera predeterminada) o en Visual C++. La salida es, como se esperaba, valores basura. Supongo que tiene algo que ver con el hecho de que Turbo C++ es de 16 bits y se ejecuta en Windows XP de 32 bits, o que TCC es terrible cuando se trata de estándares.

  • La salida puede ser literalmente cualquier cosa, ya que este código da como resultado un comportamiento indefinido.

    – Pablo R.

    22 de agosto de 2013 a las 19:28

  • Sí, todo el asunto del compilador es una pista falsa.

    usuario1508519

    22 de agosto de 2013 a las 19:29

  • Sería interesante si OP pudiera informarnos si el ‘comportamiento indefinido’ es una de las respuestas de opción múltiple.

    usuario1508519

    22 de agosto de 2013 a las 19:32

  • No entiendo por qué una universidad usaría un software descontinuado y visiblemente malo para enseñar C o C ++, e ir tan lejos como para hacer una pregunta MCT sin sentido, mientras que hay compiladores como GCC y Clang disponibles de forma gratuita.

    – SirDarius

    22 de agosto de 2013 a las 19:36

  • @remyabel No hice una declaración apresurada. La pregunta aquí demuestra que turbo c ++ no considera la falta de suficientes parámetros para imprimir como un error. Así que “visiblemente”, esto es malo. De todos modos, la forma en que se formula la pregunta deja en claro que el “comportamiento indefenso” no es parte de las opciones.

    – SirDarius

    22 de agosto de 2013 a las 20:11

1647705248 543 Turbo C ¿Por que printf imprime los valores esperados
NPE

El código tiene comportamiento indefinido.

En Turbo C++, sucede que las tres variables viven en las posiciones exactas de la pila donde faltan printf() el argumento sería. Esto da como resultado que el comportamiento indefinido se manifieste al imprimir los valores “correctos”.

Sin embargo, no puede confiar razonablemente en que este sea el caso. Incluso el más mínimo cambio en su entorno de construcción (por ejemplo, diferentes opciones de compilación) podría romper las cosas de una manera arbitrariamente desagradable.

  • Gracias, esto tiene sentido. Probé el mismo programa (compilado con gcc) varias veces en Linux, y aparentemente esta coincidencia es bastante rara. ¿La coincidencia de que estén en las posiciones de pila exactas que printf requiere que estén tiene algo que ver con la forma en que se ejecutan los programas de 16 bits en Windows XP? ¿Algo así como algo de memoria probablemente esté reservado para ejecutar específicamente ese programa?

    – SgrA

    22 de agosto de 2013 a las 19:41

  • @SgrA: se deben alinear bastantes estrellas para que este programa se comporte de la manera que usted describe. Sería demasiado simplista decir que es por XP, o porque el programa es de 16 bits.

    – ENP

    22 de agosto de 2013 a las 19:45

  • Lo intrigante es que funcionó como se describe arriba cada vez en Turbo C++, pero nunca fuera de él, lo que me da curiosidad.

    – SgrA

    22 de agosto de 2013 a las 19:53


  • @SgrA No es aleatorio, es una cuestión de cómo el compilador presenta las cosas. No está definido, pero eso no siempre significa aleatorio. siempre va a funcionar en esta situación. Puede romperse fácilmente por cambios no relacionados.

    – Loren Pechtel

    22 de agosto de 2013 a las 23:49

Turbo C ¿Por que printf imprime los valores esperados
cdhowie

La respuesta aquí es que el programa podría hacer cualquier cosa; este es un comportamiento indefinido. De acuerdo a printf()s documentación (énfasis mío):

De forma predeterminada, los argumentos se usan en el orden dado, donde cada ‘*’ y cada especificador de conversión solicitan el siguiente argumento. (y es un error si no se dan suficientes argumentos).

Si su prueba de opción múltiple no tiene una opción para “comportamiento indefinido”, entonces es una prueba defectuosa. Bajo la influencia de un comportamiento indefinido, ninguna La respuesta a una pregunta de prueba de opción múltiple de este tipo es técnicamente correcta.

Turbo C ¿Por que printf imprime los valores esperados
Raúl Tripathi

Es un undefined behaviour. Así que podría ser cualquier cosa.

Tratar de usar

printf("%d %d%d", a,b,c)

Razón:- Las variables locales se llaman en la pila y printf en Turbo C++ las ve en el mismo orden en que fueron asignadas en la pila.

SUGERENCIA (De los comentarios): –

Comprender por qué se comporta de una manera particular con un compilador en particular puede ser útil para diagnosticar problemas, pero no haga ningún otro uso de la información.

  • Sí, estoy convencido de que la salida podría ser cualquier cosa. Me gustaría saber por qué funciona exactamente en Turbo C++.

    – SgrA

    22 de agosto de 2013 a las 19:31

  • @SgrA: – ¡Actualicé mi respuesta con el motivo, aunque NPE lo ha explicado mejor! 🙂

    – Raúl Tripathi

    22 de agosto de 2013 a las 19:41

  • @SgrA: comprender por qué se comporta de una manera particular con un compilador en particular puede ser útil para diagnosticar problemas, pero no hacer cualquier otro uso de la información.

    –Keith Thompson

    22 de agosto de 2013 a las 19:51

  • @KeithThompson Estuvo de acuerdo en que no debería confiar en estas coincidencias, y solo tengo curiosidad porque usaré Turbo C++ durante un par de años en la universidad.

    – SgrA

    22 de agosto de 2013 a las 19:55

Lo que realmente sucede es que los argumentos normalmente se pasan en la pila de llamadas. Las variables locales son además pasado en la pila de llamadas, y así printf() ve esos valores, en cualquier orden en que el compilador decidió almacenarlos allí.

Este comportamiento, así como muchos otros, están permitidos bajo el paraguas de comportamiento indefinido

No, no está relacionado con la arquitectura. Está relacionado con cómo TurboC++ maneja la pila. Variables a, by c son locales y como tales se asignan en la pila. printf también espera los valores en la pila. Aparentemente, TurboC++ no agrega nada más a la pila después de los locales y printf es capaz de tomarlos como parámetros. Solo coincidencia.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad