Нет, новый стандарт не определяет последовательность или порядка вычислений всех подвыражений.
Выражение a + b + c
грамматически сгруппировано как (a + b) + c
, но три подвыражения a
, b
и c
могут оцениваться в любом порядке, и оценки не упорядочены друг относительно друга.
Чтобы сделать это более конкретным, рассмотрим:
int main()
{
return printf("Hello") + printf("World") + printf("\n");
}
Что касается вашего кода: там нет никакой двусмысленности. Это одно выражение, выражение присваивания формы a = b
, где a
— lvalue var1
, а b
— подвыражение var2 = 30
. Тот факт, что вам интересно, заканчивается ли var1
20
или 30
, наводит меня на мысль, что вы не уверены в ассоциативности оператора (для =
). Это, однако, никогда не было двусмысленным и прекрасно определено во всех языковых вариантах, которые я могу придумать. Оператор присваивания связан справа, что приводит к подвыражениям a
и b
, которые я описал. Этот (чрезвычайно фундаментальный) аспект языка не претерпел изменений в C++11.
Если вы действительно хотите объединить две проблемы, вам следует рассмотреть следующее выражение:
var1 = 10;
(var1 = 20) = (var2 = var1);
Теперь конечное выражение также равно a = b
, но и a
, и b
являются нетривиальными подвыражениями, оценка которых не упорядочена.
person
Kerrek SB
schedule
25.10.2013
a = b
, гдеb
— этоvar2 = 30
и имеет значение30
, аa
— этоvar1
и является lvalue. Порядок не имеет ничего общего с результатом вычисления этого выражения. - person Kerrek SB   schedule 25.10.2013