C言語/演算子と式

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

演算子と式の基本[編集]

Wikipedia
ウィキペディア結合法則の記事があります。


演算子とは演算の内容を指示する記号である。 式とは定数、変数、関数の返却値などを演算子を使って結合したものである。

演算子には優先順位がある。 次の表の優先順位は、その演算子の優先順位を表している。 演算子は優先順位が高いものから評価される。 例えば「1+2*3」の場合は、「4.加減演算子」より「3.乗除演算子」の方が優先順位が高いので、「3.乗除演算子」が先に評価され、値は「7」となる。

演算子には結合規則(結合性)がある。 次の表の結合規則は、「→(左から右、左結合)」と「←(右から左、右結合)」とで結合の方向を表している。 演算子の優先順位が同じ優先順位の場合は、結合規則の方向に演算が行われる。 例えば「a=b=1」の場合は、「14.代入演算子」は「←(右から左、右結合)」なので「b=1」が先に行われ、aとbの値はともに「1」となる。

数学と同様に()で囲むことにより優先させることができる。

オペランドとは、演算子が操作を行う対象のことであり、 定数、変数、関数の返却値、及びオペランドと演算子の組み合わせなどがオペランドとなりうる。

オペランドのデータ型は、より大きなオペランドのデータ型に変換される(暗黙の型変換)。 [1]

優先順位 演算子の種類 演算子 演算子の名称 意味 結合規則
1.後置式 配列の添字付け [] 添字演算子[] 配列オブジェクトの要素の添字による指定。
関数呼び出し () 関数呼び出し 関数呼び出し。
構造体及び共用体のメンバ . .演算子 構造体又は共用体オブジェクトの一つのメンバ。
-> ->演算子 構造体又は共用体オブジェクトの一つのメンバ。
後置増分及び後置減分演算子 ++ 後置++演算子 左オペランドが指す変数の値を返した後、その変数の値に1を加える。
-- 後置--演算子 左オペランドが指す変数の値を返した後、その変数の値から1を引く。
複合リテラル (型名){初期化子並び} 複合リテラル 初期化子並びで与えられる値を持つ名前のないオブジェクト
2.単項演算子
キャスト演算子
前置増分及び前置減分演算子 ++ 前置++演算子 右オペランドが指す変数の値に1を加え、その変数の値を返す。
-- 前置--演算子 右オペランドが指す変数の値から1を引き、その変数の値を返す。
アドレスおよび間接演算子 & 単項&演算子 右オペランドのアドレスを返す。
* 単項*演算子 右オペランドの間接参照を表す。
単項算術演算子 + 単項+演算子 右オペランドの値
- 単項-演算子 右オペランドの符号を反転した値
単項算術演算子 ~ ~演算子 右オペランドのビット単位の補数
単項算術演算子 ! 論理否定演算子! 右オペランドの否定
(右オペランドの値を0と比較し、等しい場合は1、等しくない場合は0)
sizeof演算子 sizeof(型名) sizeof演算子 オペランドの大きさ(バイト数)
キャスト演算子 (データ型)式 キャスト演算子 式の値を指定された型に型変換した値を返す。
3.乗除演算子 乗除演算子 * 2項*演算子 左右オペランドの積
/ 2項/演算子 左オペランドを右オペランドで除した商
右オペランドの値が0の場合、その動作は未定義である。
左右オペランドが整数型の場合、商の小数部は切り捨てられる。
% 2項%演算子 左オペランドを右オペランドで除した剰余
右オペランドの値が0の場合、その動作は未定義である。
左右オペランドは整数型でなければならない。
4.加減演算子 加減演算子 + 2項+演算子 左右オペランドの和
- 2項-演算子 左オペランドから右オペランドを引いた差
5.ビット単位のシフト演算子 ビット単位のシフト演算子 << <<演算子 左オペランドを右オペランドビット分左にシフトした値。
空いたビットには0を詰める。
>> >>演算子 左オペランドを右オペランドビット分右にシフトした値。
6.関係演算子 関係演算子 < <演算子 左オペランドが右オペランドより小さい場合は1、それ以外の場合は0
> >演算子 左オペランドが右オペランドより大きい場合は1、それ以外の場合は0
<= <=演算子 左オペランドが右オペランド以下の場合は1、それ以外の場合は0
>= >=演算子 左オペランドが右オペランド以上の場合は1、それ以外の場合は0
7.等価演算子 等価演算子 == ==演算子 左右オペランド同士を比較し、等しい場合は1、それ以外の場合は0
!= !=演算子 左右オペランド同士を比較し、等しくない場合は1、それ以外の場合は0
8.ビット単位のAND演算子 ビット単位のAND演算子 & 2項&演算子 両オペランドのビット単位の論理積
9.ビット単位の排他OR演算子 ビット単位の排他OR演算子 ^ ^演算子 両オペランドのビット単位の排他的論理和
10.ビット単位のOR演算子 ビット単位のOR演算子 | 演算子 両オペランドのビット単位の論理和
11.論理AND演算子 論理AND演算子 && &&演算子 左右オペランドの論理積
(左右オペランドの値を0と比較し、ともに等しくない場合は1、それ以外の場合は0)
12.論理OR演算子 論理OR演算子 || ||演算子 左右オペランドの論理和
(左右オペランドの値を0と比較し、いずれか一方でも等しくない場合は1、それ以外の場合は0)
13.条件演算子 条件演算子 式1 ? 式2 : 式3 条件演算子 式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価する。
14.代入演算子 単純代入 = 単純代入演算子 左オペランドが指す変数に右オペランドの値を格納する
代入後の左オペランドの値
複合代入 *= *=演算子 形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとする。
/= /=演算子
%= %=演算子
+ = +=演算子
-= -=演算子
<<= <<=演算子
>>= >>=演算子
&== &=演算子
^= ^=演算子
|= |=演算子
15.コンマ演算子 コンマ演算子 , コンマ演算子 左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。

