Как обосновать оператор приращения C postfix с таблицей приоритетов? - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю с таблицей приоритетов операторов C, чтобы лучше понять приоритет операторов C. У меня возникли проблемы с пониманием результатов следующего кода.

int a, b;
a = 1;
b = a++;   // does not seem to follow C operator precedence

Использование таблицы приоритетов операторов C, Я не могу объяснить, почему с оператором postfix ++ сначала оценивается присвоение, а затем приращение.

Оператор приращения postfix (++) имеет наивысший приоритет в C и оператор присваивания (=) имеет самый низкий приоритет.Таким образом, в приведенном выше коде сначала должен быть выполнен постфикс ++, а затем присвоение =.Таким образом, обе переменные a и b должны равняться 2, но они не имеют значения.

Почему приоритет оператора C, похоже, не работает с этим кодом?

Когдавысший приоритет постфикса ++ показывает себя?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Приоритет происходит при разборе .Это означает, что ++ относится к a, а не к b = a.

Но ++ означает после приращения, поэтому выполняется после aоценивается для присвоения b

Если вы хотите, чтобы оба приняли значение 2, выполните предварительное увеличение:

b = ++a;
0 голосов
/ 06 февраля 2019

Приоритет только определяет, какие операторы группируются с какими операндами во время синтаксического анализа.Он не контролирует порядок оценки.++ имеет более высокий приоритет, чем =, только означает, что b = a++ анализируется как b = (a++), а не (b = a)++.

Оператор ++ (одинарная и постфиксная формы) имеет результат и побочный эффект .В выражении b = a++ результат из a++ является текущим значением a - это то, что присваивается b. побочный эффект из a++ заключается в добавлении 1 к a.

Порядок, в котором происходит присвоение b и обновление до a, является неопределенным .Наиболее простым является

b <- a
a <- a + 1

, но также допускается следующее:

tmp <- a
a <- a + 1
b <- tmp

Результатом ++a является текущее значение a плюс 1 и побочный эффектэто добавить 1 к a. Не предполагайте , что в выражении, подобном b = ++a, a обновляется до b.Опять же, порядок оценки может быть примерно таким:

b <- a + 1
a <- a + 1

Фактический порядок оценки зависит от вашего компилятора, настроек оптимизации и даже окружающего кода.

Единственные операторы, которые вызывают вычисление выражений слева направо, - это операторы &&, ||, ?: и запятая.

0 голосов
/ 06 февраля 2019

Это не имеет ничего общего с приоритетом.Вопрос в том, как работает оператор postfix ++.

Оператор postfix ++ оценивает значение current своего операнда, и имеют сторонуэффект увеличения своего операнда.В отличие от префикса ++ оператор оценивается в увеличенное значение своего операнда.

int a, b;
a = 1;
b = a++;   // b is 1, a is 2
b = ++a;   // b is 3, a is 3

Такое поведение оператора постфикса ++ описано в разделе 6.5.2.4p2 C стандарт :

Результатом оператора постфикса ++ является значение операнда.В качестве побочного эффекта значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа). См. Обсуждение аддитивных операторов и составного присваивания для получения информации об ограничениях, типах ипреобразования и влияние операций на указатели.Вычисление значения результата секвенируется перед побочным эффектом обновления сохраненного значения операнда.Что касается вызова функции с неопределенной последовательностью, операция постфикса ++ является единственной оценкой.Постфикс ++ для объекта с атомарным типом - это операция чтения-изменения-записи с семантикой порядка памяти memory_order_seq_cst.

А оператор префикса ++ описан в разделе 6.5.3.1p2:

Значение операнда оператора префикса ++ увеличивается. Результатом является новое значение операнда после приращения. Выражение ++E эквивалентно (E+=1).См. Обсуждение аддитивных операторов и составного присваивания для получения информации об ограничениях, типах, побочных эффектах и ​​преобразованиях, а также о влиянии операций на указатели.

...