![]() |
zunbe |
![]() |
|
![]() |
(その1) どのファイルを処理するべきか | 配列名と変数名 | ![]() |
2005/07/15
演算には優先順位がある。 ところが、長年プログラミングをやっている人でも、評価順序があることを知らない人は多い。 以下のコードは、よく見かけるコードだが、潜在的にバグを含んでいる。 ----- このコードは、左から右に評価される事を前提に記述されているが、先の通り、評価順序は左から右とは限らない。 「式は左から右に評価される」と明示的に仕様として確定されてもよさそうな気がするのだが。 ■2006/0915追記 ななしさんより、「C/C++では、&&、|| などの演算での評価順序は、左から右と規格で決まっている」というご指摘を頂きました。
投稿者 zunbe : 2005/07/15 16:18:33
if ((p != NULL) && (p->func() == true)) こういうかき方できると、if の階層が1つ浅くなって、だいぶコードがすっきりしますよね・・・。 投稿者 GOTTi : 2005/07/16 00:19:04 まあ、一般的には、式は左から右に評価されていくと思うので、こういったコードを書いても、まず問題は起こらないと思う。 ずんべの場合、できるだけ、左にネストしないようにコードを設計することが多い。 ----- if (p->func() != true) 基本的に、コードを下へ下へと伸ばしていきます。 投稿者 ずんべ : 2005/07/16 04:59:02 このようなシンプルな場合に限ると、goto で終了処理へ飛ばすのは賛成です。 C# なんかで書いているときは、p==NULL みたいな箇所でわざわざ別途終了処理書いて return しているコードあります。 1点、if 文では本体が1行でも必ず中括弧つけるのが僕のポリシーです。(その方がメンテナンス性が高いと僕は思っています。) 投稿者 GOTTi : 2005/07/16 06:06:00 誰もつっこまないので今更ながら。 投稿者 ななし : 2006/09/14 15:12:37 ななしさん> C Sequence Points なるほど、確かに、Visuak C / Visual C++ では、&&、|| などの演算は、左側を先に評価すると書かれていますね。 ただし、C/C++で &&、|| などの評価順序が例外として規定されている事を私は知りませんでしたので、サンプルをCで記載しましたが、この文章は、C/C++ に特化したものではありませんので、念のため。 ご指摘ありがとうございました。m(__)m 投稿者 ずんべ : 2006/09/15 12:24:55
|
|
|