#include int main(void) { int a=5; printf("%d"+1,a); }
Salida: d. No entendí cómo está saliendo la salida: d?
Pasaste como primer argumento de printf
"%d"+1
; "%d"
realidad se ve como un const char *
que apunta a una ubicación de memoria donde se almacena %d
. Al igual que con cualquier puntero, si lo incrementa en uno, el resultado apuntará al siguiente elemento, que, en este caso, será d
.
a
no se usa, pero esto no debería ser un problema, ya que en general ( no sé si es una edición obligatoria : sí lo es, vea la parte inferior) la responsabilidad de la limpieza de la stack para las funciones variadic es responsabilidad del llamante (al menos , cdecl
hace de esta manera , sin embargo esto puede o no ser UB, no lo sé *).
Puedes verlo más fácil de esta manera:
#include int main(void) { int a=5; const char * str="%d"; printf(str + 1, a); }
str ---------+ | V +----+----+----+ | % | d | \0 | +----+----+----+ str + 1 ----------+ | V +----+----+----+ | % | d | \0 | +----+----+----+
Por lo tanto, ( "%d"+1
) (que es "d"
) se interpreta como la cadena de formato, y printf
, al no encontrar ningún %
, simplemente lo imprimirá tal como está. Si en su lugar desea imprimir el valor de más 1, debería haber hecho
printf("%d", a+1);
Edición: * ok, no es UB, al menos para el estándar C99 (§7.19.6.1.2) está bien tener parámetros no utilizados en fprintf
:
Si el formato se agota mientras permanecen los argumentos, los argumentos en exceso se evalúan (como siempre), pero de lo contrario se ignoran.
y se define que printf
tiene el mismo comportamiento en §7.19.6.3.2
La función printf es equivalente a fprintf con el argumento stdout interpuesto antes de los argumentos para printf.
Los literales de cuerdas son punteros. Avanzando el puntero a "%d"
por 1 resultados en "d"
. El argumento es descartado.
Debes hacer printf("%d", a+1)
. "%d" + 1
es un puntero a "d"
dentro de una matriz de char
( {'%','d','\0'}
).
Debido a +1
. Si desea incrementar a
do: printf("%d", a + 1);
en lugar.
Supongamos que tienes:
char x[] = "%d";
Qué esperas
printf(x + 1, a);
¿imprimir?
Sugerencia: tc: 5: advertencia: demasiados argumentos para el formato
“% d” es una cadena constante, se almacenará en la char [] en la memoria. Durante el tiempo de ejecución, “% d” devuelve la ubicación inicial del char []. Aumentar el puntero de la matriz de caracteres en uno, apuntará al siguiente carácter. Por lo tanto, “d” solo se pasa a la función printf. entonces la salida es “d”