算術演算子と代入演算子[編集]

【下の表を参照しつつ読むこと】 算術演算子とは加減乗除などの算術を指示する演算子である。 算術演算子には、加法を指示する+、減法を指示する-、[2] 乗法を指示する*、除法を指示する/、剰余を指示する%、などがあり、[3] また、-は符号の反転を指示するためにも用いられる。[4] 代入演算子とは代入を指示する演算子である。 代入演算子には右辺の値を左辺が指す変数へそのまま代入するように指示する=がある。[5]

  • 次に算術演算子と代入演算子を表にまとめた。
演算子の種類 演算子 演算子の名称 意味 結合規則
単項演算子 + 単項+演算子 右オペランドの値
- 単項-演算子 右オペランドの符号を反転した値
乗除演算子 * 2項*演算子 左右オペランドの積
/ 2項/演算子 左オペランドを右オペランドで除した商
右オペランドの値が0の場合、その動作は未定義である。
左右オペランドが整数型の場合、商の小数部は切り捨てられる。
% 2項%演算子 左オペランドを右オペランドで除した剰余
右オペランドの値が0の場合、その動作は未定義である。
左右オペランドは整数型でなければならない。
加減演算子 + 2項+演算子 左右オペランドの和
- 2項-演算子 左オペランドから右オペランドを引いた差
代入演算子 = 単純代入演算子 左オペランドが指す変数に右オペランドの値を格納する
代入後の左オペランドの値
//例 変数に算術演算子を用いた式の値を、代入演算子を用いて代入する。
int main(void)
{
	int i;
	i=-1;//iに-1を代入する。
	i=1*1;//iに1×1である1を代入する。
	i=1/1;//iに1÷1である1を代入する。
	i=1%1;//iに1÷1の余りである0を代入する。
	i=1+1;//iに1+1である2を代入する。
	i=1-1;//iに1-1である0を代入する。
}

比較演算子[編集]

【下の表を参照しつつ読むこと】 比較演算子とは、左辺と右辺の比較を指示する演算子である。 比較演算子は左辺が右辺と比較して、 「<(より小さい)」、「>(より大きい)」「<=(以下)」「>=(以上)」 「==(等しい)」「!=(等しくない)」の場合は真(1)を、 それ以外の場合は偽(0)を、値として返す。 [6] [7]

  • 次に比較演算子を表にまとめた。
