したがって、C ++には演算子の優先順位があり、
int x = ++i + i++;
pre++とpost++は同じレベルであり、どちらが最初に計算されるかを判断する方法がないため、は未定義です。しかし、私が疑問に思っていたのは
int i = 1/2/3;
未定義です。私が尋ねる理由は、その(1/2)/3または1/(2/3)を見る方法が複数あるからです。未定義の動作だと思いますが、確認したいと思います。
したがって、C ++には演算子の優先順位があり、
int x = ++i + i++;
pre++とpost++は同じレベルであり、どちらが最初に計算されるかを判断する方法がないため、は未定義です。しかし、私が疑問に思っていたのは
int i = 1/2/3;
未定義です。私が尋ねる理由は、その(1/2)/3または1/(2/3)を見る方法が複数あるからです。未定義の動作だと思いますが、確認したいと思います。
C ++演算子の優先順位と結合法則を見ると、除算演算子が左から右への結合法則であることがわかります。つまり、これは次のように評価されます(1/2)/3
。
同じセルにある演算子(セルに複数の演算子の行がリストされている場合があります)は、指定された方向で同じ優先順位で評価されます。たとえば、式a = b =cはa=(b = c)として解析され、右から左への結合性のために(a = b)=cとして解析されません。
最初のコードスニペットは、変数i
がシーケンスポイント間で複数回変更されているため、未定義の動作です。
2番目のコードスニペットは定義された動作であり、次のものと同等です。
int i = (1 / 2) / 3;
演算子/
は左から右への結合性を持っているため。
あなたの例では、コンパイラは「1」、「2」、「3」を好きな順序で自由に評価し、左から右に分割を適用します。
i ++ +i++の例でも同じです。i ++を任意の順序で評価でき、そこに問題があります。
関数の優先順位が定義されていないのではなく、引数の評価の順序が定義されているということです。
それは定義されており、左から右に進みます。
#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」を出力します。
整数のセットであるintを選択したため、未定義と言っている可能性があります。分数を含むdoubleまたはfloatを試してください。