☜前の章へ 変数の使い方(宣言・代入・初期化・型・出力)
☞次の章へ 条件分岐をしてみよう
- C言語の計算方法
- インクリメント・デクリメントのやり方
- 前置と後置の違い
- 演算子の優先順位と優先順位一覧
- 型変換(キャスト)のやり方
この章では、C言語での基本的な計算方法について学んでいきます。
インクリメントなどよく分からない単語があると思いますが、1つ1つ覚えていきましょう。
普通の計算方法から効率的な計算方法まで解説していきます。
C言語の計算方法(足し算・引き算・割り算・掛け算・剰余算)
演算子一覧
| 演算子 | 名前 | 記述例 | 意味 |
| + | 加算演算子 | a + b | aにbを加える |
| – | 減算演算子 | a – b | aからbを引く |
| * | 乗算演算子 | a * b | aにbを掛ける |
| / | 除算演算子 | a / b | aをbで割る |
| % | 剰余演算子 | a % b | aをbで割った余り |
C言語の計算は上記の演算子を使用して行います。
1つ1つ確認していきましょう。
C言語の計算方法:足し算
#include <stdio.h>
int main() {
int add;
add = 1 + 1;
printf("足し算の結果は%dです。", add);
return 0;
}出力結果

足し算は以下のように行っています。
add = 1 + 1;足し算は日常生活で足し算をする時と同じように、1 + 1で行うことが出来ます。
C言語の計算方法:引き算
#include <stdio.h>
int main() {
int sub;
sub = 5 - 2;
printf("引き算の結果は%dです。", sub);
return 0;
}出力結果

引き算は以下のように行っています。
sub = 5 - 2;日常生活で引き算をする時と同じように、5 – 2で行うことが出来ます。
C言語の計算方法:掛け算
#include <stdio.h>
int main() {
int mul;
mul = 4 * 4;
printf("掛け算の結果は%dです。", mul);
return 0;
}出力結果

掛け算は以下のように行っています。
mul = 4 * 4;日常生活で掛け算をする時は「4 × 4」としますが、C言語では*(アスタリスク)を使います。
C言語の計算方法:割り算
#include <stdio.h>
int main() {
int div;
div = 6 / 2;
printf("割り算の結果は%dです。", div);
return 0;
}出力結果

割り算は以下のように行っています。
div = 6 / 2;日常生活で割り算をする時は「6 ÷ 2」としますが、C言語では/(スラッシュ)を使います。
C言語の計算方法:剰余算
剰余算とは、割り算の余りを求める計算のことです。
#include <stdio.h>
int main() {
int rem;
rem = 8 % 3;
printf("剰余算の結果は%dです。", rem);
return 0;
}出力結果

8を2で割ると3余り2になるため、出力結果は2になります。
剰余算は以下のように行っています。
rem = 8 % 3;剰余算には%(パーセント)を使います。
C言語の変数を使った計算の方法
#include <stdio.h>
int main(void)
{
int add = 1;
add = add + 1;
printf("足し算の結果は%dです。\n", add);
return 0;
}出力結果

この様に、変数addに1を加算して、addに代入をすることもできます。
C言語のインクリメントとデクリメントのやり方
先ほどは、add + 1という形で1を足しました。
1だけ足す、1だけ引くという計算は多々行われます。
そのため、簡単に計算ができるように、インクリメント演算子(++)とデクリメント演算子(- -)というものがあります。
1だけ足すことをインクリメント、1だけ引くことをデクリメントと言います。
インクリメント演算子とデクリメント演算子
| 演算子 | 名前 | 記述例 | 意味 |
| ++ | インクリメント演算子 | ++a or a++ | aに1を加える |
| – – | デクリメント演算子 | – -a or a- – | aから1を引く |
変数の前に書くことを前置、後ろに書くことを後置と言います。
#include <stdio.h>
int main(void)
{
int add = 1;
int sub = 2;
add++;
sub--;
printf("インクリメントの結果は%dです。\n", add);
printf("デクリメントの結果は%dです。\n", sub);
++add;
--sub;
printf("インクリメントの結果は%dです。\n", add);
printf("デクリメントの結果は%dです。\n", sub);
return 0;
}出力結果

