1

このステートメントの理由:

int a = 7, b = 8, c = 0;
c = b > a? a > b? a++: b++: a++ ? b++:a--;
cout << c;

と等しくない:

int a = 7, b = 8, c = 0;
c = (b > a? (a > b? a++: b++): a++)? b++: a--;
cout << c;

と等しい :

int a = 7, b = 8, c = 0;
c = b > a? (a > b? a++: b++): (a++? b++: a--);
cout << c;

理由を教えてください。なんで ?

4

3 に答える 3

11

演算子の優先順位結合性

C++ の演算子の優先順位と結合規則の表

于 2011-02-07T14:22:13.400 に答える
2

違いを確認するには、複数行に配置するだけです。

c = b>a        // true
    ? a>b      // false
      ? a++
      : b++    // b is incremted = 9; c = 8 (post increment)
    : a++ 
      ? b++
      : a--;

と等しくない:

c = ( b>a     // true
    ? ( a>b   // false
      ? a++
      : b++ ) // b is incremted = 9
    : a++ )   // a = 7 (= 8 after post increment), thus true
    ? b++     // ... b is incremented = 10, c = 9 (post increment)
    : a--;

と等しい:

c = b>a         // true
    ? ( a>b     // false
      ? a++
      : b++ )   // b is incremnted = 9, c = 8 (post increment)
    : ( a++     
        ? b++   
        : a-- );
于 2011-02-07T14:30:45.343 に答える
0

また、これらの (恐ろしい) 式は、?: 演算子が使用されているという理由だけで決定論的であることに注意してください。この演算子は、C 言語で評価の順序が実際に指定されている数少ない演算子の 1 つです。そのような他の忌まわしきものを書いたi++ + ++i;場合、コンパイラは最初に左オペランドまたは右オペランドを評価できた可能性がありますが、どちらが選択されるかは C 言語では定義されていません。

経験則として、++ 演算子を他の演算子と共に式の一部として使用しないでください。独自の行で (またはループ反復子として) のみ使用してください。なぜなら、主流の信念に反して、実際には他のオペレーターと一緒に使用する理由は決してないからです.

于 2011-02-07T14:38:20.157 に答える