1

敬礼..

異常な問題があります。 このMSDNライブラリの表では、 ()の優先順位が++(プリインクリメント)よりも高いことがわかります。しかし、このコードを実行すると、++(prefex)の優先順位が高くなっているようです。

int main()
{
    int a=3,b=2,x;
    x=++a + (a-b);
    cout<<"x= "<<x;

    return 0;
}

答えは:

x = 6

これはprefex++でのみ発生し、post-incrementで期待どおりに機能します。

何か理由はありますか?よろしく..

int main()
{
    int a=3,b=2,x;
    x=a++ + (a-b);
    cout<<"x= "<<x;

    return 0;
}

x = 4

(私はMicrosoft Visual C ++ 2010 Expressを使用しています)

4

8 に答える 8

8

いつものように、これは未定義の動作です。にはシーケンスポイントがないため、どのポイントで更新+されるかは定義されていません。これは優先順位の問題ではありません。++a

于 2011-02-04T12:29:29.607 に答える
5

ここには2つの誤解があります。

1つ目:表では、()は、グループ化に使用される括弧ではなく、関数呼び出しを示しています。グループ化に使用される括弧は、特定の優先順位を持つ演算子ではなく、演算子の優先順位によって与えられる解釈とは異なる解釈を強制するための手段です。したがって、括弧内にグループ化されているものはすべて、演算子の優先順位に関係なく、1つの単位として扱われます。

2番目:演算子の優先順位は、演算子が構文解析で取る優先順位を指します。それ以外の場合はあいまいな構文です。副作用の時間的順序については言及していません。したがって、prefix ++は式が評価される前に常に値を増やし、posfix ++は式が評価された後、構文演算子の優先順位に関係なく常に値を増やします。

于 2011-02-04T12:36:25.757 に答える
4

これは、またはであるかx=a++ + (a-b);どうかに関係なく、未定義の動作です。++aa++

operator+理由は次のとおりです。2つの引数で呼び出しています:a++(a-b)。ただし、2つの引数のどちらが最初に評価されるかは未定義です。


編集: -私はあなたがここで問題を理解していないのを見るので、私はいくつかのより多くの情報を追加します:

operator++(接尾辞または接頭辞など)、変数の値を変更するため、この演算子はより特別なものになりますoperator+operator-たとえば、、など。したがって、の値++aa++変更する場合はa、この後にシーケンスポイントを設定してから、a再度使用する必要があります。 。operator+はシーケンスポイントではないので、あなたが呼んだようなものですoperator+( ++a, (a-b) );。標準では、パラメータの評価の順序については何も述べられていないため、これにより未定義の動作が発生します。

より良い?

于 2011-02-04T12:29:42.540 に答える
2

優先順位は評価の順序を決定しません。優先順位は、演算子がオペランドにバインドする方法を指定します。演算子が評価される順序ではありません。

優先順位テーブルは文法から派生したものであり、それに代わるものではありません。

また、JScript優先順位テーブルが必ずしもC++コードに関係していると想定するべきではありません。

于 2011-02-04T12:31:36.230 に答える
2

これは未定義の動作を引き起こしています。avia pre-incrementまたはpost-incrementの変更と、括弧で囲まれた式での使用との間にシーケンスポイントはありません。これは実際には演算子の優先順位とは何の関係もありません。より簡単な例を考えてみましょう。

int a = 1;
int b = (a=2) + a;

の価値はどうあるべきbですか?コンパイラは、の左側と右側+を任意の順序で評価できます。これは、式の変数の1つを変更して、それを指定せずに再度参照する場合を除いて、一般に両方の順序で同じ答えが得られるためです。介在するシーケンスポイント。これは、私が言ったように、未定義の動作であり、1つのコンパイラが4、別の3を与える可能性があり、3分の1がコンピュータに火をつける可能性があります。

于 2011-02-04T12:35:01.070 に答える
2

私はあなたにリンクを与えるだけです:

シーケンスポイント

PrasoonSauravによるStackOverflow.comでの説明

于 2011-02-04T13:39:28.177 に答える
0

数式でa++のようなものを使用する場合は常に、「a」の値のコピーが計算に使用されます。「++」は他の操作の後でのみ機能するため、数式は更新されません。しかし、私はこれについて間違っているかもしれません。

したがって、x = ++ a + bがあり、a=1およびb=2の場合、x = 1 + 2のようになり、x = a ++ + bの場合、値に対してx = 2+2が得られます。代用。

于 2011-02-04T14:15:13.050 に答える
0

優先順位の問題はありません。

あなたが質問を解決するならば、私たちが=オペレーターを持っているときはいつでもそれは「右から左」に解決されるでしょう。右側の式が解かれ、変数にansが割り当てられることを意味しますx。右側の式を解く際に+、「左から右」のアプローチを使用して解く演算子があります。したがって++a、最初に解決され、次にルールブラケットに従って解決されます。したがって、++a生成され4(a-b)与えられる2ので、最終的な追加によって結果が得られ6ます。

于 2016-02-03T08:13:50.890 に答える