2012-01-22 4 views

答えて

1

これはscanf関数の呼び出しです。最初の引数は、形式「%d%d\n」です。これは、「2桁の10進数とそれに続く改行が必要です」という意味です。

%dは、メモリに結果を書き込むと予想しています。 &x&yは、基本的には「xy変数のアドレスに書き込みます」という意味です。

そうscanfxの実際の場所へのアクセス権を持っているし、それに書き込むことができませんので、彼らはむしろ値(x)よりアドレス&x)によって渡されています。

+0

リンクはsscan機能に移動します。 –

0

は、コンパイラはまあ

をコンパイルする方法を、私は今その権利の対象とならないんだけど、あなたが\n文字について混乱している場合、私はあなたのためにそのmystryを解決することができます。

format specifiersの間に任意のcharを入力すると、入力内で区切り文字として扱われます。

scanf("%d%d\n",&x,&y); 

それが意味し、2 NUMSを入力した後、あなたはscanfを完了するためにreturnキーを打つためにきました。

scanf("%d\n%d\n",&x,&y); 

それが意味し、各NUMを入力した後、あなたはscanfを完了するためにreturnキーを打つためにきました。今

&x, &y一部について:

ユーザ入力がメモリに格納する必要があるため、あなたは、ユーザー入力を保存する変数のaddressをPaaSの必要があります。

この例では、最初のnumをxに格納します。したがって、xのアドレス、すなわち&xを渡します。

私はあなたがそのアイデアを得ることを願っています。

5

コンパイラがどのようにコード行をコンパイルし、それを私に説明するのか誰かが説明できますか?

  1. それは(多分部分で)メモリにソースファイルをロードします。
  2. レクサーは、行をプリプロセッサトークンに分割します。
  3. プリプロセッサは適切なマクロでscanf,xおよびyを展開しようとします。これらは定義されていないため、これはNOPです。
  4. プリプロセッサのトークンはトークンに変換され、パーサーはその行を解析します。
  5. これは、以前に宣言されたシンボルにscanfx、およびyを一致させる名前検索を行います。
  6. これは、上記の行を抽象構文ツリーまたは他の形式の中間表現に変換します。
  7. 型チェックしています。
  8. インライン展開などの高度な最適化を行います。
  9. バックエンドは中間表現をマシンコードに変換します。マシンコードに対してより多くの最適化が行われる可能性があります。
  10. 結果は後でリンカーに渡されるオブジェクトファイルに書き込まれます。

もちろんこれは非常におおよそのものであり、このプロセスには多くのバリエーションがあります。

これらのうち、どの部分がわかりませんか。

0

./a.out 

は10を入力して、20を入力し、再びキー

を入力してEnterキーを押して

gcc test.c 

ランのようなコンパイルtest.cのファイルとして

#include <stdio.h> 
    int main(void){ 
    int x=0,y=0; 
    scanf("%d%d",&x,&y); 
    printf("x is %d, y is %d",x,y); 
    } 

をこのプログラムを保存しますEnteを押すRキー

出力は次のようになります

×10、yは私はあなたが

をやっても

代わりのprintf("x is %d, y is %d",x,y); それらの値の印刷にミスをやっているかもしれないと思う20

されています

printf("x is %d, y is %d"); 

これは、garvase値を与えるでしょう

関連する問題