演算子の種類 演算子 演算子の名称 意味 結合規則
関係演算子 < <演算子 左オペランドが右オペランドより小さい場合は1、それ以外の場合は0
> >演算子 左オペランドが右オペランドより大きい場合は1、それ以外の場合は0
<= <=演算子 左オペランドが右オペランド以下の場合は1、それ以外の場合は0
>= >=演算子 左オペランドが右オペランド以上の場合は1、それ以外の場合は0
等価演算子 == ==演算子 左右オペランド同士を比較し、等しい場合は1、それ以外の場合は0
!= !=演算子 左右オペランド同士を比較し、等しくない場合は1、それ以外の場合は0
//例 変数に比較演算子を用いた式の値を、代入演算子を用いて代入する。
int main(void)
{
	int r;
	r=10<20;	//rに1を代入する。
	r=10>20;	//rに0を代入する。
	r=10<=20;	//rに1を代入する。
	r=10>=20;	//rに0を代入する。
	r=10==20;	//rに0を代入する。
	r=10!=20;	//rに1を代入する。
}

論理演算子[編集]

【下の表を参照しつつ読むこと】 論理演算子とは、論理値の計算を指示する演算子である。 論理演算子には否定を指示する!、[8] 論理積を指示する&&、[9] 論理和を指示する||がある。[10]

  • 次に論理演算子を表にまとめた。
演算子の種類 演算子 演算子の名称 意味 結合規則
単項演算子 ! 論理否定演算子! 右オペランドの否定
(右オペランドの値を0と比較し、等しい場合は1、等しくない場合は0)
論理AND演算子 && &&演算子 左右オペランドの論理積
(左右オペランドの値を0と比較し、ともに等しくない場合は1、それ以外の場合は0)
論理OR演算子 || ||演算子 左右オペランドの論理和
(左右オペランドの値を0と比較し、いずれか一方でも等しくない場合は1、それ以外の場合は0)

【下の表を参照しつつ読むこと】否定とは論理値の真と偽を入れ替えることを表す。 論理積とは左右両方の論理値がともに真であるときのみ真(1)を、それ以外は偽(0)を値として返す。 論理和とは左右両方の論理値のうちいずれか一方でも真であるとき真(1)を、それ以外は偽(0)を値として返す。

  • 次に否定、論理積、論理和に対する論理値を表にまとめた。
p q !p
否定
p&&q
論理積
p||q
論理和
0 0 1 0 0
0 1 1 0 1
1 0 0 0 1
1 1 0 1 1
//例 変数に論理演算子を用いた式の値を、代入演算子を用いて代入する。
int main(void)
{
	int r;
	r=!0;	//rに1を代入する。
	r=0&&1;	//rに0を代入する。
	r=0||1;	//rに1を代入する。
}

短絡評価[編集]

&&演算子と||演算子とは、短絡評価を行う。 短絡評価とは、第1オペランドの値でその式の値が決まるとき、第2オペランドを評価しないことである。 &&演算子は第1オペランドの値が偽(0)の時、第2オペランドを評価しない。 ||演算子は第1オペランドの値が真(0以外)の時、第2オペランドを評価しない。 短絡評価は、第2オペランドに副作用を伴う式を指定したとき、特に注意が必要である。 つまり、第2オペランドに関数呼び出しの式を指定して、短絡評価が行われた時、 その関数呼び出しは実行されない。

排他的論理和[編集]

C言語には、排他的論理和の論理演算子は定義されていない。 しかし、排他的論理和は、否定・論理積・論理和を用いて次のように記述できる。

(!p != !q)
(p && !q) || (!p && q)
(p || q) && (!p || !q)
(p || q) && !(p && q)

排他的論理和とは、2つの論理値のいずれかただ1つのみが真であるとき真(1)を、それ以外は偽(0)を値として返す。 排他的論理和の真偽表は次のようになっている。

p q p xor q
排他的論理和
0 0 0
0 1 1
1 0 1
1 1 0

増分及び減分演算子[編集]