このように簡単に、プラス1、マイナス1の計算を行うことが出来ます。
C言語の前置と後置の違い
先ほどの計算結果を見て不思議に思いませんでしたか?
add++も++addもaddに1を加えました。何か違いがあるのでしょうか?
実は代入の時に違いが見られます。
まずは後置の場合を見てみましょう。
#include <stdio.h>
int main(void)
{
int a = 2;
int b;
b = a++;
printf("aの値は%dです。\n", a);
printf("bの値は%dです。\n", b);
return 0;
}出力結果

上記の例ではbに3が入りそうですが、実際には2が代入されます。
++がaの後ろ、つまり後置の場合は、aがインクリメントされる前に、aの値がbに代入されます。
代入された後にaがインクリメントされます。
以下と同じことが行われています。
#include <stdio.h>
int main(void)
{
int a = 2;
int b;
b = a;
a = a + 1;
printf("aの値は%dです。\n", a);
printf("bの値は%dです。\n", b);
return 0;
}前置の場合も確認してみましょう。
#include <stdio.h>
int main(void)
{
int a = 2;
int b;
b = ++a;
printf("aの値は%dです。\n", a);
printf("bの値は%dです。\n", b);
return 0;
}出力結果

前置の場合は、bの値が3になっています。
つまり、aがインクリメントされた後に、代入が行われています。
以下と同じことが行われています。
#include <stdio.h>
int main(void)
{
int a = 2;
int b;
a = a + 1;
b = a;
printf("aの値は%dです。\n", a);
printf("bの値は%dです。\n", b);
return 0;
}C言語の複合代入演算子の使い方
これまで、「a = a + 5」この様に、ある変数に加算したい場面が出てきました。
1を加算(インクリメント)、減算(デクリメント)する場合の簡単な書き方は覚えましたが、1以外を加算等する場面でも、簡単に書く方法があります。
簡単に書くためには複合代入演算子を使います。
複合代入演算子
| 演算子 | 記述例 | 意味 |
| += | a += 2 | a = a + 2 |
| -= | a -= 3 | a = a – 3 |
| *= | a *= 5 | a = a * 5 |
| /= | a /= 7 | a = a / 7 |
| %= | a %= 10 | a = a %10 |
「a = a + 2」は「a += 2」と書いても同じ結果になります。
aを1文字短縮することが出来ました。
#include <stdio.h>
int main(void)
{
int num1 = 5;
int num2 = 5;
int num3 = 5;
int num4 = 4;
int num5 = 5;
int a = 2;
num1 += a;
num2 -= a;
num3 *= a;
num4 /= a;
num5 %= a;
printf("num1の値は%dです。\n", num1);
printf("num2の値は%dです。\n", num2);
printf("num3の値は%dです。\n", num3);
printf("num4の値は%dです。\n", num4);
printf("num5の値は%dです。\n", num5);
return 0;
}出力結果

