C言語/記法

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

このページでは、C言語の記法に関する情報を網羅するよう心掛けたが、 「3文字表記」、「国際文字名」、「前処理数」については読み飛ばしてもかまわないだろう。

文字集合[編集]

C言語のプログラムは次にあげる文字を使って記述される。 また、次にあげる文字以外にもコンパイラが対応していれば使用できる。

  • 26個のラテンアルファベットの大文字
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
  • 26個のラテンアルファベットの小文字
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
※ラテンアルファベットの各文字の値は、連続しているとは限らない。例えばASCII文字コードでは連続しているが、EBCDIC文字コードでは'A'~'I', 'J'~'R', 'S'~'Z'の3つに分かれ連続していない。[1]
  • 10個の10進数字
0 1 2 3 4 5 6 7 8 9
※0の右側に並んでいる各文字の値は、1つ左側にある文字の値に比べ1だけ大きくなければならない。[2]
  • 29個の図形文字
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
  • 空白文字
  • 制御文字(水平タブ、垂直タブ、書式送り)

3文字表記[編集]

Wikipedia
ウィキペディア3文字表記の記事があります。


3文字表記(トライグラフシーケンス)とは、次に示す左側の3つの文字の並びである。

??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~

3文字表記がソースファイルの中にある場合、その3つの文字の並びを同じ行の右側の対応する1文字に置き換える。 これら以外の3文字表記は、存在しない。 上に掲げた3文字表記の始まりとならない?は、置き換えない。 3文字表記は、7ビットUS ASCII符号集合の部分集合であるISO/IEC646で規定する普遍符号集合に定義がない文字の入力を可能にする。 [3]

3文字表記に一致する文字列を表記したい場合、「?」の代わりに逆斜線表記(エスケープシーケンス)の「\?」を用いるとよい。 現在、3文字表記はほとんど使われず、コンパイラによっては、実装されていなかったり、デフォルトで無効になっていたりする。

多バイト文字[編集]

多バイト文字もコンパイラが対応していれば使用できる。[4]

字句[編集]

字句とはC言語の最小の字句的な単位である。 字句には、キーワード、識別子、国際文字名、定数、文字列リテラル、区切り子、ヘッダ名、前処理数、注釈などがある。 [5]

キーワード[編集]

ここでは個々のキーワードの機能については説明しません。
詳細はリンク先を参照してください。

キーワードとは特定の機能のために予約された字句であり、その他の機能のためには使用できない。キーワードとは次のいずれかである。

auto enum restrict unsigned
break extern return void
case float short volatile
char for signed while
const goto sizeof _Bool
continue if static _Complex
default inline struct _Imaginary
do int switch
double long typedef
else register union

[6]

識別子[編集]

識別子とは、1つ又はそれ以上の実体を指し示すもので、[7] オブジェクト、関数、構造体・共用体・列挙体のタグまたはメンバ、型定義名、ラベル名、マクロ名、マクロ仮引数のいずれか一つを表す。[8]

識別子は、半角英数、「_(下線)」からなる文字列である。 ただし、先頭は非数字でなければならない。 識別子に多バイト文字を使用できるかはコンパイラによる。[7]

__func__[編集]

識別子__func__は、コンパイラによって暗黙に宣言され、関数名の文字列としてデバッグなどで使用できる。[9]

//例 __func__の使い方
#include <stdio.h>

int main(void)
{
	printf("%s\n", __func__);//「main(改行)」と表示する。
}

国際文字名[編集]

国際文字名とは、ISO 10646 文字集合の文字を 16 進数で直接記述してしまおうという仕様である。[10]

国際文字名の記述は次のようになっている。

\unnnn
\Unnnnnnnn

