#pragma twice

KAB-studio > プログラミング > #pragma twice > 018 Version 2.7 短いことはいいことだ?

#pragma twice 018 Version 2.7 短いことはいいことだ?

前のページへ 表紙・目次へ 次のページへ

 Version 2.7
短いことはいいことだ?

さて、前回の続き
この前って、確か ++ っていうのだったよね
そ。たとえばこんなプログラム

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    TRACE( "%d\n", ++iBox );
}

えっと、 ++iBox は iBox += 1 と同じだから、1って出てくるよね
そ。じゃあ、これはどう?

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    TRACE( "%d\n", iBox++ );
    TRACE( "%d\n", iBox );
}

 ++ が後ろに付いてるね。あともう一度表示してるし、わざわざこういう
のがあるってことは、ちょっと結果違うってことよね
とりあえず試してみれば?
はーい
 ビルドして実行する。結果は……。
0
1
あ、ゼロ! で、その次ので1……ってことは、1個目の TRACE() と2
個目の TRACE() の間で1増えたってこと?
そういうこと。〈後ろに付いた ++ 〉は、次の行に行く直前に1増やすっ
ていう機能を持ってるわけ
前に付けたらすぐに+1、後ろに付けたらあとで+1ってことね。でもな
んかこんがらがりそう……
ま、普通は〈前付け〉の方しか使わないんだけど、よく使う場面もあって。
とりあえず憶えておいてね
ふぅん
あ、あと用語。こんなふうに〈1増やす〉ことを〈インクリメント〉って
いいます
い、いんくりめんと?
〈増える〉っていう英語を〈インクリーズ〉っていうでしょ、その名詞版っ
てとこかな
でも憶えにくいなー
でもよく出てくる単語だから憶えといてね。あと〈1減らす〉ことを〈デ
クリメント〉っていうから
まあこれは〈インクリメント〉が憶えられたら大丈夫そうね
あと ++ のことを〈インクリメント演算子〉、 -- のことを〈クリメント
演算子〉っていいます
これもそのまんま……あれ? 前付けとか後ろ付けの区別は?
付けるときには〈前置インクリメント演算子〉とか〈後置インクリメント
演算子〉っていうかな。でもあんま言わないけど……
なんで?
たいがい〈前置〉の方しか使わないから、〈インクリメント演算子〉って
言ったら〈前置インクリメント演算子〉のこと、って感じかな。ま、〈前置〉
と〈後置〉で動作が大きく変わるようなプログラムはあんま作らない方がい
いんだけどね
え、なんで?
そりゃ火美ちゃんみたいに混乱するから
へ? プログラマーってそういうのへっちゃらじゃないの?
プログラマーっていうのは〈プログラムが組める人〉であって、〈驚異的
な頭脳と集中力を持つ人〉じゃないんだから。だいたい
だいたい?
もしそうなら、火美ちゃんに教えようなんて思わないよ
うわむっか!
言い換えれば、プログラマーなんて誰にだってなれるってこと。もしかし
たら、フツーの人の方が、優れたプログラマーになれる素質、あるかも
どして?
今みたいに〈混乱する〉って思えば、安全策取るでしょ。そういう人の方
が安定性の高いプログラム作れるわけ。これが〈オレは大丈夫!〉なぁんて
うぬぼれてる人は、いつまで経っても……
ま、自分を過信しすぎるなって、どんな事でも言えるんだろうけどねー
そだね。火美ちゃんも、くれぐれも過信しないようにねー
もっちろん!
何その自信は……じゃ、話を元に戻して、ちょっと小ネタ紹介しようか
小ネタ?
この前、こんなプログラムあったよね

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
    {
        ++iBox;
        TRACE( "%d ", iBox );
    }
}

うん、1から5まで表示するの
これは、こんなふうに短縮できます

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
    {
        TRACE( "%d ", ++iBox );
    }
}

これだとすっきりするね
でも注意して欲しいこと。たとえば

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
    {
        TRACE( "%d ", ++iBox );
    }

    TRACE( "%d\n", iBox );
}

このプログラム、目的は最後の TRACE() で出力するだけで、 while の中
の TRACE() は、ちゃんと数が増えてるかのチェックだとします
うんうん
ちゃんと増えてたのを確認したから、その確認用出力をやめたいとき、ど
うする?
そりゃ、こんな感じにコメントアウトしたりするんじゃない?

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
    {
//      TRACE( "%d ", ++iBox );
    }

    TRACE( "%d\n", iBox );
}