C言語の演算子の優先順位とは?演算子の優先順位一覧
「num = 20 + 4 / 2」という計算があった時は、先に「4 / 2」の計算が行われます。
次に「20 + 2」の計算が行われ、最後にnumに代入されます。
このように演算子には計算の優先順位があります。
以下に表は演算子の優先順位を一覧化したものです。確認してみて下さい。
演算子の優先順位
| 優先順位 | 演算子 | 形式 | 機能 | 結合性 |
| 1 | () | x(y) | 関数の呼び出し | 左 |
| [] | x[y] | 配列の要素 | ||
| . | x . y | ポインタから構造体メンバ参照 | ||
| -> | x -> y | 構造体メンバ参照 | ||
| ++ | x++ | 後置インクリメント | ||
| – – | x- – | 後置デクリメント | ||
| 2 | ++ | ++x | 前置インクリメント | 右 |
| – – | ‒x | 前置インクリメント | ||
| sizeof | sizeof x | 変数等の大きさを取得 | ||
| & | &x | メモリアドレス | ||
| * | *x | ポインタの間接参照 | ||
| + | +x | 符号 | ||
| ‒ | -x | 符号の反転 | ||
| ~ | ~x | ビット否定 | ||
| ! | !x | 論理否定 | ||
| 3 | (型名) | (x)y | キャスト | 右 |
| 4 | * | x * y | 乗算 | 左 |
| / | x / y | 除算 | ||
| % | x % y | 剰余算 | ||
| 5 | + | x + y | 加算 | 左 |
| ‒ | x ‒ y | 減算 | ||
| 6 | << | x << y | 左シフト | 左 |
| >> | x >> y | 右シフト | ||
| 7 | < | x < y | 左の方が小さい | 左 |
| <= | x <= y | 左が右以下 | ||
| > | x > y | 左の方が大きい | ||
| >= | x >= y | 左が右以上 | ||
| 8 | == | x == y | 等しい | 左 |
| != | x != y | 等しくない | ||
| 9 | & | x & y | ビット積 | 左 |
| 10 | ^ | x ^ y | ビット単位排他的論理和 | 左 |
| 11 | | | x | y | ビット和 | 左 |
| 12 | && | x && y | 論理積 | 左 |
| 13 | || | x || y | 論理和 | 左 |
| 14 | : | x y : z | 条件演算子 | 右 |
| 15 | = | x = y | 代入 | 右 |
| += | x += y | 加算代入 | ||
| -= | x -= y | 減算代入 | ||
| *= | x *= y | 乗算代入 | ||
| /= | x /= y | 除算代入 | ||
| %= | x %= y | 剰余代入 | ||
| <<= | x <<= y | 左シフト代入 | ||
| >>= | x >>= y | 右シフト代入 | ||
| &= | x &= y | ビット積代入 | ||
| |= | x |= y | ビット和代入 | ||
| ^= | x ^= y | ビット単位排他的論理和代入 | ||
| 16 | , | x , y | カンマ | 左 |
型変換(キャスト)とは
型変換とは、データ型を変更することを言います。
例えば、int型をdouble型に変換することを型変換やキャストと言います。
この型変換には2種類あり、「暗黙的な型変換」と「明示的な型変換」があります。
まずは、暗黙的な型変換から見ていきましょう。
暗黙的な型変換とは
暗黙的な型変換とは、自動的に行われる型変換のことです。
#include <stdio.h>
int main(void)
{
int a = 5.5;
float b = 5;
printf("aの値は%dです。\n", a);
printf("bの値は%fです。\n", b);
return 0;
}出力結果

int aには、5.5から0.5が切り捨てられ、5が代入されます。
float bには、5が5.0になり代入されます。
この様に代入の際には、左辺の型に変換されます。
#include <stdio.h>
int main(void)
{
int a = 2;
float b = 5.0;
float result;
//式中での型変換
result = a + b;
printf("resultの値は%fです。\n", result);
return 0;
}出力結果

この様に、式中にint型とfloat型がある場合、int型である変数aは計算時にfloat型へと変換されています。変換される型には優先順位があります。
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 4;
float result;
result = a / b;
printf("resultの値は%fです。\n", result);
return 0;
}出力結果

この場合は、resultに2.5が代入される気がしますが、整数同士の割り算の結果は小数点以下は切り捨てられるため2.0が代入されます
明示的な型変換とは
明示的な型変換とは、意図的に型変換することを言います。
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 4;
float result;
result = a / (float)b;
printf("resultの値は%fです。\n", result);
return 0;
}出力結果

(float)bで明示的にfloat型へ型変換を行なっています。
暗黙的な型変換の時は、resultの値は2でしたが、明示的に型変換をすることで、resultの値は2.5になります。
キーボードから数値や文字を入力する方法
#include <stdio.h>
//これは気にしないでください
void clearInputBuffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
int main(void)
{
int a;
float b;
char c;
printf("整数を入力して下さい。\n");
scanf("%d", &a);
clearInputBuffer();
printf("小数を入力して下さい。\n");
scanf("%f", &b);
clearInputBuffer();
printf("文字を入力して下さい。\n");
c = getchar();
clearInputBuffer();
printf("a=%d b=%f c=%c\n", a, b, c);
printf("整数と小数を入力して下さい。\n");
scanf("%d%f", &a, &b);
clearInputBuffer();
printf("a=%d b=%f\n", a, b);
return 0;
}出力結果

