/*01*/ #include <stdio.h>
/*02*/
/*03*/ main()
/*04*/ {
/*05*/ int x = 30, y = 7, z;
/*06*/
/*07*/ z = x + y;
/*08*/ printf("%d + %d = %d\n", x, y, z);
/*09*/
/*10*/ z = x - y;
/*11*/ printf("%d - %d = %d\n", x, y, z);
/*12*/
/*13*/ z = x * y;
/*14*/ printf("%d * %d = %d\n", x, y, z);
/*15*/
/*16*/ z = x / y;
/*17*/ printf("%d / %d = %d\n", x, y, z);
/*18*/
/*19*/ z = x % y;
/*20*/ printf("%d %% %d = %d\n", x, y, z);
/*21*/
/*22*/ return 0;
/*23*/ }
基本的な演算子には四則演算と剰余を求める演算子として次の五つがります。
| + | 足します。 |
| - | 引きます。(単にマイナス記号としても使われる。) |
| * | 掛けます。 |
| / | 割ります。ただし、商だけがその結果で、あまりは無視されます。 |
| % | 割った余りが結果になり、商は無視されます。 |
まず、掛け算、割り算は紙上で書くのと多少異なります。といっても、コンピュータ上ではすでに当たり前の記号になってますから、戸惑うことはないでしょう。注意して欲しいのは、整数型の割り算では余りが無視されるということです。つまり、小数点以下が切り捨てられるわけです。かわりに、整数型の演算では「%」演算子で剰余、つまり余りを出すことができます。なお、これら基本的な演算子を
また、数学と同様の規則でカッコが使えます。ただし、「*」など記号の省略はできません。また中カッコなどもないので、カッコをネスト(入れ子)にしたいときは以下のように普通のカッコをそのまま使ってください。
/*** 正しい ***/
(1 + 2) * 3
(1 + 2) * (3 + 4)
((1 + 2) * 3 - 4) * 5
/*** 間違い ***/
3(1 + 2)
(1 + 2)(3 + 4)
{(1 + 2) * 3 - 4} * 5
/*01*/ #include <stdio.h>
/*02*/
/*03*/
/*04*/ main()
/*05*/ {
/*06*/ int x = 30;
/*07*/ float y = 7, z;
/*08*/
/*09*/
/*10*/ z = (float)x / y;
/*11*/ printf("%d / %f = %f\n", x, y, z);
/*12*/
/*13*/ return 0;
/*14*/ }
前回説明した代入も含めて、C言語では基本的に違う型同士の演算はできません。そこで、このリストのようにタイプキャストを行って演算します。また、浮動小数点数の割り算は小数点も計算されます。
/*01*/ #include <stdio.h>
/*02*/
/*03*/ main()
/*04*/ {
/*05*/ int x = 10, y = 20;
/*06*/ float z;
/*07*/
/*08*/ z = (float)x / (float)y;
/*09*/
/*10*/ printf("%d / %d = %f\n", x, y, z);
/*11*/
/*12*/ return 0;
/*13*/ }
先ほど述べたとおり、整数型同士の演算では小数以下が切り捨てられます。そこで小数以下も維持したい場合は int 型にタイプキャストして計算します。注意して欲しいのは
z = (float)(x / y);
z = (float)10 / (float)20;
z = 10.0 / 20.0;
/*01*/ #include <stdio.h>
/*02*/
/*03*/ main()
/*04*/ {
/*05*/ int z = 10;
/*06*/
/*07*/ z = z + 5;
/*08*/ printf("%d\n", z);
/*09*/
/*10*/ return 0;
/*11*/ }
このようにした場合はどうなるのでしょうか。これは
z = 10 + 5;
/*01*/ #include <stdio.h>
/*02*/
/*03*/ main()
/*04*/ {
/*05*/ int z = 10;
/*06*/
/*07*/ z += 5;
/*08*/ printf("%d\n", z);
/*09*/
/*10*/ return 0;
/*11*/ }
リストのこの部分は
z = z + 5;
#include <stdio.h>
main()
{
int z = 0;
z++;
printf("z++ しました。\n");
printf("z は %d です。\n\n", z);
z = 0;
printf("z++ は %d です。\n", z++);
printf("z は %d です。\n\n", z);
z = 0;
printf("++z は %d です。\n", ++z);
printf("z は %d です。\n", z);
return 0;
}
この「++」は
z = z + 1;
/*** パターン1 ***/
z = 1;
z++;
printf("z は %d です。\n", z);
/*** パターン2 ***/
z = 1;
++z;
printf("z は %d です。\n", z);
/*** パターン1 ***/
z = 1;
printf(" z++ は %d です。\n", z++);
/*元の z を表示してから z に1を足す。*/
/*** パターン2 ***/
z = 1;
printf(" ++z は %d です。\n", ++z);
/*元の z に1足してから、それを表示する。*/
また、これとは逆に
| インクリメント演算子 | |
| [変数]++ | 実行文を実行してから、変数の値を1増加 |
| ++[変数] | 変数の値を1増加させてから実行文を実行 |
| デクリメント演算子 | |
| [変数]-- | 実行文を実行してから、変数の値を1減少 |
| --[変数] | 変数の値を1減少させてから実行文を実行 |
「int n = 1」 を宣言し、「n に 1 を加える」操作を3通りの方法で行ってください。
「int n = 17, double z = 5, double w」を宣言し、「w = n / z」または「w = z / n」とするとどうなるか試してください。また、w のかわりに「int k」を使うとどうなるか試してください。
「int m = 17, int n = 5, double w」を宣言し、「w = m / n」という演算についてそのまま演算した後、「w = (double)(m / n)」(演算結果を double にキャスト)「w = (double)m / (double)n」(各値をキャストしてから演算)という演算をそれぞれどうなるか試してください。
「int n = 17, double w」を宣言し、n を変数でなく定数 5 で割ってください。このとき w に入る結果として商だけ(小数部無し)のものと、小数点付きのもの、二つの計算方法を示してください。
「int n = 17, double z = 5, double w」を宣言し、w に n 割る z の余りを入れてください。
「=」「+=」「++」の演算子を使います。
#include <stdio.h>
main()
{
int n = 1;
n = n + 1;
printf("n = n + 1 -> %d\n", n);
n += 1;
printf("n += 1 -> %d\n", n);
n++;
printf("n++ -> %d\n", n);
return 0;
}
「n / z」のように一方でも浮動小数点型が入っていると、整数型が自動的に浮動小数点型へキャストされてから演算されます。従って「w」には小数付きの結果が入ります。また、「int k」を使った場合、演算結果(浮動小数点型)を整数型変数に代入しようとしているので警告(warning)がでます。
#include <stdio.h>
main()
{
int n = 17;
double z = 5;
double w;
w = n / z;
printf("%lf\n", w);
return 0;
}
最初のパターンでは整数同士の演算「m / n」が行われてから自動的に double へキャストされます。従って w には小数点のつかない商が入ります。二つ目のパターンは「m / n」という演算の結果を double にキャストしています。つまり、最初のパターンでキャストを明示的にやっているに過ぎません。三つ目のパターンでは各値を最初にキャストしてから演算しています。従って、この演算は浮動小数点型の演算となり、w にも小数点付きの演算結果が入ります。
#include <stdio.h>
main()
{
int m = 17;
int n = 5;
double w;
w = m / n;
printf("%lf\n", w);
w = (double)(m / n);
printf("%lf\n", w);
w = (double)m / (double)n;
printf("%lf\n", w);
return 0;
}