`y = ++ y`, является ли этот стандарт совместимым? [который появляется в тесте Microsoft]

Я знаю, что это выглядит знакомо, но мне это кажется проблемой в тесте Microsoft, чтобы нанять стажеров. Мне кажется, что y=++y не соответствует стандарту, но я думаю, что было бы лучше быть уверенным (не уверен, что я лучше тех, кто пишет эти тесты в MS). Поэтому я прошу вашего совета. Считаете ли вы, что подобные выражения соответствуют стандарту и не приводят к undefined поведению?

#include <stdio.h>
int main(){
    int a = 10;
    int b = 10;
    a = ++a;    //What ???
    b = b++;    //What ???
    printf("%d %d\n",a,b);
    return 0;
}

gcc жалуется на это при использовании для компиляции с помощью -Wsequence-point. (В явном виде не указано, является ли это проблемой C или С++.)

Но предоставлено только четыре ответа:

a) 10 10
b) 11 10
c) 10 11
d) 11 11

Хотя один из них не ограничивается выбором только одного ответа (возможно, мне нужно выбрать все четыре?)

Хорошо, на мой взгляд, между самоинкрементами и присваиванием нет точки последовательности. Таким образом, это нарушает спецификацию. Не так ли?

Ответ 1

Они оба четко определены в соответствии с С++ 11. С++ 11 даже не имеет точек последовательности, поэтому предупреждение о последовательности, очевидно, устарело. Оператор присваивания накладывает последовательность на свои аргументы.

Edit:

В то время как каждый может согласиться с тем, что i = ++i теперь является корректным поведением, довольно нетривиально определить определенность i = i++. Интуитивно я должен описать это как четко определенное, но в Стандарте четко указано, что

i = i++ + 1;

- UB, и я не вижу здесь + 1.

Короче говоря, если бы вы хотели ответить на этот вопрос, вам нужно было бы быть экспертом по совершенно нетривиальным правилам секвенирования С++ 11, которые, как представляется, я не, но кажется, что ответ "Ничего из вышеперечисленного, потому что UB".

Ответ 2

Согласно стандарту С++ 03,
Оба из приведенных ниже инструкций приводят к undefined поведению:

a = ++a;
b = b++;

Как вы правильно сказали, g++ указывает ниже предупреждение:

предупреждение: операция на 'a может быть undefined [-Wsequence-point]

Заметим, что в случае UB ответ может быть любым, кроме (a), (b), (c), (d).
В идеале должна быть опция для "undefined поведения" в тестовом вопросе. Но часто человек, который подготавливает вопрос, просто компилируется в компиляторе XYZ и представляет его.

Ниже приведено связанное сообщение SO, объясняющее undefined Поведение и точки последовательности.

Ответ 3

a = ++ a; b = b ++;  Эти операции считаются undefined. Каждый компилятор может сделать по своему усмотрению. вывод зависит от компилятора, который эксперт задал вопрос.

Ответ 4

Я думаю, что это D), поскольку ++ a означает приращение a, а затем выполнить операцию, так что это будет как делать a = 11. b ++ означает выполнение операции, а затем увеличение, поэтому вы будете назначать b = 10, но затем b увеличивается, давая ему значение b = 11.

Хорошо для пуристов: это не означает ничего, а потом что-нибудь, но это поведение. Я тестировал его (используя визуальные С++ и g++), и мой ответ правильный: a = 11 и b = 11.