キーボード入力にはscanf関数を使用します。
scanf(“%d”, &a);
この様に、左には変換指定子を置き、右には&(アンパサンド)の後ろに変数名を置く必要があります。
c = getchar();
文字入力にはgetchar関数を使用することができます。
scanf(“%d%f”, &a, &b)
この様に書くことで、連続しての入力も可能です。
以下のソースコードは気にしないでください。関数を使っているのですが、関数は8章で解説します。簡単な説明だけします。
void clearInputBuffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
clearInputBuffer();scanfを使うと、入力で発生したデータが一時的にバッファという領域に保存されます。バッファにデータが残っていると予期せぬ動作が発生する可能性があるので、バッファ内のデータをクリアしています。
練習問題
加算で7を求め、変数に代入し、コンソールに表示しましょう
#include <stdio.h>
int main()
{
// 問1
int num_a;
num_a = 3 + 4;
printf("%d\n", num_a);
return 0;
}出力結果

減算で3を求め、変数に代入し、コンソールに表示しましょう
#include <stdio.h>
int main()
{
// 問1
int num_a;
num_a = 3 + 4;
printf("%d\n", num_a);
// 問2
int num_b;
num_b = 7 - 4;
printf("%d\n", num_b);
return 0;
}出力結果

乗算で10を求め、変数に代入し、コンソールに表示しましょう
#include <stdio.h>
int main()
{
// 問1
int num_a;
num_a = 3 + 4;
printf("%d\n", num_a);
// 問2
int num_b;
num_b = 7 - 4;
printf("%d\n", num_b);
// 問3
int num_c;
num_c = 2 * 5;
printf("%d\n", num_c);
return 0;
}出力結果

除算で3.33を求め、変数に代入し、コンソールに表示しましょう
#include <stdio.h>
int main()
{
// 問1
int num_a;
num_a = 3 + 4;
printf("%d\n", num_a);
// 問2
int num_b;
num_b = 7 - 4;
printf("%d\n", num_b);
// 問3
int num_c;
num_c = 2 * 5;
printf("%d\n", num_c);
// 問4
double num_d;
num_d = 10 / 3.0;
printf("%0.2f\n", num_d);
return 0;
}出力結果

①で7を代入した変数を2で剰余算し、変数に代入し、コンソールに表示しましょう
#include <stdio.h>
int main()
{
// 問1
int num_a;
num_a = 3 + 4;
printf("%d\n", num_a);
// 問2
int num_b;
num_b = 7 - 4;
printf("%d\n", num_b);
// 問3
int num_c;
num_c = 2 * 5;
printf("%d\n", num_c);
// 問4
double num_d;
num_d = 10 / 3.0;
printf("%0.2f\n", num_d);
// 問5
num_a = num_a % 2;
printf("%d\n", num_a);
return 0;
}出力結果

変数numはどのように値が変化するでしょうか?num += 2;から5つ考えましょう。
int num = 7;
num += 2;
num -= 3;
num *= 2;
num /= 4;
num %= 2;
numの値はいくつですか?
int num;
num = 2 * 5 + 3;13
変数aの値は?resultの値はこの式だと3.0です。型変換(キャスト)をして3.5にして下さい。
#include <stdio.h>
int main()
{
float result;
int a = 7.5;
int b = 2;
result = a / b;
printf("%f", result);
}#include <stdio.h>
int main()
{
float result;
int a = 7.5;
int b = 2;
result = a / (float)b;
printf("%f", result);
return 0;
}出力結果

以下、上から順に行ってください
- 「身長(単位m)を入力して下さい。(例:172cmの場合1.72と入力)」と表示
- 「体重を入力して下さい。」と表示
- 入力された2つの値をもとに、BMI(適性体重)を求めて下さい
※BMIの求め方は、BMI = 体重 /(身長 * 身長) - 「あなたのBMIは(答え)です。」と表示
#include <stdio.h>
int main() {
double height;
double weight;
double bmi;
printf("身長(単位m)を入力して下さい。(例:172cmの場合1.72と入力)\n");
scanf("%lf", &height);
printf("体重を入力してください。\n");
scanf("%lf", &weight);
bmi = weight / (height * height);
printf("あなたのBMIは%fです。\n", bmi);
return 0;
}出力結果