nは16進数字。国際文字名は、次に示す短い識別子を持つ文字を指定してはならない。 00A0未満[0024($)0040(@)及び0060(`)を除く]、D800~DF00。 国際文字名は、基本文字集合にない文字を表すために、識別子、文字定数、及び文字列リテラルの中で使用できる。 国際文字名\Unnnnnnnnは8桁の短い識別子がnnnnnnnnである文字を表す。 国際文字名\unnnnは4桁の短い識別子がnnnnである文字を表す(この文字の8桁の短い識別子は、0000nnnnである。)。 国際文字名の識別子はISO/IEC 10646で規定されている。 [11]

定数[編集]

定数とはプログラム実行時に一定の値しかもたない数である。 変数の値がプログラム実行中に変更される場合もあるのに対して、定数の値はプログラム実行中を通して一定である。 ソースコード中で直接に記述された定数を特にリテラルとも呼ぶ。ここではそのリテラルについて説明する。

【下の表を参照しつつ読むこと】定数には整数定数、浮動小数点定数、列挙定数、文字定数、文字列定数、などがある。 整数定数とは整数を記述するための定数である。主に10進数表記が使われるが、必要に応じて8進数表記や16進数表記が使われることもある。8進数表記では接頭辞として0を付け、[12]16進数表記では接頭辞として0xを付ける。 浮動小数点定数とは浮動小数点数を記述するための定数である。主に10進数の小数点数表記で記述するが、必要に応じて有効数字部と指数部で記述することもある。 列挙定数についてはここでは説明しない。詳細はC言語/データ型と変数#enumを参照せよ。 文字定数とは1バイト文字を記述するための定数である。半角英数記号や半角カタカナなどが記述できる。 文字列定数(文字列リテラル)とは1バイト文字または多バイト文字の文字列を記述するための定数である。C言語では文字列は文字の配列として扱われるが、ここではこれ以上説明しない。詳細はC言語/文字と文字列を参照せよ。

  • 次に主な定数を表にまとめた。
定数の種類 進数 記法
整数定数 8進数 「0」に続く8進数 02322 // 10進数で1234のこと
10進数 10進数 1234
16進数 「0x」に続く16進数 0x4d2 // 10進数で1234のこと
浮動小数点定数 10進数 10進整数部と「.」と10進小数部
10進有効数字部と「e」と10進指数部(10のべき乗)
3.14
1e-3 // 0.001のこと
16進数 「0x」に続く16進整数部と「.」と16進小数部と「p」と10進指数部(2のべき乗)
「0x」に続く16進有効数字部と「p」と10進指数部(2のべき乗)
文字定数 - 「'(一重引用符)」で囲まれた文字(単純文字定数)
「L」に続く「'(一重引用符)」で囲まれた文字(ワイド文字定数)
'a'
L'a'
文字列定数 - 「"(二重引用符)」で囲まれた文字列(単純文字列リテラル)
「L」に続く「"(二重引用符)」で囲まれた文字列(ワイド文字列リテラル)
"Hello, World!"
L"Hello, World!"

[13][14]

  • 整数定数の接尾語

整数定数に接尾語を付けることで、その型を指定することができる。整数定数の型は、次の表の対応する並びの中で、その値を表現できる最初の型である。

接尾語 10進定数 8進定数又は16進定数
なし int
long int
long long int
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
u又はU unsigned int
unsigned long int
unsigned long long int
unsigned int
unsigned long int
unsigned long long int
l又はL long int
long long int
long int
unsigned long int
long long int
unsigned long long int
u又はU及びl又はLの両方 unsigned long int
unsigned long long int
unsigned long int
unsigned long long int
ll又はLL long long int long long int
unsigned long long int
u又はU及びll又はLLの両方 unsigned long long int unsigned long long int

[15]

  • 浮動小数点定数の接尾語

浮動小数点定数に接尾語を付けることで、その型を指定することができる。 浮動小数点定数の型は、接尾語なしで型double、接尾語f又はFで型float、l又はLで型long doubleである。 [16]

//例 変数に定数の値を代入する。
#include <string.h>

int main(void)
{
	int i;
	i=1234;//iに整数定数1234を代入する。
	double d;
	d=3.14;//dに浮動小数点定数3.14を代入する。
	char c;
	c='a';//cに文字定数aを代入する。
	char str[32];
	strcpy(str,"Hello, World!");//strに文字列定数Hello, World!をコピーする。
}

区切り子[編集]

ここでは個々の区切り子の機能については説明しません。
詳細はリンク先を参照してください。

区切り子とは次のいずれかである。

[] () 関数呼び出し
() キャスト演算子
() 優先
{} ブロック
{} 配列の初期化リスト
. ->
++ -- & 単項&演算子
& 2項&演算子
* 単項*演算子
* 2項*演算子
+ 単項+演算子
+ 2項+演算子
- 単項-演算子
- 2項-演算子
~ !
/ % << >> < > <= >= == != ^ | && ||
? 条件演算子の一部 : 条件演算子の一部
: switch文のラベル
: goto文のラベル
; 文の終わり
; for文の区切り
...
= *= /= %= += -= <<= >>= &= ^= |=
, コンマ演算子
, 変数の一括宣言
, 列挙体のメンバの区切り
, 配列の初期化リストの区切り
, 関数の引数の区切り
# ##
<: :> <% %> %: %:%:

区切り子とは、独立した構文的及び意味的な機能を持つ記号である。 何らかの操作を行うとき、それを演算子と呼ぶ。また演算子が操作を行う対象をオペランドと呼ぶ。 [17]

次の6つの2文字の字句は、2文字表記と呼ばれる。

<: :> <% %> %: %:%:

前の6つの字句は、次の6つの字句と同じである。

[ ] { } # ##

[17]

ヘッダ名[編集]

ヘッダ名の記述は次のようになっている。

<文字列>
"文字列"

ヘッダ名とは、#include前処理指令で読み込まれるファイル名を指す。 ヘッダ名には「'、\、"、//、/*」は指定できない。 [18]

#include前処理指令については、C言語/前処理指令#ソースファイル取り込みを参照せよ。

前処理数[編集]

前処理数の記述は次のようになっている。 なお、ここでは『JISX3010:2003』の構文規則をそのまま引用している。

構文規則[19]

前処理数
	数字
	.数字
	前処理数 数字
	前処理数 識別子用非数字
	前処理数 e符号
	前処理数 E符号
	前処理数 p符号
	前処理数 P符号
	前処理数 .

前処理数は、省略可能なピリオド(.)をもつ数字で始まる。 その後ろに正しい識別子用文字及び文字の並びe+、e-、E+、E-、p+、p-、P+、P-が続いてもよい。 前処理数字句は、字句的に全ての浮動小数点定数字句及び整数定数字句を含む。 [20]

前処理数とは、整数か浮動小数点数かを区別するまえの大雑把な解析によって得られた字句のこと。[21]

注釈[編集]

注釈(コメント)の記述は次のようになっている。

//注釈の例1
/*注釈の例2*/

注釈とはプログラマの覚え書きとしての単なるメモで、プログラムの処理とは一切関係はない。 他人の書いたコードや自分が昔書いたコードを注釈なしに理解することは困難であるため、適度な注釈はコードの理解を高めます。

C言語では2種類の注釈表記方法があり、「//」から行の終わりまで、または「/*」と「*/」とで囲まれた文章が注釈である。[22]

なお、昔は「/*」と「*/」が正式な注釈で、「//」はコンパイラによって独自に実装されていたが、現在は公式の仕様である。[23]

[編集]

文の記述は次のようになっている。

/*いくつかの字句*/;//「;(セミコロン)」で終わる

文とは実行すべき動作を記述したものであり、空白類(空白、水平タブ、改行、垂直タブ、書式送り)で分けられたいくつかの字句からなり、「;(セミコロン)」で終わる。 文は基本的に上から下へ順番に実行される。[24]

ブロック[編集]

ブロックの記述は次のようになっている。

{//ブロックの始まり
	//文
	//文
	//文
	//...
}//ブロックの終わり

ブロックとはいくつかの文を1つの構造的な単位にまとめたものである。[24]

脚注[編集]

  1. ^ 『[迷信] 'A'~'Z' の値は連続している | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html
  2. ^ 『JISX3010:2003』p.12「5.2.1 文字集合」
  3. ^ 『JISX3010:2003』p.13「5.2.1.1 3文字表記」
  4. ^ 『JISX3010:2003』p.13「5.2.1.2 多バイト文字」
  5. ^ 『JISX3010:2003』p.35「6.4 字句要素」
  6. ^ 『JISX3010:2003』p.37「6.4.1 キーワード」
  7. ^ 7.0 7.1 『JISX3010:2003』p.37「6.4.2 識別子」
  8. ^ 『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」
  9. ^ 『JISX3010:2003』p.38「6.4.2.2 あらかじめ定義された識別子」
  10. ^ 『[迷信] 識別子に使える文字は英数字と下線のみ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/only-alnums-and-underscore-are-usable-for-identifier.html
  11. ^ 『JISX3010:2003』p.39「6.4.3 国際文字名」
  12. ^ 『知ってた?8進数のナゾ:Alternative 笑門来福:ITmedia オルタナティブ・ブログ』http://blogs.itmedia.co.jp/pina/2006/06/8_bf7b.html
  13. ^ 『JISX3010:2003』p.39「6.4.4 定数」
  14. ^ 『JISX3010:2003』p.45「6.4.5 文字列リテラル」
  15. ^ 『JISX3010:2003』p.39「6.4.4.1 整数定数」
  16. ^ 『JISX3010:2003』p.41「6.4.4.2 浮動小数点定数」
  17. ^ 17.0 17.1 『JISX3010:2003』p.46「6.4.6 区切り子」
  18. ^ 『JISX3010:2003』p.46「6.4.7 ヘッダ名」
  19. ^ 『JISX3010:2003』p.21「6.1 記法」
  20. ^ 『JISX3010:2003』p.47「6.4.8 前処理数」
  21. ^ 『第10回 翻訳フェーズ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/creintro/translation-phases.html
  22. ^ 『JISX3010:2003』p.48「6.4.9 注釈」
  23. ^ 『C言語の最新事情を知る: C99の仕様 - Build Insider』http://www.buildinsider.net/language/clang/01
  24. ^ 24.0 24.1 『JISX3010:2003』p.99「6.8 文及びブロック」

参考文献[編集]

  • 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正