Просто случайное наблюдение, кажется, что на StackOverflow.com есть вопросы о том, "++ i == i ++". Этот вопрос задают постоянно, хотя, кажется, я видел, что его задавали около 6 или 7 раз за последние 2 месяца.
Мне просто интересно, почему разработчики C так заинтересованы в этом? Та же концепция / вопрос существует и для разработчиков на C # и Java, но я думаю, что видел только один вопрос, связанный с C #.
Это потому, что многие примеры используют ++ i? Это потому, что есть какая-то популярная книга или учебник? Это потому, что разработчики C просто любят втиснуть как можно больше в одну строку для «эффективности» / «производительности» и поэтому чаще сталкиваются с «странными» конструкциями, использующими оператор ++?
c
undefined-behavior
Майкл Стум
источник
источник
++i == i++
или, в более общем смысле, на разницу в значении между++i
иi++
?Ответы:
Я подозреваю, что, по крайней мере, отчасти это немного проще: даже сейчас мы видим много таких вопросов, начиная с начала учебного года, и они постепенно сужаются в течение года.
Таким образом, я думаю, что справедливо предположить, что довольно многие из них являются просто результатом уроков, в которых учитель говорит хотя бы немного об этом, но не очень хорошо объясняет свою точку зрения (так часто, как нет). потому что он на самом деле не понимает их сам). Особенно на основе людей, которые, кажется, задают эти вопросы, немногие основаны на реальном кодировании.
источник
Потому что программисты на С ДОЛЖНЫ понимать порядок операций. Разработчики C # не обязательно используют побитовые операторы (&, |, ~) или префиксные операторы, так как мы обычно больше беспокоимся о других вещах. Однако мы, разработчики C #, не понимаем, что мы должны знать, что делают операторы, которые мы используем ежедневно, и как их правильно использовать. Большинство из нас просто избегают мест, где это может быть проблемой.
Вне головы, каков результат этого фрагмента?
Я бы сказал, что многие опытные разработчики C # не имеют ни малейшего представления о том, что выводит консоль.
источник
if (myList[i++] == item)
. Умная. Я обнаружил, что искал источник исключения IndexOutOfRange ... Действительно, очень "умный".++
на поплавке, и должен сказать, что это не очень уместно. Люди делают это? (Я бы предпочел+= 1
)Я думаю, что это очевидно. В C #, для
int i
,i++ == ++i
всегда ложно , а++i == i++
это всегда верно, надежно, и все , кто заинтересован может найти это легко , просто обучение правилам C # (или на самом деле, просто запустив его).В C и C ++, с другой стороны, он близок к неопределенному, поскольку зависит от компилятора, среды выполнения, платформы и т. Д., Поэтому ответить на этот вопрос гораздо сложнее, поэтому многие задают его.
источник
Это популярный вопрос, потому что это вопрос с подвохом. Это не определено .
Ссылка выше ведет к часто задаваемым вопросам на домашней странице Bjarnes Stroustrup, где конкретно рассматривается этот вопрос, и объясняется, почему эта конструкция не определена. Что это говорит:
источник
Скорее всего, потому что в C действительно важно, пишете ли вы
i++
или++i
когда вы делаете арифметику с указателями. Там, увеличениеi
до или после операции может иметь решающее значение. Я бы привел вам пример, но последний раз, когда я писал C, было 10 лет назад ...В C # я никогда не сталкивался с ситуацией, которая заставила бы меня задуматься
i++
или++i
потому что AFAIK, для циклов for / while, это не имеет большого значения.источник
i++
и++i
, а в объединении их в одном выражении.Несколько лет назад я прочитал, что эти операторы считались опасными, поэтому я попытался найти больше информации об этом. Если бы в это время работал stackoverflow, я бы спросил об этом там.
Теперь это потому, что некоторые искривленные люди пишут такие циклы, как
Даже сейчас я не слишком уверен в том, что произойдет / должно произойти, но мне совершенно ясно, что несколько ++ [var] в одной строке вызывают проблемы.
источник
x = ++j;
хорошо определены в C. Вышеуказанное не определено, потому чтоj
изменяется дважды без промежуточных точек последовательности.Две причины
Правильная реализация ++ i состоит в том, чтобы увеличивать i, а затем возвращать его. Правильная реализация i ++ - сохранить текущее значение, увеличить i и вернуть сохраненное значение. Знание того, что они не реализованы как синонимы, важно.
Тогда возникает вопрос, когда компилятор применяет их при оценке выражения, такого как равенство.
Если сначала выполняется тест на равенство, то перед операциями до и после приращения вам придется писать другую логику, чем если бы сначала вычислялись левая часть (lhs) и правая часть (rhs), а затем равенство.
Это все о порядке операций, и это в свою очередь влияет на код, который вы пишете. И, что не удивительно, не все языки согласны.
Список базовых тестов позволяет разработчикам проверить, верны ли их предположения, а также соответствует ли фактическая реализация спецификации языка.
Это может оказать всевозможное влияние при работе с указателями, циклами или возвращаемыми значениями.
источник
++i
состоит в том, чтобы использовать значениеi+1
и в некоторый момент времени, возможно, до или после этого, но перед следующей точкой последовательности, увеличиватьi
.Я думаю, что это вещь культурного шока.
Как уже указывалось, поведение выражения в C или C ++ может быть неопределенным, поскольку порядок выполнения постинкрементов и т. Д. Строго не определен. Неопределенное поведение довольно распространено в C, и, конечно, многое из этого было импортировано в C ++.
Кто-то, кто занимался программированием на другом языке, кто-то, кто понял идею, что языки программирования должны быть точными, и что компьютеры должны делать то, что им говорят ... ну, это шок для обнаружить, что C намеренно расплывчат в некоторых вещах.
источник
++
и--
операторы не были основаны на PDP-11, которого не было, когда эти операторы были представлены на языке B предшественника C. См. Cm.bell-labs.com/who/dmr/chist.html , и поиск "автоинкремент".Возможно, просто разработчики на C чаще используют инкремент ++ - видя, что у C нет «foreach» или подобного оператора для перебора массивов. Ну и конечно же указатель арифметический, как уже упоминалось ранее!
источник
Разница между обеими частями: почта и предварительный код работают так, как эти две части кода должны функционировать на каждом языке. ЭТО НЕ ЯВЛЯЕТСЯ ЗАВИСИМЫМ ЯЗЫКОМ !!!
Это предварительное увеличение. Этот фрагмент кода сначала увеличит значение,
i
прежде чем он отправит значение в строку, где он используется.Это пост приращения. Этот фрагмент кода вернет значение
i
прежде, чем он увеличит значениеi
в строке, где он используется.В другом небольшом примере:
Этот код компилируется с результатами на кодовой панели.
Это связано с внутренней реализацией перегрузки оператора.
++i
увеличивает непосредственно значение (и, следовательно, немного быстрее)i++
сначала создается копия, которая возвращается в место, где это необходимо, а затем исходное значениеi
переменной увеличивается на единицу.Надеюсь, теперь это понятно.
источник
++i
не быстрее, иi++
не создает копию. Кроме того,++i
ведет себя немного по-другому в C, чем в C ++, не говоря уже о других языках.