2011-09-14 16 views
0

私は少しのPHPをやったことがあります。変数を宣言するときには、型を宣言する必要はありません(たとえば、文字列またはint)。なぜC++のprintf関数で型指定子を指定する必要がありますか?

しかし、私は非常に単純なCファイルを調整しなければなりません。プリント機能を正しく動作させるためには、各変数の出力にタイプ指定子を含める必要があります。

なぜこの型は変数自体から自動的に推論されませんか?

+1

もう少し詳しく説明してください。私はあなたが求めているものを作ることができません。 –

+0

http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – NullUserException

+0

質問のタイトルで質問したり、質問自体で質問を繰り返したりしないでください。 –

答えて

2

printfタイプ検出が書式文字列で指定子とのために使用されているデータ項目間の切断があるので、ホット:-)

なかったC++、Cの互換部分の一部であるためたとえば、次のように指定します。

printf ("String at memory %p is '%s'\n", mystr, mystr); 
printf ("That character is '%c', ASCII code %d, hex %02x\n", mych, mych, mych); 

出力にC++ストリームを使用する場合、これはあまり問題になりません。

0

最も一般的な指定子は、次のとおり整数
%Cは、Sがストリング
%fのある
%フロート/
ダブル

するためのものであるチャーのためのものであるため、私は

% D /%たとえば

int i = 1; 
char hi[6] = "Hello" 
printf("%d %s", i, hi); 

は印刷し

上記のよう
1 Hello 

、あなたがhttp://www.cplusplus.com/reference/clibrary/cstdio/printf/

2

Cを参照することができ、私はそれがベアメタルを超えるかなり最小限の抽象化を提供しています意味それによって、非常に簡単な言語です。基本タイプはで、タイプの情報は付属しています。structでもタイプ情報を取得します

ので、コンパイラは

int x, y; 
float z; 
int x = foo(y,z); 

xy、及びzとして2S、補体xための整数と `yと解釈される可能性の高い1つのマシン語であり、見ている典型的な実装でzのIEEE-754浮動小数点値、およびその他はです。

  • 事前
  • pushyzスタックに戻り値のスペースを確保するために、スタックポインタのようなもの(それが何をオーダーこれでは実装依存である)コンパイラがありません
  • push返信先アドレスとしてstack pointer+two instructions
  • branchのエントリポイントfooに設定します。

が続い

  • がその場所の相対現在のスタック値
  • からyzを読み込むのfoo(まともなチップが...これを簡単、まだamkeためにいくつかのサポートを提供します)
  • は、xに戻ります(スタックポインタからのオフセットによって再び見つかります)
  • branch呼び出し元ルーチンpushが返す戻りアドレスに戻ります。

fooは、渡された引数は、スタック上の各引数は、(実際にはCはすべてのvariadac引数のサイズを強制的に変換されてどのように大きな知ることができません(printfのようなvariadacルーチンのように)持っているどのような種類指示されていない場合この問題を解決するための一連のアップコンバートルールを含む)、それをどのように解釈するかについては触れません。一方、PHPは、裸のマシン上で洗練された抽象化を提供します。実際には、それが動作するためには、動作している各値でいくつかの識別情報を持ち運ぶことができます。

+0

おかげさまで、好奇心の念のために、どうしてこのような詳細な質問を書こうと努力しましたか。 – user784637

関連する問題