Razón de la salida

#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”