Отличается ли ассоциативность и приоритет операторов в C и C++? Если да, то почему?

Недавно я наткнулся на этот код, который я предполагал понять и не стал запускать. Мой ответ (который я предположил в своей голове) был подтвержден книгой Let Us C. Позже, когда я попытался запустить его на C, к моему удивлению, результат был полностью контрастным. C++ дает ожидаемый результат.

C++ :

int a=1;
cout<<a<<a++<<++a;

Вывод :

113

C :

int a=1;
printf("\n%d %d %d",a,a++,++a); 

Вывод:

3 2 3

Я ожидал, что это будет то же самое, что и вывод, созданный C++.

У меня нет четкого представления о приоритете и ассоциативности оператора. Но этот вывод кажется совершенно неожиданным.

Я использую Atom в качестве редактора и компилятор C/C++ GCC.


person 0_0perplexed    schedule 13.06.2020    source источник
comment
KamilCuk Но мой вопрос: почему эти два языка программирования ведут себя по-разному?   -  person 0_0perplexed    schedule 13.06.2020
comment
two programming languages C это не C++. Это отдельные языки программирования. are behaving Эти конструкции имеют неопределенное поведение. Оба компилятора должны порождать демонов. (и в позднем С++ это допустимо, потому что поведение было изменено с неопределенного на неопределенное).   -  person KamilCuk    schedule 13.06.2020
comment
В C это просто неопределенное поведение. В C++ это может быть допустимо. Поэтому вам следует удалить все, что связано с C, и просто спросить, разрешено ли это в C++. Что касается того, почему они ведут себя по-разному, это потому, что это разные языки с разными правилами.   -  person user3386109    schedule 13.06.2020
comment
Это неопределенное поведение. Это означает, что в каждом случае результат непредсказуем, поэтому спорно пытаться объяснить, почему они разные.   -  person kaylum    schedule 13.06.2020
comment
А тот факт, что C++ является надмножеством C, следует игнорировать?   -  person 0_0perplexed    schedule 13.06.2020
comment
Да, это следует игнорировать. Это разные языки, и именно так вы должны относиться к ним.   -  person kaylum    schedule 13.06.2020
comment
Это не строго надмножество C. Это производный от C язык, но это не C. Написание допустимого кода, который правильно компилируется и работает на обоих языках, не является тривиальной задачей. То, что вы делаете, использует неопределенное поведение.   -  person jwdonahue    schedule 13.06.2020
comment
как я узнаю, когда он не определен, а когда нет? Прочтите спецификацию языка. Найдите стандарт C и стандарт C++, выберите соответствующий год (годы) для ваших компиляторов и внимательно прочитайте их.   -  person jwdonahue    schedule 13.06.2020
comment
Это не проблема между C и C++. Короткий пример показывает, что это в 1 единице компиляции на C++: godbolt.org/z/HTLM2Y   -  person Robert Andrzejuk    schedule 13.06.2020
comment
Чтобы выражение оценивалось предсказуемым образом, в C++17 были улучшены правила порядка вычисления: en.cppreference.com/w/cpp/language/eval_order   -  person Robert Andrzejuk    schedule 13.06.2020
comment
Re И следует игнорировать тот факт, что C++ является надмножеством C?, C++ не является надмножеством C.   -  person ikegami    schedule 13.06.2020
comment
C++ не является надмножеством C. C имеет массивы переменной длины. С++ нет. Это не единственная функция, которая есть в C и которой нет в C++. Вот неполный список функций C, которых нет в C++ stackoverflow.com/questions/3879636/ Некоторые из них будут реализованы на C++20   -  person Thomas Sablik    schedule 13.06.2020