Prediga la salida de los siguientes programas en C.
Pregunta 1:
c
#include<stdio.h> int main() { int x = 5, p = 10; printf("%*d", x, p); getchar(); return 0; }
Producción:
10
Explicación:
consulte la definición estándar de la función printf
int printf ( const char * format, ... );
formato: string que contiene el texto que se escribirá en stdout. Opcionalmente, puede contener etiquetas de formato incrustadas que se sustituyen por los valores especificados en los argumentos posteriores y se formatean según lo solicitado. El número de argumentos que siguen a los parámetros de formato debe ser al menos igual al número de etiquetas de formato. Las etiquetas de formato siguen este prototipo:
%[flags][width][.precision][length]specifier
Puede ver los detalles de todas las partes anteriores aquí http://www.cplusplus.com/reference/clibrary/cstdio/printf/ .
Lo principal a tener en cuenta está debajo de la línea sobre precisión
* (estrella) : el ancho no se especifica en la string de formato, sino como un argumento de valor entero adicional que precede al argumento que debe formatearse.
En palabras simples, el valor a imprimir debe tener al menos el número de caracteres correspondiente al ancho. Aquí el ancho es 5, el valor a imprimir es 10. Como solo tiene dos caracteres, para que sea 5, se imprimirán tres espacios en blanco antes del 10.
¡Así que 10 se imprime después de 3 espacios!
Pregunta 2
c
int main() { char arr[] = "geeksforgeeks"; char *ptr = arr; while(*ptr != '\0') ++*ptr++; printf("%s %s", arr, ptr); getchar(); return 0; }
Salida: hffltgpshfflt
Explicación:
La base de esta pregunta se encuentra en la expresión ++*ptr++.
Si uno conoce la precedencia y la asociatividad de los operadores, entonces no queda mucho. A continuación se muestra la precedencia de los operadores.
Postfixx ++ left-to-right Prefix ++ right-to-left Dereference * right-to-left
Por lo tanto, la expresión ++*ptr++ tiene el siguiente efecto
El valor de *ptr se incrementa El
valor de ptr se incrementa
Pregunta 3
c
int main() { signed char i=0; for(; i >= 0; i++); printf("%d\n", i); getchar(); return 0; }
Salida: -128
Explicación:
Aquí, lo primero que se nota es el punto y coma al final del ciclo for. Básicamente, no hay cuerpo para el bucle for. Y printf imprimirá el valor de i cuando el control salga del bucle for. Además, tenga en cuenta que la primera declaración, es decir, el inicializador en el ciclo for, no está presente. Pero me ha inicializado en el momento de la declaración. Dado que i es un carácter firmado, puede tomar un valor de -128 a 127. Por lo tanto, en el bucle for, seguiré aumentando y la condición se cumplirá hasta que ocurra el cambio. En el rollover, me convertiré en -128 después de 127, en ese caso la condición no se cumple y el control sale del bucle for.
Pregunta 4
c
#include <stdio.h> void fun(const char **p) { } int main(int argc, char **argv) { fun(argv); getchar(); return 0; }
Salida: error del compilador.
Explicación:
el parámetro pasado a fun() y el parámetro esperado en la definición son de tipos incompatibles. fun() espera const char** mientras que el parámetro pasado es de tipo char **.
Ahora intente seguir el programa, funcionará.
void fun(const char **p) { } int main(int argc, char **argv) { const char **temp; fun(temp); getchar(); return 0; }
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