C# While (i ++ ...) при увеличении?

Почему цикл While выполняет пост-инкрементное (или пост-декрементное) значение переменной сразу после проверки условия, а не после всего цикла?

Как в:

int x = 0;
while (x++ < 5)
Console.WriteLine(x);

Результат: 1 2 3 4 5, когда я считаю, что это должно быть 0 1 2 3 4. Кажется, он сразу же проверяет условие - истинно - inrements. Это нормальное поведение, потому что я недавно практиковал Plain C, и это совершенно другое.

Следует ли мне выбрать этот вариант для большей ясности?

while (x < 5)
Console.WriteLine(x);
++x; 

Вам действительно стоит использовать здесь фигурные скобки.

user47589 12.03.2018 16:32

Потому что так оно и работает. То же самое и в C.

Blorgbeard 12.03.2018 16:33

и, скорее, цикл for для такого четко определенного предела

LiefdeWen 12.03.2018 16:33

Вы увеличиваете x перед тем, как писать строку .. Чего вы ожидаете?

Brandon Miller 12.03.2018 16:33

если вы хотите протестировать и увеличить в конце, используйте do, while

pm100 12.03.2018 16:34

зарегистрируйте ошибку в вашем компиляторе c - это неправильно

pm100 12.03.2018 16:35

Пре- и пост-инкременты выполняются за одну операцию и не имеют ничего общего с циклом. В условии whilex++ возвращает текущее значение x (0 в первой итерации) и увеличивает значение на единицу. В следующей строке x был увеличен, поэтому вы видите вывод 1 на консоль.

Rufus L 12.03.2018 16:53

Ваш второй фрагмент кода представляет собой бесконечный цикл!

Chris Dunaway 12.03.2018 19:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
9
5 187
5

Ответы 5

Поведение правильное, и ANSI-C делает то же самое, если вы выполняете тот же код. x++ - это «одна команда», и приращение уже выполнено, как только вы перейдете к следующей команде. Разница между x++ и ++x в том, что последний возвращает «новое значение», а первый возвращает «старое значение» .
Пусть будет следующее:

int x = 0;
do
{
    Console.WriteLine(x++);
}
while (x < 5);

Но я также думаю, что в целом этот конкретный случай «сделай это 5 раз» лучше всего решить с помощью цикла for, как предлагает @ikdekker.

Если бы вы использовали цикл for, ваш ожидаемый ответ был бы правильным: в то время как это не имеет какой-либо особой внутренней работы.

for (x = 0; x < 5; x++)

это способ написать это с максимальной ясностью.

Ваш цикл эквивалентен:

int x = 0;
while (x < 5)
{
  x++;
  Console.WriteLine(x);
}

Поскольку приращение будет выполняться сразу после строки условия (x <5).

Итак, ваш второй цикл является правильным (вы должны добавить фигурные скобки), или, если вы действительно хотите, чтобы условие и приращение происходили одновременно, вы можете использовать цикл do.. while:

int x = 0;
do
{
  Console.WriteLine(x);
} while (++x < 5);

Как уже упоминалось, для этого можно использовать цикл for. Вы также можете объявить переменную x внутри цикла for.

for (var x = 0; x < 5; x++)
{
    Console.WriteLine(x);
}

вы используете x++ не в том месте

Console.WriteLine(x++)

вместо

while(x++ < 5)

отметьте как ответ, если это поможет

Другие вопросы по теме