ホントに?
ホントにって、試してみればいいじゃない。ビルドして実行……あれ?
アプリが止まっちゃったね
え? え?
こういうときはどうするんだっけ?
え、えっと、たしか、そう、×印! あ、なんとかなったみたい
なんでこうなっちゃったか、わかる?
ん〜と、このまえこれで無理矢理終わらせたときは、 while の繰り返し
がずーっと続いてたからなんだよね
そうそう
ってことは、 iBox がいつまでも5より大きくならない……あ、 ++iBox
の行も一緒にコメントアウトしちゃったからだ
そういうこと。こういうことは、1行に詰め込まなければ起きなかったこ
とでしょ
うん、2行に分けてたら、 TRACE() だけコメントにできてたんだもんね
1行に詰め込んで書くと、こういう弊害があるってとこかな
1行に詰め込むときは気を付けて、ってことね
気を付ける自信、ある?
もっちろん!
火美ちゃん!!
な、なに!?
ほんっとーに、どんな時でも気を付けられる?
え……
徹夜の時でも? 空腹の時でも? 10時間働きっぱなしの時でも?
ふ、ふぇ……
何年も何十年も、ずっとずっと気を付けられる!?
ふぇ、ふぇえええーん!!
げ! ご、ごめん、怒鳴っちゃったりして
……………………ぐすん
……でも、僕が何言いたいか、分かる?
…………過信するな、ってこと
そういうこと
モニター撫でられてもうれしくないもん……
怒鳴っちゃって悪かったけど、こういうことってとっても大事なことだか

うん。よーするに、1行に詰め込んじゃダメってことよね
そういうわけでもないんだけど
なんやとコラ、あんだけゆーといてそれはないやろがっ!!
う”、まーまー怒んないで
で、どういうこと?
そうだね、僕は1行に詰め込むのは嫌い。だから、火美ちゃんには奨めな
い。けど、詰め込まないと行数が増えるでしょ
うん、1行が2行、倍だもんね
行数が増えると逆に見にくい部分もあるし、1行に書いてすっきりさせた
方が見やすいこともある。で……
で?
こういう部分は人それぞれ。僕が1行で書くところを、火美ちゃんは2行
で書くかもしれない
ん……
でも、そういうのを何も考えずに決めたり、理由のない自信だけで決めて
欲しくはない。自分がすることに、人を説得できる理由を持って欲しいかな
その理由を持つことが大事、ってことね
そういうこと! わかってきたね。……もちょっといいかな?
うん、大丈夫。今日も憶えたこと少なかったし
そだね。じゃ、ついでにふたつほど、省略する方法を教えようか
げ、そーゆーの教えといて使うなっていうの?
でも他の人が使ってたら?
う〜
じゃ、まずさっきのプログラム

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
    {
        TRACE( "%d ", ++iBox );
    }
}

これは、こう書き直せます

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
        TRACE( "%d ", ++iBox );
}

あ、中カッコがなくなった!
でもこれはダメだよ?

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 )
        ++iBox;
        TRACE( "%d\n", iBox );
}

試してみるね……あ、5しか表示されないね
どうしてだと思う?
よーするに、 TRACE() が繰り返されてないんだよね
手のひらアイコンで止めてみれば分かるけど、繰り返しは ++iBox; の行
しかされてないんだよね
while の次の行だけってことね。なんかインデントに惑わされそう……
そ、書き方に惑わされないようにね。もうちょっと具体的に言えば、小
カッコ閉じから行末まで、かな。だからこれとも同じ

    while( iBox < 5 ) ++iBox;

う〜、なんか変な感じ。でも、これってまとめてコメントアウトできるか
ら、逆にその方がいいってこと、ない?
うんうん、そういうふうに考えるよーにしてこーね
うん
でも中カッコ使った時のと比べると、ちょっと違和感あるでしょ
それはあるかも。 while の繰り返しが右か左か、っていうの混乱しそう
だからこういうふうに書く人もいたり

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( iBox < 5 ){
        ++iBox;
        TRACE( "%d ", iBox );
    }
}

中カッコの位置が違うだけで、かなり感じちがうねー。あ、そういえば、
なんで中カッコの中は、何行でもくりかえせるの?
そうだね、中カッコと中カッコ閉じが、外から見ると1行と同じ、ってと
ころかな
雰囲気的にはこんな感じ?

    while( iBox < 5 )
        {++iBox;TRACE( "%d ", iBox );}

うん、そんな感じかな
あともうひとつは?
今日はちょっと長くなっちゃったし、また今度にしようか
はーい

/*
    Preview Next Story!
*/
プログラミングって結構厳しい世界……
そう? 僕は逆に楽な世界だと思うけどね
水希ちゃんはエリートだもの
う、なんかなー……
というわけで次回
< Version 2.8 もしももしもがあったなら >
につづく!!
でもぢつは私もエリート?
なんで?
生まれてからプログラミングしかしてないもん
そういやそうだ……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。