210108開発ログ(32日目)-c言語を理解する(2):コンパイル、文字列など

14783 ワード

コンパイル


ソースコードをマシンコードに変換する一連のプロセス、計4つのステップ.
パソコンシステムを整理している時にも見た内容で、講義中にとても親切に説明してくれてよかったです.私も親切に使います.
  • プリコンパイル
    -#で始まるCソースコードは、プリプロセッサに実際のコンパイルを行う前にいくつかの操作を実行するように伝えます.
    たとえば、#includeは、フロントプロセッサに他のファイルの内容が含まれていることを通知します.プログラムのソースコードにincludeなどの行が含まれている場合、フロントプロセッサは、Cソースコード形式のstdioのままの新しいファイルを作成します.hファイルの内容は#includeセクションに含まれます.
  • コンパイル(Compile)
    -アセンブリ言語で前処理のCコードをコンパイルします.
    コンポーネントの演算の種類はCよりはるかに少ないが,複数の演算を併用すれば,Cができることはすべて実行できる.Cコードをアセンブリコードに変換することで、コンパイラはプログラムをコンピュータが理解できる言語にできるだけ近づけることができます.この用語をコンパイルすることは、ソースコードからオブジェクトコードに変換するプロセス全体を総称することができるが、特定の前処理されたソースコードをコンポーネントコードに変換するステップを指すこともできる.
  • 組立
    -アセンブリ言語をマシンコード(マシンコード、オブジェクトコード)に変換します.ここでファイルをコンパイルする場合は、コンパイル作業はこれで終わります.複数のファイルがある場合は、リンクフェーズが必要です.
  • リンク(リンク)
    -math.hやstdio.hなどのライブラリを含むプログラムが複数のファイルで構成されている場合、1つのオブジェクトファイルにマージする必要がある場合は、リンクという最後のステップをコンパイルする必要があります.Linkerは、複数の異なるマシンコード(マシンコード、オブジェクトコード)ファイルを1つの実行可能なマシンコード(マシンコード、オブジェクトコード)ファイルにマージします.リンクを使用して、他のライブラリに格納されている関数を使用できます.
  • 簡単な画像は以下のように整理します.

    配列と関数の作成


    Pythonではlistを考慮すればよいが,Cは最初に配列を宣言する際に,配列に入る材料のタイプと大きさを宣言する必要がある.下図のように.
  • アレイ
  • の作成
    int scores[3];		#'scores라는 변수에 int자료형을 가지는, 크기 3의 배열을 만들겠다'는 뜻이다.
  • 関数
  • を作成
    //평균을 계산하는 함수
    float average(int length, int array[])		#여기 float은 리턴할 값에 대한 자료형을 입력한 것이다.
    {
        int sum = 0;
        for (int i = 0; i < length; i++)
        {
            sum += array[i];
        }
        return (float) sum / (float) length;
    }

    文字列(String)


    文字列は文字(char)資料型の配列である.Pythonを読んでいたときに知りましたが、この授業ではメモリと結びつけて説明できて嬉しいです.
    文字列の末尾を区別する方法は、最後の文字列バイトの後ろに8つの0、すなわち0を加えてnullデータで文字列の終了を通知する方法です.

    今回は、複数の文字列を持つ配列とメモリについて学びます.
    次のコードと出力値を見ると、不思議ですね・・・
    #include <stdio.h>
    int main(void)
    {
        char* names[4];
    
        names[0] = "EMMA";
        names[1] = "RODRIGO";
        names[2] = "BRIAN";
        names[3] = "DAVID";
    
        printf("%s\n", names[0]);
        printf("%c%c%c%c%i\n", names[0][0], names[0][1], names[0][2], names[0][3], names[0][4]);
        printf("%c%c%c%c%i%c\n", names[0][0], names[0][1], names[0][2], names[0][3], names[0][4], names[0][5]);
        printf("%c%c%c%c%i%i%i\n", names[0][0], names[0][1], names[0][2], names[0][3], names[0][4], names[0][5], names[0][6]);
    }
    出力値:
    EMMA
    EMMA0
    EMMA0R
    EMMA0RO
    どうやらこれがCの楽しみらしい.カル

    コマンド(?):int main(void)の秘密


    △まだ完全に理解していない.
    int main(void){~}
    この部分をvoidに置き換え、少なくとも以下と同じ結果を得ることができる.
    int main(int argc, char* argv[])	#argc는 argument character의 약자로 인자 갯수, argv는 argument vector의 약자로 배열을 의미
    {
        if (argc == 2)
        {
            printf("hello, %s\n", argv[0]);
            printf("hello, %s\n", argv[1]);
        }
        else
        {
            printf("hello, world\n");
        }
    }
    ここで、最初の変数argcはmain関数が受信する入力の個数である.argv[]は、入力を含む配列です.プログラムはコマンドラインで実行されるので、入力は文字列です.したがってargv[]はstring配列である.
    argv[0]はデフォルトでプログラムの名前として格納され、もう1つ入力するとargv[1]に格納されます.したがって、上記のコードを実行すると、次のような出力値が得られます.
    入力:./a.out gojae
    出力値:
    hello, ./a.out
    hello, gojae

    他に知っていればよかった!

  • &銀の住所を持って、*その住所に行きます!
  • Cでは,資料型は与えられない.