5

したがって、C ++には演算子の優先順位があり、

int x = ++i + i++;

pre++とpost++は同じレベルであり、どちらが最初に計算されるかを判断する方法がないため、は未定義です。しかし、私が疑問に思っていたのは

int i = 1/2/3;

未定義です。私が尋ねる理由は、その(1/2)/3または1/(2/3)を見る方法が複数あるからです。未定義の動作だと思いますが、確認したいと思います。

4

5 に答える 5

17

C ++演算子の優先順位と結合法則を見ると、除算演算子が左から右への結合法則であることがわかります。つまり、これは次のように評価されます(1/2)/3

同じセルにある演算子(セルに複数の演算子の行がリストされている場合があります)は、指定された方向で同じ優先順位で評価されます。たとえば、式a = b =cはa=(b = c)として解析され、右から左への結合性のために(a = b)=cとして解析されません。

于 2012-07-02T15:43:03.143 に答える
5

最初のコードスニペットは、変数iがシーケンスポイント間で複数回変更されているため、未定義の動作です。

2番目のコードスニペットは定義された動作であり、次のものと同等です。

int i = (1 / 2) / 3;

演算子/は左から右への結合性を持っているため。

于 2012-07-02T15:43:50.697 に答える
5

あなたの例では、コンパイラは「1」、「2」、「3」を好きな順序で自由に評価し、左から右に分割を適用します。

i ++ +i++の例でも同じです。i ++を任意の順序で評価でき、そこに問題があります。

関数の優先順位が定義されていないのではなく、引数の評価の順序が定義されているということです。

于 2012-07-02T16:40:25.077 に答える
2

それは定義されており、左から右に進みます。

#include <iostream>

using namespace std;

int main (int argc, char *argv[]) {
    int i = 16/2/2/2;
    cout<<i<<endl;
    return 0;
}

1または16の代わりに「2」を出力します。

于 2012-07-02T15:45:11.587 に答える
0

整数のセットであるintを選択したため、未定義と言っている可能性があります。分数を含むdoubleまたはfloatを試してください。

于 2013-03-14T01:34:33.960 に答える