区切り子
トークンの概要:インデックス への移動
C++ の区切り子(punctuator,セパレータ)は次のとおりです。
- [ ]
- ( )
- { }
- ,
- ;
- :
- ...
- *
- =
- #
これらの区切り子のほとんどは演算子としても機能します。
大カッコ
[ ](左大カッコと右大カッコ)は,1 次元または多次元配列の添え字を示します。
char ch, str[] = "Stan";
int mat[3][4]; /* 3 × 4 の行列 */
ch = str[3]; /* 4 番目の要素 */
.
.
.
丸カッコ
( )(左丸カッコと右丸カッコ)は,式のグループ化(くくること),条件式の分離,関数呼び出し,関数パラメータを示します。
d = c * (a + b);/* 通常の評価順序を変更する */
if (d == z) ++x;/* 条件文では必須 */
func();/* 引数なしの関数呼び出し */
int (*fptr)();/* 関数ポインタの宣言 */
fptr = func;/* カッコなしは関数ポインタを意味する */
void func2(int n);/* パラメータ付き関数の宣言 */
マクロ展開時に起こりがちな優先順位の問題を回避するために,マクロの定義において丸カッコを使用することができます。
#define CUBE(x) ((x) * (x) * (x))
演算子の通常の優先順位と結合規則を変更するのに丸カッコを使う方法については,式を参照してください。
中カッコ
{ }(左中カッコと右中カッコ)は,複合文の始まりと終わりを示します。
if (d == z)
{
++x;
func();
}
構造体およびクラスの宣言を除いて,右中カッコは複合文の終わりを表すので,} の後ろに ;(セミコロン)は不要です。次の場合には,セミコロンは不正となります。
if (statement)
{}; /* 不正なセミコロン */
else
カンマ
カンマ(,)は,関数の引数リストの要素を分離します。
void func(int n, float f, char ch);
カンマは,カンマ式内の演算子としても使用されます。カンマの 2 つの用法を組み合わせて使用することができますが,丸カッコを用いてそれらを区別する必要があります。(exp1, exp2) は exp1 と exp2 の両方の式を評価しますが,式全体の型と値は 2 番目の式の評価結果に従うことに注意してください。
func(i, j); /* 2 つの引数を伴う関数呼び出し */
func((exp1, exp2), (exp3, exp4, exp5)); /* これも 2 つの引数を伴う関数呼び出し */
セミコロン
セミコロン(;)は文の終了子です。セミコロンが後ろに付いた,正しい C の式は(空文も含めて)すべて文,すなわち式文(expression statement)として解釈されます。式は評価され,値は放棄されます。式文が何も副作用を持たない場合,コンパイラはその式文を無視することがあります。
a + b; /* a+b は評価されるかもしれないが,その値は放棄される */
++a; /* a に副作用を及ぼすが,++a の値は放棄される */
/* 空の式 = 空文 */
空文を作成するためにセミコロンを使用する場合もあります。
for (i = 0; i < n; i++)
{
;
}
コロン
コロン(:)は,ラベル付きの文を示します。
start: x=0;
...
goto start;
ラベルについての詳細は,ラベル付き文を参照してください。
省略記号
省略記号(...)は,間にホワイトスペースのない連続した 3 つのピリオドです。省略記号は,関数プロトタイプの仮引数として使用され,可変個の引数あるいは異なる型の引数を受け入れられることを示します。
void func(int n, char ch,...);
この宣言文では,func を呼び出すときには少なくとも 2 つの引数(int および char)を指定しなければならず,また任意の個数の追加の引数を指定できることを示しています。
C++ では,省略記号の前のカンマを省略できます。
アスタリスク(ポインタの宣言)
変数宣言内のアスタリスク (*)は,あるデータ型に対するポインタの生成を表しています。
char *char_ptr; /* char へのポインタの宣言 */
複数の間接参照レベルを持つポインタは,適正な数のアスタリスクを付けることにより宣言されます。
int **int_ptr; /* int へのポインタへのポインタ */
double ***double_ptr; /* double の行列へのポインタ */
アスタリスクは,ポインタを通じて参照を行う演算子,あるいは乗算演算子としても使用されます。
i = *int_ptr;
a = b * 3.14;
等号(初期化子)
等号(=)は,変数宣言とその初期化リストを分離します。
char array[5] = { 1, 2, 3, 4, 5 };
int x = 5;
C 関数では,コードが変数宣言に先行することはありません。C++ 関数では,データ型の宣言はコード内のどこにでも記述できます(制限がいくつかあります)。
等号は,C++ 関数の引数リスト内ではパラメータのデフォルト値を表します。
int f(int i = 0) { ... } /* パラメータ i のデフォルト値は 0 */
等号は,式内の代入演算子としても使用されます。
int a, b, c;
a = b + c;
float *ptr = (float *) malloc(sizeof(float) * 100);
シャープ記号(プリプロセッサ指令)
シャープ記号 (#)は,行の中で最初の非ホワイトスペース文字として用いられると,プリプロセッサ指令を表します。これは,コンパイラ動作を示します。このコンパイラ動作は必ずしもコード生成とは関係なくてもかまいません。プリプロセッサ指令の詳細については,プリプロセッサ指令を参照してください。
# と ##(二重シャープ記号)は,プリプロセッサのスキャン段階でのトークンの文字列化,あるいはトークンどうしの結合を行うための演算子としても使われます。詳細については,## によるトークンの結合を参照してください。