0
if (false == x) { ...}

とは対照的に:

if (!x) { ... }

if (false == f1()) { ...}

とは対照的に:

if (!f1()) { ... }

if(false == ... バージョンの方が読みやすいと思います。同意しますか、それとも提案できる別のトリックがありますか?それは同じくらい速くなりますか?ありがとう。

これが私が !x を好まない理由です:

if (25 == a->function1(12345, 6789) &&
    45 == b->function1(12345, 6789) &&
    !c->someOtherFunction(123)) { ... }

以下はより良いようです:

if (25 == a->function1(12345, 6789) &&
    45 == b->function1(12345, 6789) &&
    false == c->someOtherFunction(123)) { ... }
4

6 に答える 6

7

if(false == ...バージョンの方が読みやすいと思います。同意しますか、それとも提案できる別のトリックがありますか?

あなたはそれを間違っています。

false == xブール値を返します。これは明らかにtrue!と比較する必要があります。

if (true == (false == x)) { ...}方が良いだろう。しかし、これもブール値を返すので、念のため、コードを読みやすくするために、次のように実行することをお勧めします。

if (true == (true == (false == x))) { ...}。等々。ブール値とブール値の比較を開始したら、どこで停止しますか?結果は常に別のブール値になります。一貫性を保つには、それをブール値と比較する必要があります。

または、作業している言語を理解し、必要if (!x) { ...}なものを正確に表現するを使用する方法を学ぶこともできます。

どちらが本当に読みやすいと思いますか?

  • if (false == x) { ...}「falseがxに等しいことがtrueの場合」に変換されます。
  • if (!x) { ...}「xが真でない場合」に変換されます。

正直に、真剣に、最初の形式が「より読みやすい」と本当に言うことができますか?文章でそれを言うことはありますか?「falseがxに等しいことがtrueの場合」?

これは読みやすくはなく、コードを読んでいるプログラマーに「ステートメントかブール値かわからない」と叫ぶだけです。

于 2009-12-16T01:16:59.653 に答える
7

個人的にはフォームif (!x) { ... }が最も読みやすいと思いますが、最近ではすべて同じコードになります。

編集:あなたの例では、次のことを行います:

if (  a->function1(12345, 6789) == 25 &&
      b->function1(12345, 6789) == 45 &&
    !(c->someOtherFunction(123))) { ... }

しかし、それは本当に個人的な好みの問題です。あなたにとって最も読みやすいことをしてください。違いはありません。

于 2009-12-16T00:54:07.367 に答える
4

C++ では、右側の演算子の代替として、左側に次のキーワードが予約されています。

and  and_eq  bitand    &&  &=  &
or   or_eq   bitor     ||  |=  |
     xor_eq  xor           ^=  ^
not  not_eq  compl     !   !=  ~

!迷子が気になる方は、notより目立ちます。

if (    a->function1(12345, 6789) == 25 and
        b->function1(12345, 6789) == 45 and
        not c->someOtherFunction(123)) {
    ...
}
于 2009-12-16T01:49:21.997 に答える
3

優れたコンパイラは、両方のコードブロックに対して同じコードを生成する必要があります。

false == f1()ただし、 vs 。について心配する代わりに!f1()、この例では短絡評価についてもっと心配する必要があります。

if (25 == a->function1(12345, 6789) &&
    45 == b->function1(12345, 6789) &&
    !c->someOtherFunction(123)) { ... }

b->function1()特定のコンパイラは、の実行をスキップするコードを生成します。呼び出しが25とは異なるものに評価されたc->someOtherFunction()場合、その理由は、コンパイラはその時点でステートメント全体の結果をすでに知っているため、適切な場所にジャンプできます。 。a->function1()if ()

スキップされた関数のいずれかによって変更されている状態にコードが依存している場合、厄介な驚きが生じる可能性があります。

于 2009-12-16T01:09:53.033 に答える
2

これは時期尚早の最適化の場合です(最適化が時期尚早なのはいつですか?)。ただし、コンパイラは同じコードを生成します(MSVC 2008デバッグモード)。

if (!bVal)
    bVal = true;

if (bVal == false)
    bVal = true;

//translates to

; 70   :         if (!bVal)

cmp BYTE PTR $T5793[ebp], 0
jne SHORT $LN9@wmain
push    OFFSET $LN10@wmain
call    __RTC_UninitUse
add esp, 4
$LN9@wmain:
movzx   eax, BYTE PTR _bVal$[ebp]
test    eax, eax
jne SHORT $LN2@wmain

; 71   :             bVal = true;

mov BYTE PTR $T5793[ebp], 1
mov BYTE PTR _bVal$[ebp], 1
$LN2@wmain:

; 72   :         
; 73   :         if (bVal == false)

cmp BYTE PTR $T5793[ebp], 0
jne SHORT $LN11@wmain
push    OFFSET $LN10@wmain
call    __RTC_UninitUse
add esp, 4
$LN11@wmain:
movzx   eax, BYTE PTR _bVal$[ebp]
test    eax, eax
jne SHORT $LN1@wmain

; 74   :             bVal = true;

mov BYTE PTR $T5793[ebp], 1
mov BYTE PTR _bVal$[ebp], 1
于 2009-12-16T01:11:54.997 に答える
1

プロファイリングを行って、その状態がホット スポットであると評価したことはありますか? そうでない場合は、コーディング標準が必要とすることは何でもしてください。

とにかく、両方とも同じコードにコンパイルする必要があります。どちらの場合も、コンパイラによって生成されたアセンブリ コードを調べることで確認できます。

于 2009-12-16T00:57:01.560 に答える