20

テストコードは次のとおりです。

int main()
{
    int a = 3;
    int b = 4;
    a = a + b - (b = a); 

    cout << "a :" << a << " " << "b :" << b << "\n";    
    return 0;
}

これをコンパイルすると、次の警告が表示されます。

> $ g++ -Wall -o test test.cpp test.cpp: In function ‘int main()’:
> test.cpp:11:21: warning: operation on ‘b’ may be undefined
> [-Wsequence-point]

操作を未定義にできるのはなぜですか?

私の理解によれば、(b = a)()の優先順位が高いため、最初に部分式を評価する必要があります。したがって、b=aに設定します。次に、「+」と「-」の優先順位が同じであるため、式は左連想的に評価されます。したがって、a + b次に評価する必要があり、最後にの結果を(b = a)から差し引く必要がありますa + bここでは、シーケンスポイントルールに違反していることはわかりません。

4

4 に答える 4

20

評価される式とその副作用を完了することには違いがあります。

b = a括弧の優先順位が高いため、代入式は減算の前に評価されます。a評価の結果としての値を提供します。ただし、その値のへの書き込みはb、次のシーケンスポイント(この場合は完全な式の終わり)まで完了しない場合があります。bしたがって、減算は割り当ての前または後の値を取る可能性があるため、式全体の最終結果は未定義です。

于 2012-11-09T23:50:58.617 に答える
8

C ++では、算術式の部分式に時間的な順序はありません。

a = x + y;

x最初に評価されyますか?コンパイラーはどちらかを選択することも、まったく異なるものを選択することもできます。評価の順序は、演算子の優先順位と同じではありません。演算子の優先順位は厳密に定義されており、評価の順序は、プログラムにシーケンスポイントがある粒度に対してのみ定義されます。

x実際、一部のアーキテクチャでは、両方をy同時に評価するコードを発行することが可能です。たとえば、VLIWアーキテクチャです。

于 2012-11-09T23:50:30.583 に答える
-1

それを解決するには、それらを2つの異なるステートメントに分けます。

PS:人間が算術演算を実行する際に間違いを犯す可能性があることを忘れないでください。したがって、操作を異なるステートメントに分けて、操作をより明確にすることをお勧めします。お役に立てば幸いです。

int main() 
{
   int a = 3;
   int b = 4;

   /* Two different Statements*/
   b = a;

   /* or a = a + b - a */
   a = a + b - b; 

   cout<<"a :"<<a<<" "<<"b :"<<b<<"\n";    
   return 0;
}
于 2012-11-09T23:57:13.987 に答える
-1

a = b + a - a; と書かれているだけです

a = b + a - (b = a)------ >>(exp 1)

次の3つの結果は(exp 1)と同じです a = (b + a - (b = a)); a = ((b + a) - (b = a)); a = (b + a) - (b = a);

観測値+、-演算子は同じ優先順位を持ち、左から右への結合性もあります。したがって、「b + a」が最初に実行され、次に「a」値が「b」に割り当てられてから減算されます。

ここで、a=10およびb=20の場合に次のことを確認します。

a = (b = a) - b + a; =======> a = 10; b = 10 a = ((b = a) - b + a); =======> a = 10; b = 10

a = ((b = a) - (b + a));=======> a = -10; b = 10上記の式から、最も内側の括弧が最初に実行された場合でも、最初に結合法則が続き、次に優先順位が続くことは明らかです。

注:外側の括弧と内側の括弧の優先順位の混同を避けるために、次の式を検討してください a = (b + a - (b = a))=====>実際の結果=> a = 20、b = 10; a = 10、b=10でした。(結合性と比較した場合に優先順位がプライマリである場合)したがって、上記の例では、優先順位と比較した場合に結合性がプライマリであると言えます。

于 2016-09-07T05:11:25.230 に答える