Каков приоритет оператора запятой внутри условного оператора в C ++?

Что тут происходит?

#include  using namespace std; int main(){ int x=0,y=0; true? ++x, ++y : --x, --y; cout << "x: " << x << endl; cout << "y: " << y << endl; //why does y=0 here? x=0,y=0; false ? ++x, ++y : --x, --y; cout << "x: " << x << endl; cout << "y: " << y << endl; } x: 1 y: 0 x: -1 y: -1 

Второй случай кажется прекрасным. Я ожидал бы, что x и y будут увеличиваться до 1 в первом случае, но только операнды левой руки будут увеличиваться.

    3 Solutions collect form web for “Каков приоритет оператора запятой внутри условного оператора в C ++?”

    Первый из них эквивалентен:

     (true ? (++x, ++y) : (--x)), --y; 

    Второй эквивалент:

     (false ? (++x, ++y) : (--x)), --y; 

    Таким образом, --y всегда выполняется. В первой строке приращения выполняются сначала, так что x = 1, y = 0 . Во второй строке сначала выполняется декремент x , так что x = -1, y = -1 .


    Как отмечено в комментарии (к другому ответу) Бармара :

    И в случае, если кто-то задается вопросом, почему запятая между ++x и ++y не имеет такого же эффекта, это потому, что (true? ++x) недействительно вообще. Таким образом, компилятор продолжает сканирование до тех пор, пока не найдет : но помимо этого он останавливается, когда он достигает оператора с более низким приоритетом [( , в этом примере) или в конце инструкции] .

    y равно нулю, потому что запятая имеет самый низкий приоритет среди всех операторов C ++ . Поскольку его приоритет ниже, чем у тернарного условного оператора, условные операторы анализируются как true? ++x, ++y : --x true? ++x, ++y : --x и false? ++x, ++y : --x false? ++x, ++y : --x . В обоих случаях оператор --y выполняется безоговорочно .

    EDIT Первая запятая отличается от того, что компилятор нашел ? , поэтому теперь ему нужно : завершить выражение «когда истинно» условного. Вот почему берутся как ++x и ++y .

    Прочтите стандарт

    §5.18 Comma operator [expr.comma]

    ¶1. Оператор запятой группирует слева направо.

     expression: assignment-expression expression , assignment-expression 

    Пара выражений, разделенных запятой, оценивается слева направо; левое выражение является выражением отбрасываемого значения (пункт 5). 83 Каждое вычисление значения и побочный эффект, связанные с левым выражением, секвенируются перед каждым вычислением значения и побочным эффектом, связанным с правильным выражением. Тип и значение результата – это тип и значение правильного операнда; результат имеет такую ​​же категорию значений, что и его правый операнд, и является битовым полем, если его правый операнд – это значение glvalue и бит-поле.

    ¶2 В контекстах, где запятая имеет особое значение, [Пример: в списках аргументов функций (5.2.2) и списках инициализаторов (8.5) -end пример] оператор запятой, как описано в разделе 5, может появляться только в круглых скобках , [ Пример:

     f(a, (t=3, t+2), c); 

    имеет три аргумента, второй из которых имеет значение 5. -end example]

    Давайте будем гением компьютера.