web-dev-qa-db-ja.com

なぜパーセント記号(%)が関数のprintfファミリーのフォーマット指定子として選択されたのですか?

少なくともCでは、関数のprintfファミリーを使用して、フォーマットされた文字列を出力することを誰もが知っています。そして、これらの関数は パーセント記号%)を使用して、フォーマット指定子の始まりを示します。たとえば、%dintを印刷することを意味し、%uunsigned intを印刷することを意味します。 printf関数とフォーマットプレースホルダーの仕組みに慣れていない場合、または単に復習が必要な場合は、 Wikipediaの記事 から始めてください。

私の質問ですが、これが元々、または将来的にフォーマット指定子として選択される必要がある特に説得力のある理由はありますか?

明らかに、決定はずっと前に行われ(C言語の前任者である可能性が非常に高い)、それ以来、それは多かれ少なかれ「標準」でした(Cだけでなく、他のさまざまな言語でも構文をさまざまな程度に採用しているため、変更するには遅すぎます。しかし、なぜ最初にこの選択が行われたのか、そして同様の機能を備えた新しい言語を設計する場合にそれが選択として理にかなっているのかについて誰かが洞察を持っているかどうか私はまだ興味があります。

たとえば、C#(および.NET言語の他のファミリ)では、Microsoftは文字列フォーマット関数の操作に関して若干異なる決定を行いました。そこではある程度のタイプセーフを適用できます(Cでのprintfの実装とは異なります)。したがって、対応するパラメーターのタイプの表示を含める必要はありませんが、ゼロインデックスの使用を決定しました。中括弧のペア({})は、次のようにフォーマット指定子として使用されます。

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

String.Formatメソッドのドキュメント には、より詳細な情報が含まれます 複合フォーマットに関するこの記事一般 ですが、正確な詳細はそれほど重要ではありません。重要なのは、フォーマット指定子の始まりを示すために%を使用する長年の慣行を放棄したということです。 C言語は{d}{u}を簡単に使用できたはずですが、実際はそうではありませんでした。なぜ、この決定が振り返って意味をなすか、そして新しい実装がそれに続くべきかどうかについて誰かが何か考えを持っていますか?

明らかに、文字列自体に含めることができるように回避可能である必要のない文字を選択することはできませんが、その問題はtwoを使用するだけで既に十分に解決されています。他にどのような考慮事項が関連していますか?

27
Cody Gray

@Secureが注記しているように、Cのprintf関数は、BCPLのwritef関数に触発されています。そして、ウィキペディアのページで [〜#〜] bcpl [〜#〜] を見ると、BCPL writef%を使用してフォーマット指定子を紹介します。

したがって、BCPLが行ったため、またはBCPLが行ったのと同じ理由で、Cが%を使用したと推測できます。私の直感は、単に%が最も一般的に使用されていない文字の1つであるということですASCII文字...かそうか、著者たちはそう思っていました。当時、BCPLとCはどちらも曖昧な言語であり、著者はおそらくより重要なことを扱う必要がありました。

しかし、作品にはマイナースパナがあります。 CはBCPLに触発されましたが、CがBCPL I/Oライブラリを借りたのか、それとも他の方法で借りたのかは完全には明らかではありません。 BCPLのI/Oライブラリは、インフィックスバイトインデックスオペレーターが言語に追加された頃に進化の過程を経たことを私はほんの少し思い出します。 (実際、私はそれについて誰が知っているか知っていると思います。)

12
Stephen C

Wikipediaのエントリには、printfに固有ではなく、文字全体をエスケープするための多くの履歴情報は含まれていません。

http://en.wikipedia.org/wiki/Escape_character

「エスケープ文字」という用語への早い言及は、ボブベマーのIBM技術出版物にあります。どうやら、ASCII文字セットに関する作業中にこのメカニズムを発明したのは彼です。

私の推測では、バックスラッシュはすでに文字列リテラルに使用されており、フォーマット文字列には別の文字が必要でした。ほとんどの場合、彼らは通常の使用と発生の頻度が最も低いと想定されるキャラクターを選びました。

ところで、別の関連記事は、私が以前聞いたことがない用語とリンクされています:

http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome

printfの記事には、より多くの情報スニペットがありますが、理由は含まれていません。

http://en.wikipedia.org/wiki/Printf

Cの可変長printfの起源は、BCPLのwritef関数にあります。

6
Secure