Вы передали в качестве первого аргумента printf
"%d"+1
;"%d"
фактически рассматривается как const char *
, который указывает на область памяти, где хранится %d
.Как и в случае любого указателя, если вы увеличиваете его на единицу, результат будет указывать на следующий элемент, который в этом случае будет d
.
a
не используется, но это не должнобыть проблемой, поскольку в целом ( я не знаю, является ли это стандартным Edit: да, см. внизу) ответственность за очистку стека для функций с переменными значениями лежит на вызывающей стороне(по крайней мере, cdecl
делает это таким образом , однако это может быть или не быть UB, я не знаю *).
Вы можете видетьтак проще:
#include<stdio.h>
int main(void)
{
int a=5;
const char * str="%d";
printf(str + 1, a);
}
str ---------+
|
V
+----+----+----+
| % | d | \0 |
+----+----+----+
str + 1 ----------+
|
V
+----+----+----+
| % | d | \0 |
+----+----+----+
Таким образом, ("%d"+1
) (то есть "d"
) интерпретируется как строка формата, а printf
, а ненайдя любой %
, просто распечатайте его как есть.Если вы хотите вместо этого напечатать значение a
плюс 1, вы должны были сделать
printf("%d", a+1);
Редактировать: * хорошо, это не UB, по крайней мере для стандарта C99 (§7.19.6.1.2) нормально иметь неиспользуемые параметры в fprintf
:
Если форматисчерпаны, пока остаются аргументы, избыточные аргументы оцениваются (как всегда), но в противном случае игнорируются.
и printf
определено для того же поведения в §7.19.6.3.2
Функция printf эквивалентна fprintf с аргументом stdout, вставленным перед аргументами printf.