C言語/構文体系
表示
< C言語
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言語には以下のスコープがあります:
- ファイルスコープ: 関数の外部で宣言された識別子
- ブロックスコープ: ブロック内で宣言された識別子
- 関数プロトタイプスコープ: 関数宣言のパラメータリスト内の識別子
- 関数スコープ: ラベル(goto文のターゲット)
9. リンケージ(Linkage)
[編集]- 外部リンケージ: 複数の翻訳単位から参照可能
- 内部リンケージ: 単一の翻訳単位内でのみ参照可能
- リンケージなし: ローカル変数など