68627

[code]

    if ( flg != false) 
    
[/code]

と

[code]

    if ( flg == true ) 
    
[/code]

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

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

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


CC BY-SA 4.0
2020-07-15T19:01:52.413
68626
2020-07-16T16:09:27.427
2020-07-16T00:52:04.303
3060
36023
question
プログラミング言語
if ( flg != false) と if ( flg == true ) で条件分岐させた場合の違いは？


こんにちは。

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

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

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

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

  * 変数が動的型付け(JS,PHP等)である言語の場合はflgの型と適用したい厳密性により _**===**_  
演算子を使う必要があります

  * Java等の言語の文字列の比較では **equalsメソッド** を使わないと結果がおかしくなります。これは通常の演算子では参照やポインタの直接の比較となるためです。

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


CC BY-SA 4.0
2020-07-15T20:20:10.873
68627
2020-07-15T20:25:53.660
2020-07-15T20:25:53.660
37777
37777
68626
answer


質問タグにはありませんが [c](/questions/tagged/c "'c' のタグが付いた質問を表示") /
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の場合は `if (flg)` 一択で、次点で
`if (flg != FALSE)` そして、絶対に使ってはいけないのが `if (flg == TRUE)` ですね。

[c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") の文法仕様上

  * 条件式 ( `a>b` 等) の結果は `false` または `true` ([c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の場合)
  * 条件式 ( `a>b` 等) の結果は `0` または `1` ([c](/questions/tagged/c "'c' のタグが付いた質問を表示") の場合)
  * [c](/questions/tagged/c "'c' のタグが付いた質問を表示") においては `#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;`
のようにもっと具体的な名前をつけなさいと言われています。たとえサンプルでも、もうちょっと名前付けを考えたほうがいいでしょう。サンプルであることを明示したいならメタ変数名を使うべきだったかもしれません。


CC BY-SA 4.0
2020-07-15T23:46:59.847
68629
2020-07-15T23:46:59.847
8589
68626
answer


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


CC BY-SA 4.0
2020-07-16T00:22:46.257
68630
2020-07-16T00:22:46.257
27481
68626
answer


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


CC BY-SA 4.0
2020-07-16T16:09:27.427
68652
2020-07-16T16:09:27.427
9811
68626
answer