Version 2.6
便利なものいろいろ!
「前回は while を使ってみました」
『あれは便利よねー、面倒な繰り返しが簡単にできちゃうんだから』
「今回まず、そのための便利なものを紹介しましょー」
『便利づくしねー』
「まず<っていう演算子を紹介しましょう」
『だいなり、ってヤツ?』
「そ。とりあえずこれ試してみ?」
void CCalcDlg::OnBEqual()
{
TRACE( "3 < 5 : %d\n", 3 < 5 );
TRACE( "5 < 3 : %d\n", 5 < 3 );
}
『はーい。ビルドして実行っと……』
3 < 5 : 1
5 < 3 : 0
『? 変な結果』
「3と5でどっちが大きい?」
『そりゃ5に決まってるじゃない』
「じゃ、3<5は合ってる?」
『合ってるに決まってるじゃない』
「それじゃ5<3は?」
『これは間違いよね』
「そういうこと」
『どーゆーこと?』
「よーするに合ってたら1になって、間違ってたらゼロになるってこと」
『1になるとか、ゼロになるとかって?』
「こういうことかな」
void CCalcDlg::OnBEqual()
{
TRACE( "3 < 5 : %d\n", 1 );
TRACE( "5 < 3 : %d\n", 0 );
}
「 3 < 5 っていうのがあったら、プログラムはこれを調べて、合ってたら
1になって、間違ってたらゼロに置き換わるってこと」
『置き換わるってよく分かんないけど……』
「ほら、この前こういうの見たでしょ」
iBox = iBox + 200;
『前々回だっけ』
「このときは、まず」
iBox = 100 + 200;
「に置き換えるって話したでしょ。こういうふうに置き換わるってこと」
『置き換わるっていうより、みなす、ってこと?』
「そういうことかな。<があったら、その左右を比べて、合ってたら1に、
間違ってたら0になっちゃうわけ」
『ふーん……』
「じゃ、問題」
『ええ?』
「これ使って前回の 1 から 5 までっていうの、やってみ?」
『う”、難しそう……』
「この前の〈ずっと繰り返される〉っていうの、こうだったよね」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( 1 )
{
iBox += 1;
TRACE( "%d ", iBox );
}
}
「 TRACE() で5を出力した、で while に戻った。そのとき while がゼロ
になるようにすればいいんだから?」
『これで < を使うのよね…… iBox < 5 とかできる?』
「もちろん」
『ってことは、 iBox の中が0から4の時は 4 < 5 で、これだと1になる
から while の次は中カッコの中』
「うんうん」
『もし iBox の中に5が入ってたら、 5 < 5 だから、これ間違いだから、
これがゼロになって…… while がゼロになる! これでストップ!』
「そういうこと! じゃ、実際に書いてみると?」
『 1 を iBox < 5 に置き換えればいいだけよね……』
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( iBox < 5 )
{
iBox += 1;
TRACE( "%d ", iBox );
}
}
『書き換えてビルドして実行して……やったー! ちゃんと5回で止まっ
たよ!』
「こういう演算子と、 while を組み合わせるだけで色々できるってことが
分かった?」
『うん、便利だねーこれ』
「じゃ、これに似た演算子も紹介しようか」
『似たって、> とかってこと?』
「そ。> は < の逆」
『ってことは 3 > 5 でゼロ、ってことね』
「次に <= と >= 。これはつまり、現実世界だと……」
< >
= と =
「のことだね」
『 5 < 5 だとゼロだったけど、 5 <= 5 だと1、ってことよね』
「そういうこと」
『ねーねー、ただの=ってないの? 代入の記号でいいの?』
「違うんだね、これが。〈同じかどうか〉の演算子は、==を使うんだわ」
『イコール、ふたつ?』
「そ。ま、これは憶えちゃうしかないかな」
『変数に入れるのは=、ホントの意味の〈同じ〉っていうのが==、ね』
「あと!=っていうのもあるよ」
『なに、これ』
「==の逆。 5 == 5 なら1だけど、 5 != 5 だとゼロなんだわ」
『ってことは 3 == 5 ならゼロだけど、 3 != 5 だと1ってこと?』
「そういうこと。もうひとつこれに似たの、それは!」
『それは?』
「いや、そーじゃなくって、〈 ! 〉っていう演算子なんだわ」
『あー、!=の!ね』
「そ。これは、ゼロのものを1にして、ゼロ以外のものをゼロにします」
『ん?』
「たとえばこれ」
void CCalcDlg::OnBEqual()
{
TRACE( "3 < 5 : %d\n", !( 3 < 5 ) );
TRACE( "5 < 3 : %d\n", !( 5 < 3 ) );
}
『これ、今日最初のヤツよね。ビルドして実行っと……あ! 逆!』
3 < 5 : 0
5 < 3 : 1
「こんなふうに〈逆にする〉ことができるから、これを使えば < とかも逆
のができるってことだね」
『……なんか頭こんがらがっちゃいそう』
「それは言えるね。だからね、自分なりにひとつの型を作っとくといいかな」
『どういうこと?』
「たとえば、さっきのプログラムはこう書き換えられるでしょ」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( iBox != 5 )
{
iBox += 1;
TRACE( "%d ", iBox );
}
}
『あ、そうよね、iBox の中が 5 になったときに、 while がゼロになれば
いいんだから』
「同じく」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( !( iBox == 5 ) )
{
iBox += 1;
TRACE( "%d ", iBox );
}
}
『よーするに、!=は!と==に置き換えられるってことよね』
「あとこういうのもあるよ?」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( iBox <= 4 )
{
iBox += 1;
TRACE( "%d ", iBox );
}
}
『これも、5になったらゼロになるんだ……』
「さ・ら・に」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( !( 5 <= iBox ) )
{
iBox += 1;
TRACE( "%d ", iBox );
}
}
『もう、もうやめてっっ!! 頭が、頭が』
「悪い?」
『悪くないっ! でもホントに悪くなっちゃいそ……』
「だから、自分で使うときにはひとつに統一した方が分かりやすくなると思
うよ」
『統一って、 < だったら < ばっか使うってこと?』
「全部にってわけじゃないけど、たとえばこの〈5まで〉とかならね」
『ま、言われなくてもするけどね』
「そう?」
『何よ、どういう意味よ』
「実際に統一してくのは難しい、ってこと。ま、そのうち分かるけどね」
『なんかムカツクなー』
「あともうちょっといいかな」
『うん、今日これまでって、 <, >, <=, >=, ==, !=, ! しか教えてもらっ
てないし、どれも似たようなのだし』
「そだね。でもさ、!ってちょっと違ったでしょ」
『そういえば…… < とかって、左と右を比べるのでしょ。でも!って右だ
けだよね』
「この!みたいな、ひとつの数字だけやひとつの変数だけをチェックする演
算子を〈単項演算子〉って言います」
『たんこーってゆーと、酸素含有率アップでどかーんって』
「そりゃ炭坑や! 〈項〉っていうのは……」
『どったの?』
「……よーするに〈 項 == 項 〉とか〈 !項 〉とか見れるわけで……」
『しっかりやんなさいよー、センセなんでしょー!?』
「う”……要するに〈チェック項目〉の〈項〉かな。==だったら左と右が
チェックする項目で、!だったら右側だけがチェックする項目」
『この項目がいっこだけだから、単項演算子、ってこと?』
「そゆこと。他の==とかは2項演算子っていいます」
『よーするに種類としてそういうのがあるってことよね』
「そうだけど、本とかにこういう用語が使われてるから、知っておくと便利
だから。ちなみに〈項〉は英語で言うと "operand"(オペランド)って言う
から」
『なんか猟奇的な世界ね』
「いきなりボケ激しいっすね……ちなみに "operand" って〈被演算子〉っ
て意味らしいよ」
『まんまねー』
「で、今日最後は4つの単項演算子を憶えてもらいたいと思います」
『4つも!?』
「大丈夫、そんなに難しくないから。これ試してみて」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( iBox < 5 )
{
++iBox;
TRACE( "%d ", iBox );
}
}
『あ、結果同じー』
「 ++ っていう単項演算子は、くっついてる変数を1増やす、っていう機能
を持ってるわけ。つまり iBox += 1; と同じってことだね」
『へー、これ便利そう。ってことは -- もあるってこと?』
「そういうこと。で、実はこんなのもあります」
void CCalcDlg::OnBEqual()
{
int iBox;
iBox = 0;
while( !( 5 <= iBox ) )
{
iBox++;
TRACE( "%d ", iBox );
}
}
『あ、今度は後ろに付いてる……あれ? でも結果同じだよ?』
「というわけで、次回に続く!」
/*
Preview Next Story!
*/
『今日は結局、演算子見ただけね』
「こーゆーのが大事ってことかな。次回はちょっと違う話」
『どんな話かな……な、何これ!』
「まぁ、たまにはこういうことも、あるよね……」
『というわけで次回』
< Version 2.7 短いことはいいことだ? >
「につづく!!」
『次の話、ええ話や……』
「まあそうかも」
『でもムカツク!』
「げげ」