C言語の基本文法
声明
C 言語コードはステートメントの行で構成されます。ステートメントとは、プログラムが実行する操作命令です。 C 言語では、セミコロンを書かないという明示的な要件がない限り、ステートメントはセミコロンで終了する必要があると規定されています。
int x = 1;
上記は変数宣言文で、整数変数 x
を宣言し、値を 1
に設定します。
複数のステートメントを 1 行に記述することができます。
int x = 1;
上の例では、1 行に 2 つのステートメントが記述されています。したがって、ステートメント間の改行は必要なく、単にコードを読みやすくするためのものです。
ステートメントは複数行で記述することもできます。この場合、ステートメントがどの行で終了するかを決定するためにセミコロンを使用する必要があります。
int x;
×
=
1
;
上の例では、2 番目のステートメント x = 1;
が 4 行に分割されています。コンパイラはコード内の改行を自動的に無視します。
単一のセミコロンも有効なステートメントであり、「空ステートメント」と呼ばれますが、効果はありません。
;
表現
C言語における各種計算は主に式によって完結します。式は値を取得するために使用される計算です。
1+2
上記コードは「1 + 2」の四則演算の結果を求める式です。
セミコロンを含む式もステートメントになりますが、実際的な効果はありません。
8;
3 + 4;
上記の例は 2 つの式であり、セミコロンを追加するとステートメントになります。
式とステートメントの違いは主に次の 2 点です。
- ステートメントには式を含めることができますが、式自体はステートメントを構成しません。
- 式には戻り値がありますが、ステートメントには戻り値がない場合があります。このステートメントは特定のコマンドを実行するために使用されるため、多くの場合、値を返す必要はありません。たとえば、変数宣言ステートメント (
int x = 1
) には戻り値がありません。
ステートメントブロック
C 言語では、複数のステートメントが中かっこ {}
のペアを使用してブロックを形成することができます。これは複合ステートメントとも呼ばれます。文法的には、ステートメント ブロックは複数のステートメントで構成される複合ステートメントと見なすことができます。
{
int x;
x = 1;
}
上の例では、中括弧がステートメントのブロックを形成しています。
中括弧の最後にセミコロンを追加する必要はありません。
空間
C 言語のスペースは主に、コンパイラが文法単位を区別しやすくするために使用されます。文法単位がスペースなしで区別できる場合、スペースは必要ありませんが、コードの可読性が向上するだけです。
int x = 1;
// と同等
int x=1;
上記の例では、コンパイラはスペースを使用しなくても文法単位を区別できるため、代入番号 (=
) の前後にスペースがあっても問題ありません。
文法単位間の複数のスペースは 1 つのスペースと同等です。
int x = 1;
上の例では、各文法単位間の複数のスペースは 1 つのスペースと同じ効果があります。
スペースはインデントを示すためにも使用されます。マルチレベルのコードがインデントされているかどうかは、実際にはインデントのないコードは完全に実行可能です。コードのインデントに重点を置くのは、コードの読みやすさを向上させ、コード ブロックを区別しやすくするためだけです。
ほとんどの C 言語のスタイル要件は、コードの次のレベルが前のレベルからスペース 4 つインデントされることです。コンパクトに書くために、この本では略語に 2 つのスペースを使用しています。
// スペースを 4 つインデントします
if(x>0)
printf("正\n");
// スペースを 2 つインデントします
if(x>0)
printf("正\n");
スペースのみを含む行は空行と呼ばれ、コンパイラによって完全に無視されます。
コメント
コメントはコードの説明であり、コンパイラによって無視されます。つまり、コメントは実際のコードに影響を与えません。
C言語でコメントを表現するには2つの方法があります。 1 つ目の方法は、複数の行に分割できる /*...*/
の間にコメントを入れる方法です。
/* コメント */
/*
これはコメントの行です
*/
このようなコメントはインラインで挿入できます。
int open(char* s /* ファイル名 */, int モード);
上記の例では、関数パラメータの記述に /* ファイル名 */
が使用されており、これに続くコードも引き続き効果的に実行されます。
この種のコメントは、終了記号 */
を忘れずに書く必要があります。そうしないと、エラーが発生しやすくなります。
printf("a "); /* 注 1
printf("b");
printf("c "); /* 注 2 */
printf("d");
上記の例の本来の意図は、コードの 1 行目と 3 行目の最後に 2 つのコメントがあることです。しかし、コメントの1行目に終了記号を書き忘れたため、コメントが3行目の終わりまで続いてしまいました。
2 つ目の書き方は、ダブルスラッシュ //
の後にコメントを置く方法で、ダブルスラッシュから行末までがコメントになります。この種のコメントは 1 行のみで、ステートメントの行の先頭または行の末尾に配置できます。これは、C99 標準に追加された新しい構文です。
// これはコメント行です
int x = 1; // これもコメントです
どのような種類のコメントであっても、二重引用符で囲むことはできません。二重引用符内のコメント記号は文字列の一部となり、通常の記号として解釈され、コメント機能が失われます。
printf("// こんにちは /* 世界 */ ");
上の例では、二重引用符内のコメント記号は通常の文字として扱われ、コメント効果はありません。
コンパイル時にコメントはスペースに置き換えられるため、min/* space */Value
は minValue
ではなく min Value
になります。
printf()
基本的な使い方
本書の例では printf()
関数を多用します。ここでは最初にこの関数を紹介します。
printf()
の機能は、パラメータのテキストを画面に出力することです。名前の「f」は「format」を表し、出力テキストの形式をカスタマイズできることを意味します。
printf("Hello World");
上記のコマンドは、画面に「Hello World」というテキスト行を出力します。
printf()
は行末に改行文字を自動的に追加しません。実行後、カーソルは出力の末尾に留まり、自動的に折り返されません。カーソルを次の行の先頭に移動するには、出力テキストの末尾に改行文字「\n」を追加します。
printf("Hello World\n");
テキスト内に改行がある場合は、改行文字を挿入することによっても実現されます。
printf("Hello\nWorld\n");
上の例では、最初に Hello
を出力し、次に改行を出力し、次に次の行の先頭に World
を出力し、次に別の改行を出力します。
上記の例は、2 つの printf()
として記述することもでき、まったく同じ効果が得られます。
printf("こんにちは\n");
printf("世界\n");
printf()
は標準ライブラリのヘッダファイルstdio.h
内に定義されています。この関数を使用する前に、このヘッダファイルをソースコードファイルの先頭に導入する必要があります。
#include <stdio.h>
int main(void) {
printf("Hello World\n");
}
上記の例では、printf()
関数は、ソース端末に #include <stdio.h>
が追加されている場合にのみ使用できます。 #include
ディレクティブの詳細については、「プリプロセッサ」の章を参照してください。
プレースホルダー
printf()
は出力テキスト内のプレースホルダーを指定できます。いわゆる「プレースホルダー」とは、この位置を他の値で置き換えることができることを意味します。
// 出力 リンゴが 3 つあります
printf("リンゴが %i 個あります\n", 3);
上の例では、There are %i apples\n
が出力テキストで、内部の %i
はプレースホルダーで、この位置を他の値に置き換える必要があることを示しています。プレースホルダーの最初の文字は常にパーセント記号「%」で、2 番目の文字はプレースホルダーのタイプを示し、「%i」はここで置換される値が整数でなければならないことを意味します。
printf()
の 2 番目のパラメータは、プレースホルダーの値を置き換えます。上の例では、整数 3
が %i
を置き換えます。実行後の出力は「リンゴが 3 つあります」となります。
%i
に加えて、一般的に使用されるプレースホルダーには、文字列が置換されることを示す %s
も含まれます。
printf("%s は今夜来ます\n", "ジェーン");
上記の例では、「%s」は文字列が置換されることを意味するため、「printf()」の 2 番目のパラメータは文字列である必要があります。この例は「Jane」です。実行後の出力は「ジェーンは今夜来ます」になります。
出力テキストでは複数のプレースホルダーを使用できます。
printf("%s は %1 時だと言っています\n", "ベン", 21);
上記の例では、出力テキスト %s は %i o' Clock です
には 2 つのプレースホルダーがあります。1 つ目は文字列プレースホルダー %s
で、2 つ目は整数プレースホルダー %i
です。それぞれ printf()
の 2 番目のパラメータ (Ben
) と 3 番目のパラメータ (21
) です。実行後の出力は「Ben は 21 時だと言っています」となります。
「printf()」パラメータとプレースホルダの間には 1 対 1 の対応関係があります。「n」個のプレースホルダがある場合、「printf()」には「n + 1」個のパラメータが必要です。引数の数が対応するプレースホルダーよりも少ない場合、printf()
はメモリ内の任意の値を出力する可能性があります。
printf()
のプレースホルダには C 言語のデータ型に対応した多くの種類があります。簡単に検索できるように、一般的に使用されるプレースホルダーをアルファベット順に以下に示します。具体的な意味については、後続の章で説明します。
%a
: 16 進浮動小数点数、文字は小文字で出力されます。%A
: 16 進浮動小数点数、文字は大文字で出力されます。%c
: 文字。%d
: 10 進整数。%e
: 科学表記法を使用した浮動小数点数。指数部のe
は小文字です。%E
: 科学表記法を使用した浮動小数点数。指数部のE
は大文字です。%i
: 整数。基本的には%d
と同等です。%f
: 10進数(float型、double型を含む)。%g
: 有効数字 6 桁の浮動小数点数。整数部が6桁を超えると自動的に科学表記に変換され、指数部の「e」が小文字になります。%G
:%g
と同じですが、唯一の違いは、指数部のE
が大文字であることです。%hd
: 10 進数の short int 型。%ho
: 8 進数の short int 型。%hx
: 16 進数の short int 型。%hu
: unsigned short int 型。%ld
: 10進数のlong int型。%lo
: 8進数のlong int型。%lx
: 16進数のlong int型。%lu
: unsigned long int 型。%lld
: 10進数のlong long int型。%llo
: 8進数のlong long int型。%llx
: 16 進数の Long Long int 型。%llu
: unsigned long long int 型。%Le
: 科学表記法で表現されたlong double型浮動小数点数。%Lf
:long double 型の浮動小数点数。%n
: 出力される文字列の数。プレースホルダー自体は出力せず、指定された変数に値を格納するだけです。%o
: 8 進整数。%p
: ポインタ。%s
: 文字列。%u
: 符号なし整数。%x
: 16 進整数。%zd
:size_t
タイプ。%%
: パーセント記号を出力します。
出力形式
printf()
はプレースホルダーの出力形式をカスタマイズできます。
(1) 幅の制限
printf()
を使用すると、プレースホルダーの最小幅を制限できます。
printf("%5d\n", 123); // 出力は「123」です
上記の例では、%5d
は、このプレースホルダーの幅が少なくとも 5 文字であることを意味します。 5 桁未満の場合は、対応する値の前にスペースが追加されます。
出力値はデフォルトでは右揃えです。つまり、出力内容の前にスペースがあり、左揃えに変更して出力内容の後にスペースを追加したい場合は、後ろに「-」を挿入します。プレースホルダー %
。
printf("%-5d\n", 123); // 出力は「123」です
上記の例では、出力内容「123」の後にスペースが追加されます。
小数の場合、この修飾子はすべての数値の最小表示幅を制限します。
// 「123.450000」を出力します
printf("%12f\n", 123.45);
上記の例で、「%12f」は、出力浮動小数点数が少なくとも 12 ビットを占有する必要があることを意味します。小数点以下のデフォルトの表示精度は小数点以下 6 桁であるため、「123.45」出力結果のヘッダーにはスペースが 2 つ追加されます。
(2) 常にプラスとマイナスの符号を表示する
デフォルトでは、printf()
は正の数値の場合は +
記号を表示せず、負の数値の場合は -
記号のみを表示します。正の数値でも「+」記号を出力したい場合は、プレースホルダー内の「%」の後に「+」を追加できます。
printf("%+d\n", 12); // 出力 +12
printf("%+d\n", -12); // 出力 -12
上記の例では、「%+d」により出力値が常に符号付きであることが保証されます。
(3) 小数点以下の桁数を制限する
小数を出力する場合、小数点以下の桁数を制限したい場合があります。たとえば、小数点以下 2 桁だけを保持したい場合は、プレースホルダを %.2f
と書くことができます。
// 出力番号は 0.50 です
printf("数値は %.2f\n", 0.5);
上記の例で、小数点以下 3 桁 (0.500
) を出力したい場合は、プレースホルダーを %.3f
と記述する必要があります。
この書き込み方法は、幅が制限されたプレースホルダーと組み合わせて使用できます。
// 出力は「0.50」です
printf("%6.2f\n", 0.5);
上記の例の %6.2f
は、出力文字列の最小幅が 6 で、小数点以下の桁数が 2 であることを意味します。したがって、出力文字列の先頭には 2 つのスペースが含まれます。
最小幅と小数点以下の桁数の 2 つの制限値は、*
に置き換えて、printf()
のパラメータを通じて渡すことができます。
printf("%*.*f\n", 6, 2, 0.5);
// と同等
printf("%6.2f\n", 0.5);
上の例では、%*.*f
の 2 つのアスタリスクが、printf()
の 2 つのパラメーター 6
と 2
を通じて渡されます。
(4) 文字列の出力部分
%s
プレースホルダーは文字列を出力するために使用され、デフォルトではすべてを出力します。先頭部分のみを出力したい場合は、%.[m]s
を使用して出力の長さを指定できます。ここで、[m]
は出力する長さを示す数値を表します。
//こんにちはを出力します
printf("%.5s\n", "hello world");
上記の例では、プレースホルダー %.5s
は、文字列「hello world」の最初の 5 文字、つまり「hello」のみが出力されることを意味します。
標準ライブラリ、ヘッダー ファイル
プログラムで使用する必要がある関数は、必ずしも自分で記述する必要はありません。C 言語があらかじめ付属している場合もあります。プログラマはこれらの組み込み関数を呼び出すだけでよく、自分でコードを記述する必要はありません。たとえば、C 言語には printf()
関数が付属しており、これを呼び出すだけで画面に内容を出力できます。
C 言語に付属するこれらの関数は、コードの標準化を確実にするために、どのような関数が含まれ、どのように使用されるべきかがすべて標準に記述されているため、総称して「標準ライブラリ」と呼ばれます。ポータブル。
異なる機能は異なるファイルに定義されており、これらのファイルを総称して「ヘッダー ファイル」と呼びます。システムに特定の関数が付属している場合、その関数を記述したヘッダー ファイルも付属しています。たとえば、printf()
のヘッダー ファイルはシステムに付属の stdio.h
です。ヘッダー ファイルの接尾辞は通常 .h
です。
特定の関数を使用したい場合は、まず対応するヘッダー ファイルをロードする必要があります。そのためには #include
コマンドを使用します。これが、printf()
を使用する前に stdio.h
をロードする必要がある理由です。
#include <stdio.h>
ヘッダー ファイルをロードする #include
ステートメントはセミコロンで終わる必要がないことに注意してください。詳細については、「プリプロセッサ」の章を参照してください。
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0