Когда происходит приращение до/после?

Редактируем здесь, чтобы внести ясность. Заголовок задает вопрос, но приведенный пример не идеален. Это был более общий вопрос, чем пример кода.

Компиляторы имеют точки последовательности, места, где вы можете быть уверены, что уравнения были вычислены и т. д. и никаких затяжных эффектов не произойдет: компиляция стабильна. Когда мне не удалось проверить исходный пример, я начал искать теорию и наткнулся на сообщения SE/SO, в которых обсуждались такие вопросы, как:

   int a = 1;
   int b = a++ - a++ + a++;

Какие, по вашему мнению, будут значения a и b после этого? Оказывается, это зависит от того, являются ли арифметические операторы точками последовательности. По-видимому, это не было хорошо реализовано в ранних версиях C, а в других языках (например, Java) результаты могут снова отличаться.

Теперь я понимаю, что такое выражение, как (item++ > max), не содержит точек последовательности — оператор > не запускает оценку, а операторы присваивания и некоторые арифметические операторы так и делают.

//===============================

Исходный вопрос:

Я прочитал здесь несколько вопросов относительно x++ и ++x, но не вижу этого конкретного случая. Я все еще здесь новичок в C.

Эти два фрагмента кода делают одно и то же?

  // предполагаем, что itemNum == maxItem при входе

if (++itemNum > maxItem) itemNum = 0;

if (itemNum++ > maxItem) itemNum = 0;

Я понимаю, что время вступления приращения в силу зависит от появления «точки последовательности», но я не знаю, создает ли сравнение такой перегиб.

, 👍0

Обсуждение

почему бы вам просто не написать короткий скетч, который выводит значение itemNum и ++itemNum, затем itemNum и itemNum++, @jsotola

@jsotola - У меня не было платформы для тестирования. Как я уже отмечал в другом месте, это скорее вопрос о том, что представляет собой «точка последовательности» - о том, *когда* происходит ++, чем о том, что такое ++., @Jim Mack


1 ответ


2

И ++x, и x++ увеличивают значение x. Разница заключается в том, оцениваете ли вы значение x в выражении (формуле) до или после его увеличения.

int x1 = 0;
int y1 = 0;

int x2 = x1++; //Пост-инкремент: перемещаем текущее значение x1 (0) в x2, ЗАТЕМ увеличиваем x1
int y2 = ++y1; //Предварительное приращение: приращение y1. Затем переместите НОВОЕ значение y1 (1) на y2.

В приведенном выше примере x2 будет 0, а y2 будет 1.

Та же логика применима и к вашему выражению if. Если вы используете предварительное приращение, ваш оператор if принимает решение о новом значении после его увеличения.

Если вы используете пост-инкремент, оператор if принимает решение на основе значения, до которого он был увеличен.

,

Я понимаю концепцию pre/post ++, но мне просто не было/не ясно, что представляет собой «точка последовательности», которая заставляет происходить приращение. Очевидно, это изменилось в разных версиях C., @Jim Mack

Мне не известны какие-либо различия в обработке операторов увеличения/уменьшения до и после в C. Откуда вы берете эту информацию?, @Duncan C

Здесь есть несколько обсуждений на эту тему. Вот один: https://stackoverflow.com/questions/4865599/post-increment-with-respect-to-sequence-points, @Jim Mack

@JimMack Но где описание того, чем они отличаются в разных версиях C?, @Duncan C

Посмотрите обсуждение https://stackoverflow.com/questions/4445706/ Речь идет о C++, а не C, но именно здесь я понял, @Jim Mack