Salida de programas en C | conjunto 5

Predecir la salida de los siguientes programas 
Pregunta 1 
 

c

int main()
{
    while(1){
        if(printf("%d",printf("%d")))
            break;
        else
            continue;
    }
    return 0;
}

Salida: 
No se puede predecir
Explicación: 
La condición en el bucle while es 1, por lo que a primera vista parece un bucle infinito. Luego hay break y continue en el cuerpo del bucle while, por lo que puede que no sea un bucle infinito. La instrucción break se ejecutará si se cumple la condición de if; de lo contrario, se ejecutará continue. Dado que no hay otras declaraciones después de continuar en el ciclo while, continuar no tiene ningún propósito. De hecho, es extraño. Así que veamos la condición if. Si observamos detenidamente, notaremos que la condición del if se cumplirá siempre, por lo que break se ejecutará en la primera iteración y saldremos del ciclo while. La razón por la que se cumplirá la condición de si es la función printf. La función printf siempre devuelve el no. de bytes tiene salida. Por ejemplo, el valor de retorno de printf(“geeks”) será 5 porque printf generará 5 caracteres aquí. En nuestro caso, el printf interno se ejecutará primero, pero este printf no tiene un argumento para el especificador de formato, es decir, %d. Significa que este printf imprimirá cualquier valor arbitrario. Pero observe que incluso para cualquier valor arbitrario, el no. de bytes de salida por printf interno sería distinto de cero. Y esos no. de bytes funcionará como argumento para el printf externo. El printf exterior imprimirá tantos no. de bytes y devolver un valor distinto de cero siempre. Entonces la condición para if también es verdadera siempre. Por lo tanto, el ciclo while se ejecutará solo una vez. Como nota al margen, incluso sin la impresión exterior, la condición para if siempre es verdadera. de bytes de salida por printf interno sería distinto de cero. Y esos no. de bytes funcionará como argumento para el printf externo. El printf exterior imprimirá tantos no. de bytes y devolver un valor distinto de cero siempre. Entonces la condición para if también es verdadera siempre. Por lo tanto, el ciclo while se ejecutará solo una vez. Como nota al margen, incluso sin la impresión exterior, la condición para if siempre es verdadera. de bytes de salida por printf interno sería distinto de cero. Y esos no. de bytes funcionará como argumento para el printf externo. El printf exterior imprimirá tantos no. de bytes y devolver un valor distinto de cero siempre. Entonces la condición para if también es verdadera siempre. Por lo tanto, el ciclo while se ejecutará solo una vez. Como nota al margen, incluso sin la impresión exterior, la condición para if siempre es verdadera. 
Pregunta 2 
 

c

int main()
{
    unsigned int i=10;
    while(i-- >= 0)
        printf("%u ",i);
    return 0;
}

Salida: 
9 8 7 6 5 4 3 2 1 0 4294967295 4294967294 …… (en una máquina donde int tiene 4 bytes de largo)
9 8 7 6 5 4 3 2 1 0 65535 65534 …. (en una máquina donde int tiene una longitud de 2 bytes)
Explicación: 
Examinemos la condición del ciclo while. Es obvio que mientras se cumpla la condición del ciclo while, se ejecutará printf. Hay dos operadores en la condición del bucle while: el operador posterior al decremento y el operador de comparación. Por la precedencia de los operadores, sabemos que el operador unario post-decremento tiene mayor prioridad que el operador de comparación. Pero debido a la propiedad posterior al decremento, el valor de i se reducirá solo después de que se haya utilizado para la comparación. Entonces, en la primera iteración, la condición es verdadera porque 10>=0 y luego i se reduce. Por lo tanto, se imprimirá 9. De manera similar, el bucle continúa y el valor de i sigue disminuyendo. Veamos qué sucede cuando la condición del bucle while se convierte en 0 >= 0. En este momento, se cumple la condición y se reduce i. Como i es un entero sin signo, ocurre el rollover y i toma el valor del valor +ve más alto que puede tomar un int sin signo. Así que nunca es negativo. Por lo tanto, se vuelve infinito while loop. 
Como nota al margen, si hubiera iniciado sesión, el bucle while se habría terminado después de imprimir el valor positivo más alto.
Pregunta 3 
 

c

int main()
{
    int x,y=2,z,a;
    if ( x = y%2)
         z =2;
    a=2;
    printf("%d %d ",z,x);
    return 0;
}

Salida: 
< algún valor basura de z > 0
Explicación: 
Esta pregunta tiene algunas cosas para la precedencia del operador. Si se cumple la condición de si, entonces z se inicializará a 2; de lo contrario, z contendrá un valor basura. Pero la condición de si tiene dos operadores: operador de asignación y operador de módulo. La precedencia del módulo es mayor que la asignación. Entonces y%2 es cero y se asignará a x. Entonces el valor de x se convierte en cero, que también es la condición efectiva para si. Y por tanto, la condición de si es falsa. 
Pregunta 4 
 

c

int main()
{
    int a[10];
    printf("%d",*a+1-*a+3);
    return 0;
}

Salida: 4
Explicación: 
Desde la precedencia del operador, el operador de desreferencia tiene mayor prioridad que el operador de suma/resta. Por lo tanto, la desreferencia se aplicará primero. Aquí, a es una array que no está inicializada. Si usamos a, apuntará al primer elemento de la array. Por lo tanto, *a será el primer elemento de la array. Supongamos que el primer elemento de la array es x, luego el argumento dentro de printf se convierte en el siguiente. Su valor efectivo es 4.
x + 1 – x + 3 = 4
Pregunta 5 
 

c

#define prod(a,b) a*b
int main()
{
    int x=3,y=4;
    printf("%d",prod(x+2,y-1));
    return 0;
}

Salida: 
10
Explicación: 
Este programa se ocupa de las macros, sus efectos secundarios y la precedencia de operadores. Aquí prod es una macro que multiplica sus dos argumentos a y b. Echemos un vistazo más de cerca.
prod(a, b) = a*b 
prod(x+2, y-1) = x+2*y-1 = 3+2*4-1 = 3+8-1=10
Si el programador realmente quisiera multiplica x+2 y y-1, debería haber puesto paréntesis alrededor de a y b de la siguiente manera.
prod(a,b) = (a)*(b)
Este tipo de error en la definición de macros se denomina efectos secundarios de macros.
 

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 *