`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.