9

重複の可能性:
論理的な比較:左から右への評価は保証されていますか?

すべてのC関数の引数について、右端の引数が最初に実行/処理され、左に向かって進むと教えられてきました。右の部分が最初に実行され、左に向かって進みます。

これは&&や||などの条件に適用できますか???

C ++コードを記述している場合は、最初にNULL条件をチェックし、次にアクションを実行するかどうかをチェックします。例えば

 if( CommDevice != NULL)
   {
      if(CommDevice->isOpen == TRUE)
         { 
                //Do Something
         }

   }

これを変換できますかif((CommDevice != NULL) && (CommDevice->isOpen == TRUE) )

「コードは右から左に実行される」という恐怖が、CommDeviceNULLの場合はどうなるかを私に止めさせており、NULLのメンバーにアクセスしようとしています。例外が発生します。

4

5 に答える 5

10

私は、すべてのC関数が右から左に引数を取ることを教えられてきました。右の部分が最初に実行され、左に向かって進みます。

これは100%真実ではありません。引数評価の順序は指定されていません!

との順序は&&||シーケンスポイントを形成するために定義されます。最初に左側が評価され、短絡していない場合は右側が評価されます。

if((CommDevice != NULL) && (CommDevice->isOpen == TRUE) )

正解です。

于 2012-11-07T06:30:28.160 に答える
3

C Programming Languageブライアン・カーニハン&リッチー・デニス(Cの作者)による「」から:

  • 「&&または||で接続された式は左から右に評価され、真偽が判明するとすぐに評価が停止することが保証されています。」

私はかつて、Cでの評価ルールの順序を次のもの&&と混同していたことを指摘しておく必要があります。||

x = f() + g();

f()対の評価の順序はg()決定できないことに注意してください。

于 2012-11-07T06:34:57.560 に答える
0

&&右から左ではなく、左から右に評価します。したがって、コードは例外をスローしません。

于 2012-11-07T06:30:28.767 に答える
0

論理演算子に関する限り、短絡評価に触れています。

この条件がfalseを返す場合、 (左から右へ)NULLの次の条件は評価されないため、最初に左側のポインターをチェックするのが安全です。&&

この動作は、との基本的な論理原理のために許可されてい&&ます||

于 2012-11-07T06:32:19.530 に答える
0

関数の引数の評価の順序はですUnspecified。したがって、あなたが教えられたことは、言語標準に従っていません。

あなたのコードについて:

&&との評価の順序||が指定されており、これはLeft to right

そして、これはステートメントの短絡にも続きます&&。1番目がその場合false、残りの条件は実行されません。同様に||、1番目がその場合true、残りの条件は実行されません。

また&&、と||はシーケンスポイントです。

于 2012-11-07T06:44:10.487 に答える