Условный оператор "?:" В C ++ - PullRequest
       2

Условный оператор "?:" В C ++

1 голос
/ 07 февраля 2011

Почему это утверждение:

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;

Пожалуйста, укажите мне причину.Почему?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Просто поместите его в несколько строк, чтобы увидеть различия:

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-- );
0 голосов
/ 07 февраля 2011

Также обратите внимание, что эти (ужасные) выражения являются детерминированными только , потому что используется оператор?:.Этот оператор является одним из очень немногих операторов в языке C, где фактически указан порядок вычисления .Если бы вы написали какую-то другую мерзость, такую ​​как i++ + ++i;, тогда компилятор мог бы сначала оценить левый операнд или правый операнд, который он выбирает, не определено в языке C.

Как правило, никогда не используйтеоператор ++ как часть выражения с другими операторами.Используйте его только в отдельной строке (или в качестве итератора цикла).Потому что, вопреки распространенному мнению, на самом деле нет причин использовать его вместе с другими операторами.

...