27

以前に作業していた人からコードを受け取りましたが、次のような行がたくさん含まれています

while(false==find && false == err && k<kmax)
if(true==refract(ep1,ep2,n1,RI_blood, RI_collagen))

そして好きなセリフは

if(false == (ret_s<0))

他のコードは非常によくできていて、きちんと文書化されていますが、これらの奇妙な条件を持つこれらの行は私をうんざりさせます.なぜそれらがそのように行われるのだろうか.

特にそれfalse==(ret_s<0)は完全に紛らわしく、彼らが何を望んでいるかを理解するには、その行を3回ほど読む必要があります.

これは一般的なプログラミング スタイルですか、その理由がわかりませんか、それともスタイルが悪いだけですか?

編集: これは if(object==NULL) vs if(NULL==object) に似ているとは思わない.

4

8 に答える 8

16

C ++での割り当てに対する安全なガードです。

C++ では、これを行うことは完全に合法です

if (foo = true) ....

この場合、シングル=は割り当てであり、の値を置き換えますfoo

これは正しくなく、コンパイラ エラーが発生します。

if (true = foo) ....
于 2013-06-03T20:20:46.477 に答える
6

偶発的な代入を防ぐため、定数とリテラルは左側に配置されることがよくあります。次のように入力することを検討してください。

if(foo == bar)

なので:

if(foo = bar)

2 番目は機能しているように見えるかもしれませんが、黙って clobberfooです。が定数の場合foo、このエラーは発生しなくなります。

于 2013-06-03T20:22:08.940 に答える
4

これは、変なバグを引き起こす可能=性のある等値演算子 ( ) の代わりに、代入演算子 ( ) を誤って入力するのを防ぐ自己防衛手法です。==左辺に定数値を配置するとコンパイル エラーが発生しますが、LHS に変数を配置するとサイレントにコンパイルされます。

于 2013-06-03T20:22:51.420 に答える
4

おそらく、元のプログラマーは、真または偽との明示的な比較は、if(condition)またはまたはif(!condition)そのようにコード化するよりも明確であると考えていました。ただし、この特定のスタイルはこれまで見たことがありません。

かなり主観的ですがwhile(!find && !err && k<kmax)、読みやすいと思います。

于 2013-06-03T20:24:27.257 に答える
1

このコードは、誤って比較の一部を除外することを避けるために、すべての条件ステートメントに比較演算子を含める必要があるというサイト標準があるショップ用に作成された可能性があります。(多分それはストレッチかもしれませんが、コードの残りの部分は非常に優れているとあなたは言いました。) それは、== の代わりに誤って = を使用することを避けるために定数を左に置く標準または習慣と相まって、ほとんどあなたが示したコード。ただし、より自然な「true」の代わりに「false」の使用については説明していません。おそらく、マシン レベルで 1 ではなく 0 と比較することで、マイクロ効率を得ようとする (複数のレベルで見当違いの) 試みです。

于 2013-06-03T23:05:02.937 に答える
-1

私のスタイルが悪いだけなので、

if(false == (ret_s<0))

C# では次の値に等しい

if(!(ret_s<0))
于 2013-06-03T20:23:40.090 に答える