Changes between Version 13 and Version 14 of HowTo/CTutorial


Ignore:
Timestamp:
Sep 6, 2010, 2:03:28 PM (14 years ago)
Author:
村山 俊之
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • HowTo/CTutorial

    v13 v14  
    269269テキストエディタを用いて上記のサンプルプログラムをコピー&ペーストし、ファイル名「test.c」で保存します。
    270270
    271 次に、ターミナル (コマンドプロンプト、またはシェル) にて、 cd コマンドで test.c を保存したディレクトリに移動してから、以下のコマンドを実行します。
     271次に、ターミナル (コマンドプロンプト、またはシェルなどのコンソール) にて、 cd コマンドで test.c を保存したディレクトリに移動してから、以下のコマンドを実行します。
    272272
    273273{{{
     
    292292Windows の場合、余計に拡張子 .exe がついた名前のファイルが生成されます。
    293293
     294== 標準ライブラリを使ってみる ==
     295
     296言語をしっかり習得するには文法を学び、そこに通じるさまざまな思想や観念を学ぶことが必要ですが、そうしたものを一通り学んでまともに動くプログラムを組み上げるまでの道のりは長く、よっぽど好きでもない限り退屈なものでしょう。
     297
     298そこで、とりあえず動くものを作ってしまう最も手っ取り早い方法として、他の言語では普通に用意されていそうな命令の代わりになる関数がたくさん盛り込まれている'''標準ライブラリ'''から学んでしまうことにしましょう。
     299
     300=== 文字を表示する ===
     301
     302コンソール上に文字を表示する関数の類は、入出力ライブラリとしてまとめられています。入出力ライブラリを使用するには、プログラムの先頭に stdio.h ファイルを読み込ませる必要があります。
     303
     304{{{
     305#include <stdio.h>
     306}}}
     307
     308番号記号 "#" で始まる行を'''プリプロセッサ行'''といいます。プリプロセッサとはその名の通り「前処理」を行うツールで、 C コンパイラコマンドがコンパイルを行う前に行う仕事です[[FootNote(思い出しましょう。 C コンパイラの仕事は、 1 に前処理、 2 にコンパイル、 3 にアセンブル、最後にリンク、でしたね。)]]。プリプロセッサは include という命令を、「その位置に指定されたファイルの内容を挿入する」と解釈します。
     309
     310ヘッダファイルを読み込むことにより、ライブラリに用意されている関数を呼び出す準備ができました。それでは、文字を表示する関数を一つ一つ試してみましょう。
     311
     312{{{
     313#include <stdio.h>
     314
     315int main()
     316{
     317    puts("Hello, World!");
     318    return 0;
     319}
     320}}}
     321
     322'''puts() 関数'''は、文字列を表示します。行末は改行されます。実は、 Hello World プログラムは、よく知られている printf() 関数を用いるより、 puts() 関数を用いた方がすっきり書けます。
     323
     324なお、プログラムは必ず '''main() 関数'''の定義内容として記述します。 C 言語では、プログラムは必ず main() 関数から始まるのです。
     325
     326{{{
     327#include <stdio.h>
     328
     329int main()
     330{
     331    int x = 4, y;
     332    char formula[] = "y = x^2 + 2x + 1";
     333    printf("式: %s\nx = 4 のとき、 y = %d\n", formula, x^2 + 2 * x + 1);
     334    return 0;
     335}
     336}}}
     337
     338みんな大好き '''printf() 関数'''は、書式を指定して文字列を表示する関数です。1つ目の引数は書式指定文字列で、この中に 2つ目以降の引数の値 (を文字列に変換したもの) を埋め込んで作った文字列を表示します。
     339
     3402つ目以降の引数の値が埋め込まれる場所は、書式指定文字列中で "%s" とか "%d" などと書かれた場所です。埋め込まれる順番は、左からの出現順です。埋め込みたい値の種類に応じて、以下の記号から選択して使用します。
     341
     342 * %s ... 文字列を埋め込む。対応する引数には char 型の配列を指定しなければならない。
     343 * %d ... 10進数の整数値を埋め込む。対応する引数には int 型などの整数値を指定する。
     344 * %h ... 16進数の整数値を埋め込む。a ~ f は小文字で表示される。対応する引数には int 型などの整数値を指定する。
     345 * %f ... 実数値を小数点表記で埋め込む。対応する引数には double 型などの実数値を指定する。
     346 * %g ... 実数値を埋め込む。通常は小数点表記だが、値の大きさによっては指数表記で表示される。対応する引数には double 型などの実数値を指定する。
     347 * %% ... % 記号そのものを表示する。
     348
     349また、 printf() 関数は puts() 関数とは違って、行末は改行されません。改行したい場合は、改行したい場所で "\n" を挿入します。 "\n" 自体は'''エスケープシーケンス'''と呼ばれるもので、 C 言語で文字リテラルを記述する場面では共通して利用できます (つまり、 printf() 関数のみならず puts() 関数やその他の関数でも利用可能です)。エスケープシーケンスは、 "\n" の他に、以下のようなものがあります。
     350
     351 * \t ... タブ文字。
     352 * \a ... ベル文字 (アラート)[[FootNote(ブザーが鳴ります。;))]]。
     353 * \r ... 復帰。改行せずに行の先頭に戻る。
     354 * \' ... シングルクォーテーション "'"。
     355 * \" ... ダブルクォーテーション '"'。
     356 * \\ ... バックスラッシュ (円記号) "\"。
     357
     358{{{
     359#include <stdio.h>
     360
     361int main()
     362{
     363    int i;
     364    char text[] = "Hello, World!";
     365    for (i = 0; text[i] != '\0'; i++) {
     366        if (i > 0) {
     367            putchar(',');
     368            putchar(' ');
     369        }
     370        putchar(test[i]);
     371    }
     372    return 0;
     373}
     374}}}
     375
     376'''putchar() 関数'''は、文字を一文字だけ表示する関数です。puts() 関数や printf() 関数のように文字列を表示するのではなく、一文字だけ表示します。従って、 putchar() 関数の引数には、 char 型の配列ではなく、 char 型の (単一の) 値を指定します。
     377
     378ところで、リテラルの書き方ですが、ダブルクォーテーション '"' で括るリテラルと、シングルクォーテーション "'" で括るリテラルは、全くの別物です。ダブルクォーテーションで括った場合は'''文字列リテラル'''となりますので、 char 型の配列として扱われますが、シングルクォーテーションで括った場合は'''文字リテラル'''となり、 char 型の (単一の) 値として扱われます。
     379
     380{{{
     381    char text[] = "Hello, World!";  /* 文字列なので、配列として扱われる */
     382    char letter = ',';              /* 単一の値として扱われる */
     383}}}
     384
     385それから、 "\0" は'''ヌル文字'''といって、 C 言語では文字列の終端を表す値として利用されています。実は、
     386
     387{{{
     388    char text[] = "Hello, World!";
     389}}}
     390
     391と書くのは、
     392
     393{{{
     394    char text[] = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 10, 0 };
     395}}}
     396
     397と書くのと同じ意味で、文字列リテラルで char 型の配列を初期化した場合、末尾にヌル文字が挿入されるというルールになっています。
     398