コンテンツにスキップ

C言語/構文体系

出典: フリー教科書『ウィキブックス(Wikibooks)』

C言語の構文体系

[編集]

C言語の構文は、大きく分けて以下の階層構造を持っています。この文書では、C言語の文法要素を体系的に解説します。

1. プログラム構造

[編集]

C言語のプログラムは、翻訳単位(translation unit)から構成されます。翻訳単位は、前処理後のソースファイル1つに相当します。

翻訳単位 → 外部宣言の列
外部宣言 → 関数定義 | 宣言

2. 宣言(Declarations)

[編集]

宣言は、識別子に意味を与えます。

2.1 変数宣言

[編集]
int x;                  // 単純な宣言
int y = 10;             // 初期化付き宣言
extern double pi;       // 外部変数の宣言
static char buffer[100]; // 静的記憶域を持つ変数

2.2 型宣言

[編集]
typedef int Integer;              // 型の別名定義
struct Point { int x, y; };       // 構造体の宣言
enum Color { RED, GREEN, BLUE };  // 列挙型の宣言
union Data {                      // 共用体の宣言
    int i;
    float f;
};

2.3 関数宣言(プロトタイプ)

[編集]
int add(int a, int b);            // 関数プロトタイプ
void print_array(int arr[], int size);

3. 定義(Definitions)

[編集]

定義は宣言の一種ですが、メモリの割り当てやコードの生成を伴います。

3.1 関数定義

[編集]
int add(int a, int b) {  // 関数ヘッダー
    return a + b;        // 関数本体
}

関数定義の構文:

関数定義 → 宣言指定子 宣言子 [宣言リスト] 複合文

4. 文(Statements)

[編集]

文は実行可能なコード単位です。

4.1 式文(Expression Statements)

[編集]
x = 5;          // 代入
func();         // 関数呼び出し
x++;            // 増分
;               // 空文(null statement)

4.2 複合文(Compound Statements)

[編集]
{
    int local = 10;
    printf("%d", local);
}

4.3 選択文(Selection Statements)

[編集]
if (condition) statement
if (condition) statement else statement
switch (expression) statement

例:

if (x > 0) {
    printf("Positive");
}

switch (option) {
    case 1: action1(); break;
    case 2: action2(); break;
    default: default_action();
}

4.4 反復文(Iteration Statements)

[編集]
while (expression) statement
do statement while (expression);
for (expression_1; expression_2; expression_3) statement

例:

while (i < 10) {
    printf("%d", i++);
}

for (int i = 0; i < 10; i++) {
    process(i);
}

do {
    input = get_input();
} while (input != EOF);

4.5 ジャンプ文(Jump Statements)

[編集]
goto identifier;
continue;
break;
return [expression];

4.6 ラベル付き文(Labeled Statements)

[編集]
identifier: statement
case constant-expression: statement
default: statement

5. 式(Expressions)

[編集]

式は値を計算します。

5.1 基本式

[編集]
42              // 定数(整数リテラル)
3.14            // 定数(浮動小数点リテラル)
'A'             // 文字リテラル
"Hello"         // 文字列リテラル
variable        // 変数
(expression)    // 括弧式

5.2 後置式(Postfix Expressions)

[編集]
expression[expression]       // 配列添字
expression(argument-list)    // 関数呼び出し
expression.identifier        // 構造体メンバアクセス
expression->identifier       // ポインタ経由の構造体メンバアクセス
expression++                 // 後置インクリメント
expression--                 // 後置デクリメント

5.3 単項式(Unary Expressions)

[編集]
++expression    // 前置インクリメント
--expression    // 前置デクリメント
&expression     // アドレス演算子
*expression     // 間接参照演算子
+expression     // 正符号
-expression     // 負符号
!expression     // 論理否定
~expression     // ビット単位否定
sizeof expression           // サイズ計算
sizeof(type-name)           // 型のサイズ計算
(type-name) expression      // 型キャスト

5.4 二項式(Binary Expressions)

[編集]
expression * expression      // 乗算
expression / expression      // 除算
expression % expression      // 剰余
expression + expression      // 加算
expression - expression      // 減算
expression << expression     // 左シフト
expression >> expression     // 右シフト
expression < expression      // 小なり
expression > expression      // 大なり
expression <= expression     // 以下
expression >= expression     // 以上
expression == expression     // 等しい
expression != expression     // 等しくない
expression & expression      // ビット単位AND
expression ^ expression      // ビット単位XOR
expression | expression      // ビット単位OR
expression && expression     // 論理AND
expression || expression     // 論理OR

5.5 条件式(Conditional Expression)

[編集]
expression ? expression : expression

5.6 代入式(Assignment Expressions)

[編集]
expression = expression
expression += expression
expression -= expression
expression *= expression
expression /= expression
expression %= expression
expression <<= expression
expression >>= expression
expression &= expression
expression ^= expression
expression |= expression

5.7 コンマ式(Comma Expression)

[編集]
expression, expression

6. 前処理指令(Preprocessor Directives)

[編集]
#include <stdio.h>           // ヘッダファイルの取り込み
#include "myheader.h"
#define MAX 100              // マクロ定義
#define SQR(x) ((x)*(x))     // 関数マクロ
#undef MAX                   // マクロ定義の解除
#ifdef SYMBOL                // 条件付きコンパイル
#ifndef SYMBOL
#if defined(SYMBOL)
#if !defined(SYMBOL)
#if expression
#elif expression
#else
#endif
#pragma                      // 実装固有の指令
#error message               // エラーメッセージ

7. 演算子の優先順位

[編集]
優先順位 演算子 結合性
1 () [] -> . 左から右
2 ! ~ ++ -- + - * & (type) sizeof 右から左
3 * / % 左から右
4 + - 左から右
5 << >> 左から右
6 < <= > >= 左から右
7 == != 左から右
8 & 左から右
9 ^ 左から右
10 `\ ` 左から右
11 && 左から右
12 `\ \ ` 左から右
13 ?: 右から左
14 = += -= *= /= %= <<= >>= &= ^= `\ =` 右から左
15 , 左から右

8. スコープ規則

[編集]

C言語には以下のスコープがあります:

  1. ファイルスコープ: 関数の外部で宣言された識別子
  2. ブロックスコープ: ブロック内で宣言された識別子
  3. 関数プロトタイプスコープ: 関数宣言のパラメータリスト内の識別子
  4. 関数スコープ: ラベル(goto文のターゲット)

9. リンケージ(Linkage)

[編集]
  1. 外部リンケージ: 複数の翻訳単位から参照可能
  2. 内部リンケージ: 単一の翻訳単位内でのみ参照可能
  3. リンケージなし: ローカル変数など