CプログラミングⅠ
式と演算子 型変換
式って何?
数式などの計算式
プログラムは式を「計算」して処理を行う.
C言語の式
1 + 2
式と演算子
オペランド 演算子
評価 3
計算の対象
計算(演算)の記号
計算結果(値)を得ること
式
式と演算子
式の評価
実行結果
1 + 2 は,3 です.
3 x 4 は,12 です.
式の計算をさせる 1:
2:
3:
4:
5:
6:
7:
8:
9:
#include <stdio.h>
int main(void) {
printf("1 + 2 は,%d です.¥n", 1 + 2 );
printf("3 x 4 は,%d です.¥n", 3 * 4 );
return 0;
}
式を評価した結果の 値3が出力
式を記述
変数の値を使う 1:
2:
3:
4:
5:
6:
7:
8:
int main(void) {
int num1 = 3;
int num2 = 5;
printf("num1 + num2 は,%d です.¥n", num1 + num2 );
return 0;
}
式と演算子
いろいろな演算
変数の値を使う
num1 +
3
8
変数の値を用いて 評価する
実行結果
num1 + num2 は,8 です.
式の中に変数を書くと,
変数の値を用いて演算を行える num2
5
式と演算子
いろいろな演算
変数に式の計算結果を代入する
計算した結果を 変数に代入
変数に式の計算結果を代入する 1:
2:
3:
4:
5:
6:
7:
8:
9:
int main(void) {
int num1 = 3, num2 = 2;
int sum;
sum = num1 + num2;
printf("num1 + num2 は,%d です.¥n", sum );
return 0;
}
num1 +
3
5
num2
2
変数 sum の値 を出力
num1 + num2 の 評価結果を 変数 sum に代入
実行結果
num1 + num2 は,5 です.
式と演算子
いろいろな演算
変数の値の更新
計算結果を再度 num1 に代入
( num1 の値を更新できる)
変数の値の更新 1:
2:
3:
4:
5:
6:
7:
8:
int main(void) {
int num1 = 3;
num1 = num1 + 1;
printf("num1に1を足すと %d です.¥n", num1 );
return 0;
}
num1 +
3
4
1
変数 num1 に 1 を足した結果を 再度,変数 num1 に代入
実行結果
num1に1を足すと 4 です.
式と演算子
いろいろな数値を入力して,
演算ができる
キーボードから入力した値を足し算 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
int main(void) {
int num1, num2;
printf("整数1を入力.¥n");
scanf("%d", &num1 );
printf("整数2を入力.¥n");
scanf("%d", &num2 );
printf("二つの数の和は,%dです.¥n", num1 + num2 );
return 0;
}
scanf関数を用いて 変数に値を 読み込んでおく
実行結果
整数1を入力.
10[enter]
整数2を入力.
20[enter]
二つの数の和は,30です.
num1 と num2 の 和を出力
いろいろな演算
キーボードから入力した値を足し算する
演算子の種類
いろいろな演算子
演算子 名前 優先順位 結合規則
( ) 関数呼び出し
1 左から右(→)
[ ] 添字(配列添字)
. メンバ参照(ドット)
-> メンバ間接参照(アロー)
++ 後置インクリメント -- 後置デクリメント
! 論理否定
2 右から左(←)
~ ビット反転
++ 前置インクリメント -- 前置デクリメント
+ 単項+
- 単項-
演算子の種類
いろいろな演算子
演算子 名前 優先順位 結合規則
* 間接参照
2 右から左(←)
& アドレス
sizeof サイズ
(type) キャスト 3 右から左(←)
* 乗算
4 左から右(→)
/ 除算
% 剰余
+ 加算
5 左から右(→)
- 減算
<< 左シフト
6 左から右(→)
>> 右シフト
演算子の種類
いろいろな演算子
演算子 名前 優先順位 結合規則
< より大きい
7 左から右(→)
<= 以上
> 未満
>= 以下
== 等価
8 左から右(→)
!= 不等価
& ビット論理積 9 左から右(→)
^ ビット排他的論理和 10 左から右(→)
| ビット論理和 11 左から右(→)
&& 論理積 12 左から右(→)
|| 論理和 13
? : 条件 14 右から左(←)
演算子の種類
いろいろな演算子
演算子 名前 優先順位 結合規則
= 代入
15 右から左(←)
+=
複合代入 -=
*=
/=
%=
<<=
>>=
|=
^=
&=
, コンマ(順次) 16 左から右(→)
演算子の種類
演算子の種類
単項演算子
オペランドを1つとる演算子(負の数を表す - など)
例
-1 -num
2項演算子
オペランドを2つとる演算子(四則演算など)
例
3 + 5, num1 + num2
+
5 3
-
+
-
1
num1 num2
3 5
num
1
演算子の種類
算術演算子
四則演算(+,-,*,/)と剰余(%)など
例
10 % 3 は,10
を3
で割った余り式1 + 式2
-
*
/
%
式1 式2 式1 式2 式1 式2 式1 式2
式1と式2の和
式1と式2の差 (式1から式2を減じる)
式1と式2の積
式1と式2の商 (式1を式2で割る)
式1と式2の剰余 (式1を式2を割った余り)
複合代入演算子
算術演算子などと組み合わせた代入演算子
演算子の種類
演算子 説明 使用例 意味
+=
変数の値との加算を変数に代入するa += 5; a = a + 5;
-=
変数の値との減算を変数に代入するa -= 5; a = a - 5;
*=
変数の値との乗算を変数に代入するa *= 5; a = a * 5;
/=
変数の値との除算を変数に代入するa /= 5; a = a / 5;
%=
変数の値との余算を変数に代入するa %= 5; a = a % 5;
a
10 5
15
+
a + 5 (すなわち,10 + 5)の評価結果 15 を a に代入する(15 を a に上書きする)
複合代入演算子の使用例 1:2:
3:4:
5:6:
7:8:
9:
int main(void) { int a = 10;
a += 5;
printf("a = %d¥n", a);
return 0;
}
実行結果 a = 15
演算子の種類
インクリメント演算子,デクリメント演算子
変数の値を1増やす、あるいは1減らすための演算子
繰り返し処理の回数を数える場合などによく利用される
演算子 呼び名 使用例 説明
++
インクリメント演算子a++;
++a;
変数 a に 1 を加える a = a + 1; とも書ける
--
デクリメント演算子a--;
--a;
変数 a から 1 を引く a = a – 1; とも書ける
a
10 1 11
+
a + 1 (すなわち,10 + 1)の
評価結果 11 を a に代入する
インクリメント演算子の使用例 1:2:
3:4:
5:6:
7:8:
9:
int main(void) { int a = 10;
a++;printf("a = %d¥n", a);
return 0;
}
実行結果 a = 11
演算子の種類
インクリメント演算子,デクリメント演算子の注意点
インクリメント,デクリメントの結果を他の変数に代入する際,
演算子を前に置くか後ろに置くかで代入結果が違ってくる
b に a の値が代入されてから
a に +1 する
a に +1 してから その結果を b に代入する 前置インクリメント演算子の場合 1:2:
3:4:
5:6:
7:8:
9:10:
int main(void) { int a = 10,b;
b = ++a;
printf("a = %d¥n", a);
printf("b = %d¥n", b);
return 0;
} 後置インクリメント演算子の場合
1:2:
3:4:
5:6:
7:8:
9:10:
int main(void) { int a = 10,b;
b = a++;
printf("a = %d¥n", a);
printf("b = %d¥n", b);
return 0;
} 実行結果
a = 11 b = 10
実行結果 a = 11 b = 11 b = a;
a = a + 1;
a = a + 1;
b = a;
演算子の優先順位
優先順位
実際に演算を行う場合の優先順位のこと
1 + 2 * 3
のような演算子が複数ある式の場合,優先順位が高い演算子から演算を実行していく
1 + 2 * 3
7
C言語では*が+よりも優先順位が高い
*の演算を先に実行
次に+の演算を実行
1 + 6
各演算子間の優先順位は,この資料の8~12ページの表を参照
演算子の優先順位
優先順位の変更
括弧( )を使って,先に計算したい部分式を括ると括弧内を 先に計算することができる
1 + 2 * 3
において,1 + 2 を先に計算したい場合(1 + 2) * 3 とする
1つの式で複数の演算子を使う場合は括弧を用いて 演算の優先順位を明示すること
演算子の結合規則
優先順位が等しい場合
演算子が左結合か右結合かで処理が異なる
左結合: 左の演算子を先に計算する
右結合: 右の演算子を先に計算する
左結合の例:
a + b + c (a + b) + c
右結合の例:
a = b = c a = (b = c)
+ 演算子は左結合
= 演算子は右結合
左の演算子が先に計算される
右の演算子が先に計算される
演算子間の結合方向は,この資料の8~12ページの表を参照
aとbが加算されたあと その結果とcが加算される
cの値がbに代入されたあと bの値がaに代入される
(cの値がbとaに代入される)
型変換
型変換
データ型を変換すること
異なるデータ型の変数への代入
異なるデータ型の数値が混在した式の計算 などで使う
型変換には
式の計算や代入の処理の中で自動的に行われるもの
キャスト演算子を用いて明示的に型変換を指定するもの がある
自動的な型変換
異なるデータ型の数値の演算を行ったときに自動的に変換
1 + 0.5 1.0 + 0.5
1.5
型変換
自動的な型変換は、型変換によって情報が失われないように 大きな型(次ページ)にあわせて変換される
int型
double型に 変換される
double型
int型とdouble型の演算では int型の値がdouble型の値に
自動変換される
演算結果はdouble型となる
型変換
データ型間の大小関係
例 :
int型 と double型
int型のデータ(整数)は double型でも表現できる double型のデータ(小数)は
int型では表現できない
int型よりもdouble型の方が
「大きい」という
大きなサイズの型に変換しても情報は失われない
小さなサイズの型に変換すると情報が失われる場合がある
double型からint型に変換 1:
2:
3:
4:
5:
double a = 1.2;
int b;
b = a;
printf("b = %d¥n", b);
実行結果 b = 1
情報が失われる(0.2がカットされる)
int型からdouble型に変換 1:
2:
3:
4:
5:
int a = 3;
double b;
b = a;
printf("b = %lf¥n", b);
実行結果 b = 3.000000
情報は失われない
型変換
異なるデータ型での計算(1)
int main(void) {
short int a;
int b = 60000;
int c;
float d = 9.5;
a = b;
printf("a = %d¥n", a);
c = d;
printf("c = %d¥n", c);
return 0;
}
short int型の変数が格納できる値の範囲が int型の変数より小さいので
オーバーフローを起こす
float型の変数に格納されている値を int型の変数に代入すると
小数点以下が切り捨てられる
異なるデータ型での計算(1)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
int main(void) {
short int a;
int b = 60000;
int c;
float d = 9.5;
a = b;
printf("a = %d¥n", a);
c = d;
printf("c = %d¥n", c);
return 0;
}
実行結果 a = -5536 c = 9
型変換
異なるデータ型での計算(2)
c = a / b; において
① まず,int型変数 a,b の割り算を行う.
このとき,どちらも int型 なので,
5 / 2 の結果は 2.5 ではなく,
小数点以下が切り捨てられて 2 となる
② 計算結果 2 が float型 に変換されて 2.0 となり,float型変数 c に格納される
異なるデータ型での計算(2)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
int main(void) {
int a = 5,b = 2;
float c;
c = a / b;
printf("c = %f¥n", c);
return 0;
}
実行結果 c = 2.00000
型変換
明示的な型変換 : キャスト演算子
強制的に(明示的に)変数(値)のデータ型を変換させる
c = (float)a / (float)b; において
① int型変数 a,b に代入されている値が
それぞれ 5.0, 2.0 に変換される
② 5.0 / 2.0 の計算結果 2.5 が float型変数 c に格納される 型変換(キャスト演算子の書式)
(変換したい型名)変数名(または値);
型変換(キャスト演算子)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
int main(void) {
int a = 5,b = 2;
float c;
c = (float)a / (float)b;
printf("c = %f¥n", c);
return 0;
}
実行結果 c = 2.50000
講義のまとめ
式
式の評価
演算子
単項演算子,2項演算子
算術演算子
複合代入演算子
インクリメント演算子,デクリメント演算子
優先順位,結合規則
型変換
型の大小関係
自動変換,キャスト変換