私はcppreference.comでprintf
明細書の以下の部分の意図を見つけることができません。同じ呼び出しで%nの値をprintf - 無意味ですか?
は、各変換 指定のアクションの後に一連のポイントがあります。同じ 変数に複数の%n結果を格納することが可能になり、同じ コールの中で先に%nによって格納された値をに出力することができます。
1つ(またはさらに数)%n
変換指定子(S)の結果は、同じprintf
-statementでプリントアウトすることができれば、これは読み込みます。 printf
のボディが入力される前に、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;
}
私の質問:「があるにISN場合printf
は、「これまでに書かれた文字の数」で、この変数の値を上書きする機会を持つ前に、したがって、%n
を書きますする変数の値が評価され、 「同じ呼び出しの中で先に%nによって格納された値を出力する」可能性は、printf
仕様のそれぞれの部分が無意味であるか誤解を招くものではないでしょうか?シーケンスポイントが 後にそこにあるかのように(1)書式付き入力/出力機能が
7.19.6書式付き入力/出力機能 振る舞うもの:c99 standard文の実際の意味は何
各指定子に関連付けられたアクション。
未定義の動作を取得する可能性を減らすことはできますか?
質問は、このトピックが両方の言語に同じように当てはまると思うので、C++とcでタグ付けされています。
C11 refが「7.21.6 1」である。 – chux
cppreferenceは今やあまり意味がありません – Cubbi