Когда происходит приращение до/после?
Редактируем здесь, чтобы внести ясность. Заголовок задает вопрос, но приведенный пример не идеален. Это был более общий вопрос, чем пример кода.
Компиляторы имеют точки последовательности, места, где вы можете быть уверены, что уравнения были вычислены и т. д. и никаких затяжных эффектов не произойдет: компиляция стабильна. Когда мне не удалось проверить исходный пример, я начал искать теорию и наткнулся на сообщения 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;
Я понимаю, что время вступления приращения в силу зависит от появления «точки последовательности», но я не знаю, создает ли сравнение такой перегиб.
@Jim Mack, 👍0
Обсуждение1 ответ
И ++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
- как отправить аргумент объектам ESP8266WebServer в функции
- Arduino + кодовые блоки C++
- Проблемы с Serial.read()
- GPS автономный робот
- Присвоение значения на Arduino
- Ведение журнала всех вызовов Serial.print на устройстве
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
почему бы вам просто не написать короткий скетч, который выводит значение
itemNum
и++itemNum
, затемitemNum
иitemNum++
, @jsotola@jsotola - У меня не было платформы для тестирования. Как я уже отмечал в другом месте, это скорее вопрос о том, что представляет собой «точка последовательности» - о том, *когда* происходит ++, чем о том, что такое ++., @Jim Mack