算術演算子

算術演算子

加算、減算、乗算、除算、剰余、代入、インクリメント、ディクリメント演算などについて。
サイト全体の目次

稿


稿

算術演算子

このセクションのリスト

/*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*/ }

list-1.4.1-07

基本的な演算子には四則演算と剰余を求める演算子として次の五つがります。

+足します。
-引きます。(単にマイナス記号としても使われる。)
*掛けます。
/割ります。ただし、商だけがその結果で、あまりは無視されます。
%割った余りが結果になり、商は無視されます。

まず、掛け算、割り算は紙上で書くのと多少異なります。といっても、コンピュータ上ではすでに当たり前の記号になってますから、戸惑うことはないでしょう。注意して欲しいのは、整数型の割り算では余りが無視されるということです。つまり、小数点以下が切り捨てられるわけです。かわりに、整数型の演算では「%」演算子で剰余、つまり余りを出すことができます。なお、これら基本的な演算子を算術演算子といいます。

また、数学と同様の規則でカッコが使えます。ただし、「*」など記号の省略はできません。また中カッコなどもないので、カッコをネスト(入れ子)にしたいときは以下のように普通のカッコをそのまま使ってください。

/*** 正しい ***/
(1 + 2) * 3
(1 + 2) * (3 + 4)
((1 + 2) * 3 - 4) * 5
/*** 間違い ***/
3(1 + 2)
(1 + 2)(3 + 4)
{(1 + 2) * 3 - 4} * 5

違う方同士の演算1

このセクションのソース

/*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*/ } 

list-1.4.2-10

前回説明した代入も含めて、C言語では基本的に違う型同士の演算はできません。そこで、このリストのようにタイプキャストを行って演算します。また、浮動小数点数の割り算は小数点も計算されます。

違う方同士の演算2

このセクションのソース

/*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*/ }

list-1.4.3-08

先ほど述べたとおり、整数型同士の演算では小数以下が切り捨てられます。そこで小数以下も維持したい場合は 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*/ }

list-1.4.4-07

このようにした場合はどうなるのでしょうか。これは

z = 10 + 5;

と読みかえることができます。つまり、右辺の計算が完了してから代入が行われるため、右辺を計算する時点ではまだ z には「10」が入っているわけです。

代入演算子

このセクションのソース

/*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*/ }

list-1.4.5-07

リストのこの部分は

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;
}

list-1.4.5

この「++」はインクリメント演算子といって、

z = z + 1;

と同じ意味です。「変数 z の値を1つ増やしなさい。」という事ですが、よく使うのでこのように省略して書くことが出来ます。似たような表現「++z」が数行下の printf の中にもありますが、これもインクリメント演算子です。最初のものと何が違うのでしょうか?それは、1実行文中において「z++」は「実行文が終わってから1を足す」のに対し、「++z」は「実行文を処理する前に1足す」という違いがあります。実行文とは「;」で区切られたひとつの命令でしたから、一番最初に出てきた「z++;」はこれだけで1実行文になっているので、「++z;」としても結局は同じことになります。しかし、それ以降のインクリメント演算子はそれぞれ printf 文中に入っているので微妙な違いを見せます。すなわち以下の二つは同じ結果になりますが、
/*** パターン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を引く「z--」「--z」という演算子もあります。.にまとめておきますので、プログラムを実行して確認してみてください。

インクリメント演算子
[変数]++ 実行文を実行してから、変数の値を1増加
++[変数] 変数の値を1増加させてから実行文を実行
デクリメント演算子
[変数]-- 実行文を実行してから、変数の値を1減少
--[変数] 変数の値を1減少させてから実行文を実行

練習問題

問題-1.4.1

「int n = 1」 を宣言し、「n に 1 を加える」操作を3通りの方法で行ってください。

問題-1.4.2

「int n = 17, double z = 5, double w」を宣言し、「w = n / z」または「w = z / n」とするとどうなるか試してください。また、w のかわりに「int k」を使うとどうなるか試してください。

問題-1.4.3

「int m = 17, int n = 5, double w」を宣言し、「w = m / n」という演算についてそのまま演算した後、「w = (double)(m / n)」(演算結果を double にキャスト)「w = (double)m / (double)n」(各値をキャストしてから演算)という演算をそれぞれどうなるか試してください。

問題-1.4.4

「int n = 17, double w」を宣言し、n を変数でなく定数 5 で割ってください。このとき w に入る結果として商だけ(小数部無し)のものと、小数点付きのもの、二つの計算方法を示してください。

問題-1.4.5

「int n = 17, double z = 5, double w」を宣言し、w に n 割る z の余りを入れてください。

練習問題回答例

問題-1.4.1

「=」「+=」「++」の演算子を使います。

#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;
}

問題-1.4.2

「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;
}

問題-1.4.3

最初のパターンでは整数同士の演算「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;
}


読み込み中・・・
10秒待っても表示が変わらない場合、次の理由が考えられます。
・Javascript が無効になっています。
・検索エンジンのキャッシュを見ています。
サイトホームへ / 上位ページへ / ページトップへ / PAROFトレンドショッピングへ
Copyright (C) 2010 totobon all right reserved.