#include<stdio.h>
main()
{
printf("% % % %");
}
上記のプログラムの出力は%%です。しかし、なぜ? (私はgccコンパイラを使いました)。%がCで半分の数で印刷されるのはなぜですか?
#include<stdio.h>
main()
{
printf("% % % %");
}
上記のプログラムの出力は%%です。しかし、なぜ? (私はgccコンパイラを使いました)。%がCで半分の数で印刷されるのはなぜですか?
未定義の動作は無効な書式指定子を使用して呼び出されます。
N1570 7.21.6.1 fprintf関数は%
変換指定子の説明で述べている:
完全な変換指定は%%されなければなりません。
N1570 4.適合性は言う:
制約または実行時制約の外に表示されます「」はなら「」または「」なければならない「」要件に違反している場合、動作は未定義です。
%
の変換指定子の説明は、制約でも実行時制約セクションでもなく、「説明」セクションにあります。実際implementionで
、システムの動作は、このように思える:
%
を読み、指定
を解析を開始し、第二%
を読み、それを扱うフラグ%
変換指定子
を読んで、それが一部ではないために印刷してください指定% %
とあなたは `-Wall -Wextra -Wpedantic`でコンパイルしたいかもしれません1-3
のように動作します。 – EOF
'printf](http://en.cppreference.com/w/cpp/io/c/fprintf)参照とその' format'パラメータについての詳細は – mvidelgauz
@mvidelgauz Cのサイトにリンクする方がいいでしょう。 、 右? –