【下の表を参照しつつ読むこと】 増分及び減分演算子とは、変数の値に1を加えたり、1を引いたりすることを指示する演算子である。 増分及び減分演算子には、それぞれ後置演算子と前置演算子とがある。 後置演算子は変数の値を返した後に、増減を行う。[11] 前置演算子は変数の値を返す前に、増減を行う。[12]

  • 次に、後置増分及び後置減分演算子と前置増分及び前置減分演算子とを、表にまとめた。
演算子の種類 演算子 演算子の名称 意味 結合規則
後置演算子 ++ 後置++演算子 左オペランドが指す変数の値を返した後、その変数の値に1を加える。
-- 後置--演算子 左オペランドが指す変数の値を返した後、その変数の値から1を引く。
単項演算子 ++ 前置++演算子 右オペランドが指す変数の値に1を加え、その変数の値を返す。
-- 前置--演算子 右オペランドが指す変数の値から1を引き、その変数の値を返す。

増分及び減分演算子を単独で用いた場合、後置と前置との結果に違いはありません。

//例 後置++演算子を単独で用いる。
int main(void)
{
	i=0;
	i++;//iには1が格納される。
}
//例 前置++演算子を単独で用いる。
int main(void)
{
	i=0;
	++i;//iには1が格納される。
}

ただし、増分及び減分演算子を代入演算子とともに用いた場合、後置と前置との結果に違いがあります。

//例 後置++演算子を代入演算子とともに用いる。
int main(void)
{
	int i=0;
	int j;
	j=i++;//iには1が格納され、jには0が格納される。
}
//例 前置++演算子を代入演算子とともに用いる。
int main(void)
{
	int i=0;
	int j;
	j=++i;//iには1が格納され、jには1が格納される。
}

その他の演算子[編集]

複合リテラル[編集]

【下の表を参照しつつ読むこと】 複合リテラルとは、初期化子並びで与えられる値を持つ名前のないオブジェクトを与える演算子である。[13]

演算子の種類 演算子 演算子の名称 意味 結合規則
後置演算子 (型名){初期化子並び} 複合リテラル 初期化子並びで与えられる値を持つ名前のないオブジェクト

関数の引数に定数として構造体を渡したいとき、 変数を宣言して値を代入し、それを渡す必要がある。

//例 複合リテラルを用いず引数に構造体を渡す。
#include <stdio.h>

void DrawPoint(const struct sPoint *p);

struct sPoint
{
	int x;
	int y;
};

int main(void)
{
	struct sPoint p;
	p.x=200;
	p.y=100;
	DrawPoint(&p);	
}

void DrawPoint(const struct sPoint *p)
{
	printf("%d %d", p->x, p->y);
}

複合リテラルを使えば上の処理をより簡潔に下のように書くことができる。

//例 複合リテラルを用いて引数に構造体を渡す。
#include <stdio.h>

void DrawPoint(const struct sPoint *p);

struct sPoint
{
	int x;
	int y;
};

int main(void)
{
	DrawPoint(&(struct sPoint){.x=200, .y=100});
	//DrawPoint(&(struct sPoint){200, 100});でもよい
}

void DrawPoint(const struct sPoint *p)
{
	printf("%d %d", p->x, p->y);
}

sizeof演算子[編集]

【下の表を参照しつつ読むこと】 sizeof演算子とは、オペランドの大きさ(バイト数: 型は size_t)を返す演算子である。[14]

演算子の種類 演算子 演算子の名称 意味 結合規則
単項演算子 sizeof(型名) sizeof演算子 オペランドの大きさ(バイト数)
単項演算子 sizeof 式 sizeof演算子 オペランドの大きさ(バイト数)

sizeof演算子はオペランドの大きさをバイト数で返す。

//例 sizeof演算子の使用例
#include <stdio.h>

