Я не могу узнать намерение следующей части спецификации printf
в cppreference.com:
После действия каждого преобразования есть точка последовательности спецификатор; это позволяет хранить несколько% n результатов в одном и том же переменная и печать значения, хранящегося в% n ранее в том же позвонить.
Это означает, что результат одного (или даже нескольких) %n
спецификаторов (спецификаций) преобразования может быть распечатан в одном и том же printf
-стоянии.
Но я не могу понять, как это может быть достигнуто, поскольку все аргументы, переданные вызову printf
, оцениваются до ввода тела printf
(после оценки аргумента есть точка последовательности). Следовательно, значение переменной, к которой будет записываться a %n
, оценивается до того, как printf
имеет возможность перезаписать это значение переменной "количество символов, написанных до сих пор":
#include <stdio.h>
int main( int argc, char* argv[] )
{
int n = 0;
printf("Hello, world!%n (%d first n); %n (%d second n)", &n ,n, &n, n);
// will print out "Hello, world! (0 first n); (0 second n)"
return 0;
}
Мой вопрос: Если нет возможности "напечатать значение, сохраненное% n ранее в рамках одного и того же вызова", не является ли соответствующая часть спецификации printf
бессмысленной или вводящей в заблуждение?
Каков фактический смысл c99 standard:
7.19.6 Форматированные функции ввода/вывода (1) Отформатированные функции ввода/вывода должны вести себя так, как если бы после действия, связанные с каждым спецификатором.
Уменьшает ли "шансы" на получение поведения undefined?
Вопрос помечен С++ и c, потому что я думаю, что этот вопрос применяется одинаково для обоих языков.