TransWikia.com

if ( flg != false) と if ( flg == true ) で条件分岐させた場合の違いは?

スタック・オーバーフロー Asked by Y S on September 1, 2021

if ( flg != false) 

if ( flg == true ) 

で条件分岐させた場合、その後の処理において何か違いがありますか?

個人的には "not equal ~" の方が分かりにくいけど、記法としてカッコいいのかなぁ
と、ぼんやり考えています。

そうではなく、具体的な違いをご存じでしたらどなたか教えてください。
よろしくお願いいたします。

4 Answers

こんにちは。

この場合は可読性を考慮して (flg == true)(flg) と措くのがよいでしょう。
flgが真である場合 ですね。

flgが偽でない場合 という表現は、
それまでの文脈として自然な場合は、後者を選択することもあるかもしれませんが、
あまりないと思います。人が読むものなので文章として自然かというのは大切です。

少なくとも記法としてカッコいいかというのはあまり気にしません、
というか見た目より複雑なので気にする心の余裕が私にはありません:-)

たとえば、以下のケースでは記法により、条件の判断内容が変化してきます。

  • 変数が動的型付け(JS,PHP等)である言語の場合はflgの型と適用したい厳密性により ===
    演算子を使う必要があります
  • Java等の言語の文字列の比較では equalsメソッド を使わないと結果がおかしくなります。これは通常の演算子では参照やポインタの直接の比較となるためです。

具体的な違いという点で言えば、コンパイル言語では生成されるバイトコードに変化が起こります。
ただしこれはまあ、あまり気にする必要はないんではないでしょうか。

Correct answer by Kouki.W on September 1, 2021

言語を指定していませんが、flgは真か偽かないという想定ですかね
SQLのNULLのように、真とも偽とも異なる条件式も考えられるのですが

Answered by user15092 on September 1, 2021

言語によっては、false は0、trueは1、となってるものもあります
その時、flg に2が入っていたとき、そのそれぞれでどういう判断になるか考えてみましょう

Answered by y_waiwai on September 1, 2021

質問タグにはありませんが / の場合は if (flg) 一択で、次点で if (flg != FALSE) そして、絶対に使ってはいけないのが if (flg == TRUE) ですね。

/ の文法仕様上

  • 条件式 ( a>b 等) の結果は false または true ( の場合)
  • 条件式 ( a>b 等) の結果は 0 または 1 ( の場合)
  • においては #define FALSE 0 および #define TRUE 1 が多い
  • if 等の条件判定においては 0 false FALSE は俗にいう else
  • if 等の条件判定においては 0 false FALSE 以外は俗にいう then 側(ここが超重要)

となっています。ということは int flg; があるとき if (flg == TRUE) と書いてしまうと

  • これは if (flg == 1) と置換される
  • if (flg) であれば flg の値が 2 でも -42 でも then
  • if (flg == 1) であれば flg の値が 1 以外は else

となってしまい挙動が変わってしまいます。余計なことを書いたせいで挙動が変わる=バグを引き込んでしまいます。


もし仮に bool flg; であったとして if (flg == true) と書かなきゃ気が済まない人がいるなら

  • if ((flg == true) == true) と書かないのはなぜ?
  • if (((flg == true) == true) == true) と書かないのはなぜ?
  • if ((((flg == true) == true) == true) == true) 以下略

と話が進んでいくわけで、やっぱり「一番簡単な形式が一番理解しやすい」のであろうと思われます。


んで今どきは flg のような

  • 変な省略形は使ってはいけないので flag のほうがまだまし
  • でも、読んでいてどんな意味かが判別できない変数名はダメ

ということになっている、すなわち bool input_fulfilled; のようにもっと具体的な名前をつけなさいと言われています。たとえサンプルでも、もうちょっと名前付けを考えたほうがいいでしょう。サンプルであることを明示したいならメタ変数名を使うべきだったかもしれません。

Answered by 774RR on September 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP