GeoCities home page

プログラミング A home page

1998年5月18日分

数学の「=」とC++(C言語)の「=

数学の「=」は、右辺の値と左辺の値が等しいことを表しています。一方、C++の「=」は右辺の値を左辺に代入することを表しています。

この2つの違いが分かれば、a=a+3という式の意味も分かりますね。

数学では、

a = a+3

a-a = (a+3)-3

0 = 3

となってしまうので、a=a+3はありえません。しかし、C++ではこのような式も意味を持ちます。例えば、

int a;

a = 10;

a = a + 3;

というプログラムを実行したら、aの値は最終的にいくつになると思いますか?

コンピュータになったつもりで考えてみましょう。「a = 10;」の行を処理し終わった段階で、aの値は10です。「a = a + 3;」の行を読み込んだときに、コンピュータはまず右辺の値を求めようとします。この時点でもaの値はまだ10なので、右辺のaを10に変えます。

a = 10 + 3;

10+3は13なので、最終的に次の式になります。

a = 13;

結局、aの値は13になりますね。

このように、C++の「=」は数学の「=」とは別物である、ということを覚えておいてください。

演算子

+,-,*,/というような記号は「演算子」と呼ばれます。足し算、引き算、掛け算、割り算というような演算を行うからです。

+,-,*,/は数を扱う演算子です。演算の結果も数になります。なぜこんな事を言うかというと、結果が数にならない演算もあるからです。

例えば、

3+5, 11-4, 9*5

という演算の結果はそれぞれ8,7,45になりますが、

3<5, 11<4, 9>5

という演算の結果は何になると思いますか?これは、それぞれ真(true), 偽(false), 真(true)になります。もしプログラムの中に

a = 7;

if (a>5) {

Edit1->Text = "a5より大きい";

}

という部分があった場合、if 文のところでコンピュータはaと5を比べ、その結果として次のようにtrueとみなします。

if (true) {

if 文は、「条件がtrueならば次の命令を実行する」という命令なので、「aは5より大きい」と表示されます。

課題:次の演算の結果は何になりますか? (下の2つの演算子は見慣れないものだと思います。上から順に、等号と不等号です。)

かつ、または (論理演算子)

&&, ||という、真偽を扱う演算子があります。and, orと呼ばれています。ごちゃごちゃ説明するよりも、次の例をみるとすぐに分かるでしょう。

しかし、この演算子が実際に使われるのは次のような場合です。

if ((a > 5 ) && (a < 16)) {

Edit1->Text = "合格";

}

これは、aが5より大きくて16より小さい場合に「合格」と表示するプログラムです。コンピュータになったつもりでこのプログラムを読んでみましょう。(aは20とします。)

まず、aを20に置き換えます。

if ((20 > 5 ) && (20 < 16)) {

つぎに、2個所で大小を比較し、その結果の真偽を出します。

if (true && false) {

最後に、&&という演算を行います。

if (false) {

結局falseなので、「合格」とは表示されません。

便利な演算子

次の左側の記述は、右側のように書くことができます。

a = a + 3 a += 3
b = b - 4 b -= 4
c = c * 5 c *= 5
d = d / 6 d /= 6

右側のような書き方を知らなくても左側の書き方を知っていれば大丈夫ですが、右側の書き方を知っていればプログラムを書く量が減り、便利です。

また、1だけ増やしたいとき、1だけ減らしたいときは次のように書くことができます。

e = e + 1 e++
f = f - 1 f--

コメント

コンピュータは、C++のプログラムの中に次のような部分があると、無視してくれることになっています。

このように無視される部分をコメントといいます。適切なコメントをつけることによって、プログラムは人間にとってより分かりやすくなります。

次の2つのプログラムを見てください。前のプログラムと後のプログラムは同じ物です。ただ、前のプログラムにはコメントがなく、後のプログラムにはコメントがあります。

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (Edit1->Text == "") {

Edit1->Text = "名無しの権兵衛さん";

} else {

Edit1->Text = Edit1->Text + "";

}

}

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

/*

ボタンが押されたら「君」づけをするプログラム

空欄の場合は「名無しの権兵衛」とみなす

*/

if (Edit1->Text == "") { // もし空欄なら

Edit1->Text = "名無しの権兵衛さん";

} else { // 空欄でなければ

Edit1->Text = Edit1->Text + ""; // 「君」づけ

}

}

どうですか? 後のプログラムの方がわかりやすいですね。

このように適切なコメントをつけたプログラムは、他人にとって見やすくなります。また、自分で作ったプログラムでも、作って1ヶ月も経つとその内容を忘れてしまうものです。他人のためにも、また後日の自分のためにも、プログラムにはわかりやすいコメントをつけましょう。

課題:食堂で次の注文を受けました。C++言語のつもりでこの注文を解読し、総額いくらになるか計算してください。ただし、ラーメン350円、カレーライス400円、牛丼450円、ライス150円、大盛りはそれぞれ100円増しとします。

{

えーと、

まずカレーライス2人前、

//ラーメン1人前、

そして牛丼//の大盛り

2人前、

あと、並み盛りのライス/*3人前と、

大盛りライス*/1人前をお願いします。

}

空白と改行

またコンピュータは、空白や改行がいくつ続いても1つの空白とみなします。逆に「;」をみつけると、「ここが1つの命令の終わりだ」と考えます。

具体的に見てみましょう。

{

Edit2->Text =

Edit1->Text

 

 

+

"さん" ;

Edit1->Text

= "";

}

というプログラムも、コンピュータにとっては

{

Edit2->Text = Edit1->Text + "さん" ;

Edit1->Text = "";

}

というように見えます。

このように空白や改行がいくつ続いても、コンピュータにとっては同じ物ですから、人間が見やすいように字下げが行われています。

標準的な字下げが行われたプログラムは次のようになります。

void __fastcall TForm1::ButtonCheckClick(TObject *Sender)

{

if (EditInput->Text.ToInt() == 7) {

EditMes->Text = "正解!";

} else {

EditMes->Text = "はずれ";

}

}

字下げによって「{」や「}」の付け忘れを防ぐことができます。プログラムは字下げによってきれいに書きましょう。