int main(void)
{
	char c;
	int i;
	float f;
	double d;
	long v[100];

	printf("charのサイズは%zu。\n", sizeof(char));
	printf("intのサイズは%zu。\n", sizeof(int));
	printf("floatのサイズは%zu。\n", sizeof(float));
	printf("doubleのサイズは%zu。\n", sizeof(double));
	printf("変数cのサイズは%zu。\n", sizeof c);
	printf("変数iのサイズは%zu。\n", sizeof i);
	printf("変数fのサイズは%zu。\n", sizeof f);
	printf("変数dのサイズは%zu。\n", sizeof d);
	printf("配列vの要素のサイズは%zu。\n", sizeof *v);
	printf("sizeof(sizeof 0)のサイズは%zu。\n", sizeof(sizeof(0)));
}

キャスト演算子[編集]

【下の表を参照しつつ読むこと】 キャスト演算子とは、式の値を指定された型に型変換した値を返す演算子である。[15]

演算子の種類 演算子 演算子の名称 意味 結合規則
キャスト演算子 (データ型)式 キャスト演算子 式の値を指定された型に型変換した値を返す。

型キャストとは、式の値を指定されたデータ型に変換する(明示的な型変換)。

//例 型キャストの使用例
#include "stdio.h"

int main(void)
{
	double d;
	d=3.14;
	printf("dを整数型に変換した値は%d。\n", (int)d); //実浮動小数点型の変数dを整数型に変換したものを表示する。
}

ビット単位の演算子[編集]

【下の表を参照しつつ読むこと】 各オペランドは整数型をもたなければならない。 <<演算子の結果は、左オペランドを右オペランド分左にシフトした値である。 >>演算子の結果は、左オペランドを右オペランド分右にシフトした値である。[16]

演算子の種類 演算子 演算子の名称 意味 結合規則
ビット単位のシフト演算子 << <<演算子 左オペランドを右オペランドビット分左にシフトした値。
空いたビットには0を詰める。
>> >>演算子 左オペランドを右オペランドビット分右にシフトした値。


//例 ビット単位のシフト演算子の使用例
#include <stdio.h>

int main(void)
{
	unsigned char c=0xaa;//10101010(2)
	unsigned char d=c<<1;//01010100(2)
	unsigned char e=c>>1;//01010101(2)
	printf("dの値は%#x。\n", d);
	printf("eの値は%#x。\n", e);
}

【下の表を参照しつつ読むこと】 ~演算子は右オペランドの各ビットを0なら1へ1なら0へ反転する。 右オペランドは整数型をもたなければならない。 [17] 2項&演算子の結果は、オペランドのビット単位の論理積である。 つまり、対応するビットが両方ともセットされている場合ビットをセットし、それ以外の場合ビットをセットしない。 各オペランドの型は、整数型でなければならない。 [18] ^演算子の結果は、オペランドのビット単位の排他的論理和である。 つまり、対応するビットのいずれか一方だけがセットされている場合ビットをセットし、それ以外の場合ビットをセットしない。 各オペランドの型は、整数型でなければならない。 [19] |演算子の結果は、オペランドのビット単位の論理和である。 つまり、対応するビットの少なくとも一方がセットされている場合ビットをセットし、それ以外の場合ビットをセットしない。 各オペランドの型は、整数型でなければならない。 [20]

演算子の種類 演算子 演算子の名称 意味 結合規則
単項演算子 ~ ~演算子 右オペランドのビット単位の補数
ビット単位のAND演算子 & 2項&演算子 両オペランドのビット単位の論理積
ビット単位の排他OR演算子 ^ ^演算子 両オペランドのビット単位の排他的論理和
ビット単位のOR演算子 | 演算子 両オペランドのビット単位の論理和
//例 ~演算子の使用例
#include <stdio.h>

int main(void)
{
	unsigned char c=0xaa;//10101010(2)
	unsigned char d=~c;//  01010101(2)
	printf("dの値は%#x。\n", d);
}
//例 ビット単位のAND演算子の使用例
#include <stdio.h>

int main(void)
{
	unsigned char c=0x3;//00000011(2)
	unsigned char d=0x5;//00000101(2)
	unsigned char e=c&d;//00000001(2)
	printf("eの値は%#x。\n", e);
}
//例 ビット単位の排他OR演算子の使用例
#include <stdio.h>

