この節では,ANSI C規格の構文を引用してC言語の構文についてまとめます。
構文カテゴリはボールド体で,リテラル語または文字はモノスペースの非イタリック体で表します。
構文カテゴリの後のコロンはその構文の定義を示します。
定義が複数ある場合は別の行に表示するか,
「次のいずれか1つ」というように前置きしています。オプションの要素には
(opt) を付けています。たとえば,次の行はオプションの式を中括弧で囲んでいます。
{ 式(opt) }
括弧内のセクション番号は,C言語のこの部分を説明している『American National Standard for Information
Systems-Programming Language C』(文書番号: X3.159-1989)のセクションを示しています。
A.1.1レキシカル文法
A.1.1.1トークン
トークン: (§3.1)
キーワード
識別子
定数
文字列リテラル
演算子
区切り子
前処理トークン: (§3.1)
ヘッダ名
識別子
前処理数
文字定数
文字列リテラル
演算子
区切り子
上記以外の各非空白文字
A.1.1.2キーワード
キーワード: (§3.1.1)次のいずれか1つ
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
_Bool _Complex (Alpha専用)
A.1.1.3識別子
識別子: (§3.1.2)
非数字識別子
識別子 非数字識別子
識別子 数字
非数字識別子:
非数字
他の処理系定義の文字
非数字: (§3.1.2)次のいずれか1つ
a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z _
数字: (§3.1.2)次のいずれか1つ
0 1 2 3 4 5 6 7 8 9
A.1.1.4定数
定数: (§3.1.3)
浮動小数点定数
整数定数
列挙定数
文字定数
浮動小数点定数: (§3.1.3.1)
10進浮動小数点定数
16進浮動小数点定数
10進浮動小数点定数:
小数定数 指数部(opt)
浮動小数点接尾語(opt)
数字列 指数部 浮動小数点接尾語
(opt)
16進浮動小数点定数:
16進接頭語 16進小数定数 2進指数部 浮動小数点接尾語(opt)
16進接頭語 16進数字列 2進指数部 浮動小数点接尾語(opt)
小数定数: (§3.1.3.1)
数字列(opt) .
数字列
数字列 .
指数部: (§3.1.3.1)
e
符号(opt)
数字列
E
符号(opt)
数字列
符号: (§3.1.3.1)次のいずれか1つ
+ -
数字列: (§3.1.3.1)
数字
数字列 数字
16進小数定数:
16進数字列(opt) . 16進数字列
16進数字列 .
2進指数部:
p
符号(opt) 数字列
P
符号(opt) 数字列
16進数字列:
16進数字
16進数字列 16進数字
浮動小数点接尾語: (§3.1.3.1)次のいずれか1つ
f l F L
整数定数: (§3.1.3.2)
10進定数 整数接尾語(opt)
8進定数 整数接尾語
(opt)
16進定数 整数接尾語(opt)
10進定数: (§3.1.3.2)
0以外の数字
10進定数 数字
8進定数: (§3.1.3.2)
0
8進定数 8進数字
16進定数: (§3.1.3.2)
0x
16進数字
0X
16進数字
16進定数 16進数字
0以外の数字: (§3.1.3.2)次のいずれか1つ
1 2 3 4 5 6 7 8 9
8進数字: (§3.1.3.2)次のいずれか1つ
0 1 2 3 4 5 6 7
16進数字: (§3.1.3.2)次のいずれか1つ
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
整数接尾語: (§3.1.3.2)
符号なし接尾語 長接尾語(opt)
長接尾語 符号なし接尾語(opt)
符号なし接尾語: (§3.1.3.2)次のいずれか1つ
u U
長接尾語: (§3.1.3.2)次のいずれか1つ
l L
列挙定数: (§3.1.3.3)
識別子
文字定数: (§3.1.3.4)
'
c文字列
'
L '
c文字列
'
c文字列: (§3.1.3.4)
c文字
c文字列 c文字
c文字: (§3.1.3.4)
エスケープ・シーケンス
次のものを除くソース文字集合の任意のメンバ単一引用符(
'
),バックスラッシュ(
\
),または改行文字
エスケープ・シーケンス: (§3.1.3.4)
単純エスケープ・シーケンス
8進エスケープ・シーケンス
16進エスケープ・シーケンス
単純エスケープ・シーケンス: (§3.1.3.4)次のいずれか1つ
\' \" \? \\
\a \b \f \n \r \t \v
8進エスケープ・シーケンス: (§3.1.3.4)
\
8進数字
\
8進数字 8進数字
\
8進数字 8進数字
8進数字
16進エスケープ・シーケンス: (§3.1.3.4)
\x
16進数字
16進エスケープ・シーケンス
16進数字
A.1.1.5文字列リテラル
文字列リテラル: (§3.1.4)
"
s文字列(opt)
"
L "
s文字列(opt)
"
s文字列: (§3.1.4)
s文字
s文字列 s文字
s文字: (§3.1.4)
エスケープ・シーケンス
次のものを除くソース文字集合の任意のメンバ二重引用符(
"
),バックスラッシュ(
\
),または改行文字
A.1.1.6演算子
演算子: (§3.1.5)次のいずれか1つ
[ ] ( ) . ->
++ -- & * + - ~ ! sizeof
/ % << >> < > <= >= == != ^ | && ||
? :
= *= /= %= += -= <<= >>= &= ^= |=
, # ##
A.1.1.7区切り子
区切り子: (§3.1.6)次のいずれか1つ
[ ] ( ) { } * , : = ; ... #
A.1.1.8ヘッダ名
ヘッダ名: (§3.1.7)
<
h文字列
>
"
q文字列
"
h文字列: (§3.1.7)
h文字
h文字列 h文字
h文字: (§3.1.7)
次のものを除くソース文字集合の任意のメンバ改行文字および
>
q文字列: (§3.1.7)
q文字
q文字列 q文字
q文字: (§3.1.7)
次のものを除くソース文字集合の任意のメンバ改行文字および
"
A.1.1.9前処理数
前処理数: (§3.1.8)
数字
.
数字
前処理数 数字
前処理数 非数字
前処理数 e
符号
前処理数 E
符号
前処理数 .
A.1.2句構造文法
A.1.2.1式
1次式: (§3.3.1)
識別子
定数
文字列リテラル
(
式
)
後置式: (§3.3.2)
1次式
後置式 [ 式
]
後置式 ( 実引数式並び
(opt) )
後置式 .
識別子
後置式 ->
識別子
後置式 ++
後置式 -
実引数式並び: (§3.3.2)
代入式
実引数式並び , 代入式
単項式: (§3.3.3)
後置式
++
単項式
-
単項式
単項演算子 キャスト式
sizeof 単項式
sizeof ( 型名 )
単項演算子: (§3.3.3)次のいずれか1つ
& * + - ~ !
キャスト式: (§3.3.4)
単項式
(
型名
)
キャスト式
乗除式: (§3.3.5)
キャスト式
乗除式 *
キャスト式
乗除式 /
キャスト式
乗除式 %
キャスト式
加減式: (§3.3.6)
乗除式
加減式 +
乗除式
加減式 -
乗除式
シフト式: (§3.3.7)
加減式
シフト式 <<
加減式
シフト式 >>
加減式
関係式: (§3.3.8)
シフト式
関係式 <
シフト式
関係式 >
シフト式
関係式 <=
シフト式
関係式 >=
シフト式
等価式: (§3.3.9)
関係式
等価式 ==
関係式
等価式 !=
関係式
AND式: (§3.3.10)
等価式
AND式 &
等価式
排他的OR式: (§3.3.11)
AND式
排他的OR式
^
AND式
包含OR式: (§3.3.12)
排他的OR式
包含OR式
|
排他的
OR式
論理AND式: (§3.3.13)
包含OR式
論理AND式
&&
包含
OR式
論理OR式: (§3.3.14)
論理AND式
論理OR式
|
|
論理
AND式
条件式: (§3.3.15)
論理OR式
論理OR式
?
式
:
条件式
代入式: (§3.3.16)
条件式
単項式 代入演算子
代入式
代入演算子: (§3.3.16)次のいずれか1つ
= *= /= %= += -= <<= >>= &= ^= |=
式: (§3.3.17)
代入式
式 ,代入式
定数式: (§3.4)
条件式
A.1.2.2宣言
宣言: (§3.5)
宣言指定子 初期化宣言子並び
(opt) ;
宣言指定子: (§3.5)
記憶域クラス指定子 宣言指定子
(opt)
型指定子 宣言指定子(opt)
型修飾子 宣言指定子(opt)
初期化宣言子並び: (§3.5)
初期化宣言子
初期化宣言子並び , 初期化宣言子
初期化宣言子: (§3.5)
宣言子
宣言子 =
初期化子
記憶域クラス指定子: (§3.5.1)
typedef
extern
static
auto
register
型指定子: (§3.5.2)
void
char
short
int
long
float
double
signed
unsigned
_Bool
_Complex (Alpha専用)
構造体または共用体指定子
列挙型指定子
typedef名
構造体または共用体指定子: (§3.5.2.1)
struct
または union
識別子(opt) {
構造体宣言並び }
struct
または union
識別子
structまたはunion: (§3.5.2.1)
struct
union
構造体宣言並び: (§3.5.2.1)
構造体宣言
構造体宣言並び 構造体宣言
構造体宣言: (§3.5.2.1)
指定修飾子並び 構造体宣言子並び
;
指定修飾子並び: (§3.5.2.1)
型指定子 指定修飾子並び(opt)
型修飾子 指定修飾子並び(opt)
構造体宣言子並び: (§3.5.2.1)
構造体宣言子
構造体宣言子並び , 構造体宣言子
構造体宣言子: (§3.5.2.1)
宣言子
宣言子(opt) :
定数式
列挙型指定子: (§3.5.2.2)
enum
識別子(opt)
{ 列挙子並び }
enum
識別子(opt)
{ 列挙子並び , }
enum
識別子
列挙子並び: (§3.5.2.2)
列挙子
列挙子並び , 列挙子
列挙子: (§3.5.2.2)
列挙定数
列挙定数 =
定数式
型修飾子: (§3.5.3)
const
volatile
宣言子: (§3.5.4)
ポインタ(opt) 直接宣言子
直接宣言子: (§3.5.4)
識別子
( 宣言子 )
直接宣言子 [ 定数式
(opt) ]
直接宣言子
直接宣言子 ( 識別子並び
(opt) )
ポインタ: (§3.5.4)
* 型修飾子並び(opt)
* 型修飾子並び(opt) ポインタ
型修飾子並び: (§3.5.4)
型修飾子
型修飾子並び 型修飾子
仮引数型並び: (§3.5.4)
仮引数並び
仮引数並び , ...
仮引数並び: (§3.5.4)
仮引数宣言
仮引数並び , 仮引数宣言
仮引数宣言: (§3.5.4)
宣言指定子 宣言子
宣言指定子 抽象宣言子(opt)
識別子並び: (§3.5.4)
識別子
識別子並び , 識別子
型名: (§3.5.5)
指定修飾子並び 抽象宣言子(opt)
抽象宣言子: (§3.5.5)
ポインタ
ポインタ(opt) 直接抽象宣言子
直接抽象宣言子: (§3.5.5)
( 抽象宣言子 )
直接抽象宣言子(opt) [ 定数式
(opt) ]
直接抽象宣言子(opt) ( 仮引数型並び
(opt) )
typedef名: (§3.5.6)
識別子
初期化子: (§3.5.7)
代入式
{
初期化子並び
}
{
初期化子並び,
}
初期化子並び: (§3.5.7)
初期化子
初期化子並び , 初期化子
A.1.2.3文
文: (§3.6)
ラベル付き文
複文
式文
選択文
繰返し文
飛越し文
ラベル付き文: (§3.6.1)
識別子 :
文
case 定数式 :
文
default :
文
複文: (§3.6.2)
{
宣言並び(opt)
文並び(opt) }
宣言並び: (§3.6.2)
宣言
宣言並び 宣言
文並び: (§3.6.2)
文
文並び 文
式文: (§3.6.3)
式(opt) ;
選択文: (§3.6.4)
if (
式
)
文
if (
式
)
文
else
文
switch (
式
)
文
繰返し文: (§3.6.5)
while (
式
)
文
do
文
while (
式
) ;
for (
式(opt)
;
式(opt)
;
式(opt)
)
文
飛越し文: (§3.6.6)
goto 識別子 ;
continue ;
break ;
return 式(opt) ;
A.1.2.4外部定義
翻訳単位: (§3.7)
外部宣言
翻訳単位 外部宣言
外部宣言: (§3.7)
関数定義
宣言
関数定義: (§3.7.1)
宣言指定子(opt) 宣言子
宣言並び(opt) 複文
A.1.3前処理命令
前処理ファイル: (§3.8)
グループ(opt)
グループ: (§3.8)
グループ部
グループ グループ部
グループ部: (§3.8)
前処理トークン(opt) 改行
ifセクション
制御行
ifセクション: (§3.8.1)
ifグループ elifグループ
(opt) elseグループ(opt)
endif行
ifグループ: (§3.8.1)
#if
定数式
改行 グループ(opt)
#ifdef
識別子
改行 グループ(opt)
#ifndef
識別子
改行 グループ(opt)
elifグループ: (§3.8.1)
elifグループ
elifグループ群 elifグループ
elifグループ: (§3.8.1)
#elif
定数式
改行 グループ(opt)
elseグループ: (§3.8.1)
#else
改行
グループ(opt)
endif行: (§3.8.1)
#endif
改行
制御行:
#include
前処理トークン
改行 (§3.8.2)
#define
識別子
置換並び 改行 (§3.8.3)
#define
識別子
( 識別子並び )(opt)
置換並び 改行 (§3.8.3)
#undef
識別子
改行 (§3.8.3)
#line
前処理トークン
改行 (§3.8.4)
#error
前処理トークン
(opt) 改行 (§3.8.5)
#pragma
前処理トークン
(opt) 改行 (§3.8.6)
#
改行 (§3.8.7)
左括弧: (§3.8.3)
空白が先行しない左括弧文字
置換並び: (§3.8.3)
前処理トークン(opt)
前処理トークン: (§3.8)
前処理トークン
前処理トークン群 前処理トークン
改行: (§3.8)
改行文字