Salida de programas en C | conjunto 6

Predecir la salida de los siguientes programas

Pregunta 1

int main()
{
    unsigned int i=65000;
    while ( i++ != 0 );
    printf("%d",i);
    return 0;
}

Salida:
1

Explicación:
Debe notarse que hay un punto y coma en el cuerpo del ciclo while. Entonces, aunque no se hace nada como parte del cuerpo while, el control saldrá de while solo si no se cumple la condición while. En otras palabras, tan pronto como i dentro de la condición se convierta en 0, la condición se volverá falsa y el ciclo while terminará. Pero también observe el operador de incremento posterior en la condición de mientras. Entonces, primero se comparará con 0 y se incrementará sin importar si se cumple o no la condición. Dado que i se inicializa en 65000, seguirá aumentando hasta que alcance el valor positivo más alto. Después de que ocurra ese rollover, y el valor de i se convierte en cero. La condición no se cumple, pero se incrementaría, es decir, a 1. Entonces printf imprimirá 1.

Pregunta 2

int main()
{
    int i=0;
    while ( +(+i--) != 0)
        i-=i++;
    printf("%d",i);
    return 0;
}

Salida:
-1

Explicación:
Primero tomemos la condición del ciclo while. Hay varios operadores allí. El operador unario + no hace nada. Entonces, la condición simplificada se convierte en (i–) != 0. Entonces, i se comparará con 0 y luego se reducirá sin importar si la condición es verdadera o falsa. Dado que i se inicializa en 0, la condición de while será falsa en la primera iteración, pero se reducirá a -1. El cuerpo del bucle while no se ejecutará. Y printf imprimirá -1.

¡Así que no fue tan aterrador como parecía ser!

Pregunta 3

int main()
{
    float f=5,g=10;
    enum{i=10,j=20,k=50};
    printf("%d\n",++k);
    printf("%f\n",f<<2);
    printf("%lf\n",f%g);
    printf("%lf\n",fmod(f,g));
    return 0;
}

Salida:
el programa no se compilará y dará 3 errores

Explicación:
Aquí, i, j y k están dentro de la enumeración y, por lo tanto, son como constantes. En otras palabras, si queremos usar 10 en cualquier parte del programa, podemos usar i en su lugar. En el primer printf, el valor de k se modifica, lo que no está permitido porque es una constante de enumeración. En la segunda impresión, el operador de desplazamiento a la izquierda se aplica en un flotante que tampoco está permitido. De manera similar, en el tercer printf, el operador de módulo se aplica en float f y g, lo que tampoco está permitido.

Pregunta 4

   
int main()
{
    int i=10;
    void pascal f(int,int,int);
    f(i++, i++, i++);
    printf(" %d",i);
    return 0;
}
void pascal f(integer :i,integer:j,integer :k)
{
  write(i,j,k);
}

Salida:
el programa dará un error en tiempo de compilación

Explicación:
pregunta específica del compilador. No todos los compiladores admiten esto.

De lo contrario, pascal impone el procesamiento de argumentos de izquierda a derecha. Entonces, aunque el orden de procesamiento de los argumentos se puede cambiar mediante el uso de pascal, no podemos usar las rutinas del lenguaje Pascal, como escribir dentro del programa C.

Pregunta 5

void pascal f(int i,int j,int k)
{
  printf("%d %d %d",i, j, k);
}
  
void cdecl f(int i,int j,int k)
{
  printf("%d %d %d",i, j, k);
}
  
main()
{
    int i=10;
    f(i++,i++,i++);
    printf(" %d\n",i);
    i=10;
    f(i++,i++,i++);
    printf(" %d",i);
}

Salida:
pregunta específica del compilador. No todos los compiladores permiten esto.

Explicación:
Esta pregunta trata sobre el mecanismo de paso de argumentos. Si llamamos a una función, el orden en que se procesan los argumentos de la función no se rige por C Standard. Entonces, un compilador puede procesar los argumentos de izquierda a derecha, mientras que el otro compilador puede procesarlos de derecha a izquierda. Por lo general, los programas no se ven afectados por esto porque los argumentos de los programas son diferentes. Por ejemplo, si llamamos a la función fun como fun(i, j), entonces no importa en qué orden se procesen los argumentos, el valor de i y j será consistente.

Pero en este caso, estamos pasando los argumentos a la función f usando la misma variable. Entonces, el orden en que la función procesa los argumentos determinará el valor de esos argumentos. cdecl impone el procesamiento de argumentos de derecha a izquierda, mientras que pascal impone el procesamiento de argumentos de izquierda a derecha.

Entonces, el valor de i, j y k dentro de la primera función f será 10, 11 y 12 respectivamente, mientras que el valor de i, j y k dentro de la segunda función f será 12, 11 y 10 respectivamente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *