Условное предшествование операторов тройной и прямое ассигнование

Я запутан относительно предшествования оператора прямого ассигнования и условного тройного оператора:

#include
int main(void)
{
    int j, k;

    j = k = 0;
    (1 ? j : k) = 1; // primero
    printf("%d %d\n", j, k);

    j = k = 0;
    1 ? j : k = 1; // segundo
    printf("%d %d\n", j, k);
    return 0;
}

Он надеялся, что вывод:

1 0
1 0

Но окажись:

1 0
0 0

И расписка это объявление компиляции:

main.cpp:20: warning: statement существуешь не effect

Что относительно линии, прокомментированной как секунда.

Ввиду того, что у оператора ассигнования есть меньше предшествование, чем условный тройной оператор, он ждал, что линии, прокомментированные, как первый и второй они были эквивалентными. Но последуй, что нет.

Я это попробовал с g ++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010

Этот вопрос - перевод оригинал на английском, который сделал я сам.

4
задан 23.05.2017, 15:39
1 ответ

Предшествование операторов в языках C/C ++ не определено таблицей или числами, а грамматикой. Здесь - грамматика для условного оператора проекта C ++ 0x (на английском) глава 5.16 Conditional operator [expr.cond]:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

Эта таблица предшествования как он был годы назад она следовательно правильна, когда используется оператор ассигнования рядом левша двух точек, но не использовав рядом право. Каков мотив для этой асимметрии не. Возможно, что он по историческим причинам: в C условный результат не был lvalue, а следовательно распределять что-то ему не имело никакого чувства и позволять, что было принято ассигнование без скобки, может показаться хорошей идеей в тот момент.
Теперь эта таблица уже исправлена и правильна во всех я женю их.

Этот ответ - перевод оригинал, на английском написанный Суммой

1
ответ дан 01.12.2019, 08:13