int main(void)
{
	unsigned char c=0x3;//00000011(2)
	unsigned char d=0x5;//00000101(2)
	unsigned char e=c^d;//00000110(2)
	printf("eの値は%#x。\n", e);
}
//例 ビット単位のOR演算子の使用例
#include <stdio.h>

int main(void)
{
	unsigned char c=0x3;//00000011(2)
	unsigned char d=0x5;//00000101(2)
	unsigned char e=c|d;//00000111(2)
	printf("eの値は%#x。\n", e);
}

条件演算子[編集]

【下の表を参照しつつ読むこと】 条件演算子は、式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価する。 式2または式3の値を結果とする。[21]

演算子の種類 演算子 演算子の名称 意味 結合規則
条件演算子 式1 ? 式2 : 式3 条件演算子 式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価する。

次のようなif文は、条件演算子を用いて、次のように書き換えることができる。

//aとbの内、大きいほうをcに代入する。
if (a>b)
	c=a;
else
	c=b;

c=(a>b)?a:b;

複合代入[編集]

【下の表を参照しつつ読むこと】 形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとする。[22]

演算子の種類 演算子 演算子の名称 意味 結合規則
代入演算子 *= *=演算子 形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとする。
/= /=演算子
%= %=演算子
+ = +=演算子
-= -=演算子
<<= <<=演算子
>>= >>=演算子
&== &=演算子
^= ^=演算子
|= |=演算子

次のような代入文は、複合代入を用いて、次のように書き換えることができる。

a=a*b;		a*=b;
a=a/b;		a/=b;
a=a+b;		a+=b;
a=a-b;		a-=b;
a=a<<b;		a<<=b;
a=a>>b;		a>>=b;
a=a&b;		a&=b;
a=a^b;		a^=b;
a=a|b;		a|=b;

コンマ演算子[編集]

【下の表を参照しつつ読むこと】 コンマ演算子は、左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。[23]

演算子の種類 演算子 演算子の名称 意味 結合規則
コンマ演算子 , コンマ演算子 左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。
//例 コンマ演算子の使用例
#include <stdio.h>

int main(void)
{
	int i=1,j=2,k;
	k=(i, j);//kにはjの値が代入される。
	printf("kの値は%d。\n", k);
}

脚注[編集]

  1. ^ 『JISX3010:2003』p.33「6.3.1.8 通常の算術型変換」
  2. ^ 『JISX3010:2003』p.60「6.5.6 加減演算子」
  3. ^ 『JISX3010:2003』p.60「6.5.5 乗除演算子」
  4. ^ 『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」
  5. ^ 『JISX3010:2003』p.67「6.5.16 代入演算子」
  6. ^ 『JISX3010:2003』p.62「6.5.8 関係演算子」
  7. ^ 『JISX3010:2003』p.63「6.5.8 等価演算子」
  8. ^ 『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」
  9. ^ 『JISX3010:2003』p.65「6.5.8 論理AND演算子」
  10. ^ 『JISX3010:2003』p.65「6.5.8 論理OR演算子」
  11. ^ 『JISX3010:2003』p.54「6.5.2.4 後置増分及び後置減分演算子」
  12. ^ 『JISX3010:2003』p.57「6.5.3.1 前置増分及び前置減分演算子」
  13. ^ 『JISX3010:2003』p.55「6.5.25 複合リテラル」
  14. ^ 『JISX3010:2003』p.58「6.5.3.4 sizeof演算子」
  15. ^ 『JISX3010:2003』p.59「6.5.4 キャスト演算子」
  16. ^ 『JISX3010:2003』p.62「6.5.7 ビット単位のシフト演算子」
  17. ^ 『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」
  18. ^ 『JISX3010:2003』p.64「6.5.10 ビット単位のAND演算子」
  19. ^ 『JISX3010:2003』p.64「6.5.11 ビット単位の排他OR演算子」
  20. ^ 『JISX3010:2003』p.65「6.5.10 ビット単位のOR演算子」
  21. ^ 『JISX3010:2003』p.65「6.5.15 条件演算子」
  22. ^ 『JISX3010:2003』p.68「6.5.16.2 複合代入」
  23. ^ 『JISX3010:2003』p.68「6.5.17 コンマ演算子」

参考文献[編集]

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