Version 9.10
ショートサーキット
「さて、まずは前回の続きから」
if (
!m_wndToolBar.CreateEx()
||
!m_wndToolBar.LoadToolBar()
)
{
TRACE0("Failed to create toolbar\n");
return -1; // 作成に失敗
}
『なに? よくわかんないんだけど、つまり上のがエラーになると下のが呼
ばれないってこと?』
「そういうこと。まず、このふたつの結果と if との関係をまとめると」
上の結果 下の結果 || の結果 if
両方とも成功: 0 0 0 入らない
上のだけ成功: 0 0 以外 0 以外 入る
下のだけ成功: 0 以外 0 0 以外 入る
両方とも失敗: 0 以外 0 以外 0 以外 入る
「っていう関係になります」
『もちろん ! のあとのだよね』
「もちろん。 ! が掛かってない時には成功した時は 0 以外だからね」
『で、上がエラーになるってことは』
下のだけ成功: 0 以外 0 0 以外 入る
両方とも失敗: 0 以外 0 以外 0 以外 入る
『の時だよね』
「そう。で、これを〈上のだけ呼んだ状態〉の表に書き換えると」
上のまず失敗: 0 以外 ? 0 以外 入る
『??? 下の結果が?なのは分かるけど、なんで || の結果とか?じゃな
いの?』
「だって、ほら。もう一度見て」
下のだけ成功: 0 以外 0 0 以外 入る
両方とも失敗: 0 以外 0 以外 0 以外 入る
『あ! ?のとこが成功でも失敗でも、結果変わらないんだ!』
「そゆこと。こういう理由で、 || 演算子は〈左側が 0 以外だと、右側は
無視する〉っていう仕様になってるんです」
『だから下の方が呼ばれない!』
「これを【ショートサーキット】って言います」
『ショートサーキット? 短い……コース?』
「ショートサーキットっていうのは電気の用語で、プラスとマイナスを直に
くっつけちゃうこと。ほら、〈電気回路がショートした〉とか言うでしょ」
『あのショートと同じなんだ』
「用語的にはね。つまり、呼ぶ必要のない || の右側は飛ばしちゃおうって
こと」
『へー、便利っていえば便利ね』
「うまく使えばね。たとえば……」
// int *pi;
// ってしてあって、どこかの int 変数を指してると思ってください。
if (
( pi == NULL )
||
( *pi != 100 )
)
{
// pi が指す変数の値は 100 じゃないです。
}
『むむ、ちょっと難しいかも』
「ここでは本当は」
if( *pi != 100 )
{
// pi が指す変数の値は 100 じゃないです。
}
「だけしたいんです」
『これならわかるよ。 pi ってポインタが指す変数が 100 じゃなかったら
if の中に入るんだね』
「そういうこと。ところが、もし pi が NULL だと」
if( *pi != 100 )
『のとこがエラーになっちゃうね』
「だから、実際には」
if( pi != NULL )
{
if( *pi != 100 )
{
// pi が指す変数の値は 100 じゃないです。
}
}
else
{
// pi が NULL ってのはおかしくない?
}
「って書きます」
『 NULL かどうかチェックしてからってわけね』
「で、これを一緒にしちゃったのが」
if (
( pi == NULL )
||
( *pi != 100 )
)
{
// pi が指す変数の値は 100 じゃないです。
}
『えーっと、 pi が NULL なら 0 以外になって、それだと || の右側に関
係なく 0 以外になるから *pi != 100 が呼ばれない、と』
「そゆこと。ま、厳密には同じじゃなくて、2重に if してるのの else の
場合、つまり」
else
{
// pi が NULL ってのはおかしくない?
}
「の場合も if の中に入っちゃうけどね」
『 NULL の場合もってことね』
「それに、このショートサーキットだと || の右側が呼ばれない場合があ
るって事が分かりにくいから、僕はあまり勧めないかな」
『分かりにくいとまずい?』
「たとえば最初の例の場合だと」
{
TRACE0("Failed to create toolbar\n");
return -1; // 作成に失敗
}
「って感じに if の中にはいると return() するけど、プログラムによって
はしないこともあるでしょ」
『うん、あるだろーね』
「その場合、ショートサーキットが機能すると、 || の右側が処理されない
から、あとあと影響するような関数を呼んでたりすると」
『その関数が呼ばれないで次へ行っちゃう……げ、それちょっとヤバそ
う!』
「そういうのを気を付けることが重要なんだけど、ショートサーキットを使
うと分かりにくいから、バグの温床になりかねないかな」
『だったらどうするの?』
「さっきの2重の if にするの」
『あー』
「見栄えは良くないけど、この方が分かりやすいよ。 NULL の場合に別の処
理をさせることもできるし」
『見栄えよりも分かりやすさ?』
「そゆこと。と、最後に、ショートサーキットの機能を持つ演算子が || の
他にあるから紹介しておきます」
『 && のこと?』
「げ、なんで分かったの?」
『だって || と && ってペアじゃん』
「まぁそうだけど……当てずっぽう?」
『もちろん』
「もちろんって……じゃあ火美ちゃん、どういう時にショートサーキットす
るか考えてみて」
『げ! それってかなりむつかしくない??』
「ま、できなくてもいいからとりあえずやってみて」
『……えーっとぉ、 && って Version 6.10 ( No.110 ) で出てきたよね。
そんときは……』
TRACE
( "%d, %d, %d, %d\n"
, 0 && 0, 0 && 1, 1 && 0, 1 && 1 );
// 0, 0, 0, 1
『この条件を縦に並べると……』
0 && 0 : 0
0 && 1 : 0
1 && 0 : 0
1 && 1 : 1
『あ、判った。 && の左側が 0 になったら右側飛ばすでしょ』
「げげ!!」
『げげってなによげげって』
「あ、いや……うん、合ってるよ。よく分かったね」
『だって、左側が 0 の時は、右側が 0 でも 0 以外でも、結果 0 だもん。
だから右側は飛ばせちゃうんだよね』
「そのとおり……」
『ってことは、 && を使う時もショートサーキットに注意しなきゃいけない
わけね』
「そゆこと。ま、特に面倒じゃなかったり、すると見にくくならないんな
ら、 if を2重にするとかした方がいいかな」
/*
Preview Next Story!
*/
「こういうプログラミングの話って……どう?」
『つまんない』
「げ」
『面白いって思わないとダメ?』
「うーん、今の段階ではそれも困るかも」
『ならいーじゃん』
「うーん」
『というわけで次回』
< Version 9.11 ツールバーリソース >
「につづく!」
『そう、こういうのの方が面白そう!』
「それが普通なのかもしれないけど……」