Почему цикл 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;
Вам действительно стоит использовать здесь фигурные скобки.
Потому что так оно и работает. То же самое и в C.
и, скорее, цикл for для такого четко определенного предела
Вы увеличиваете x перед тем, как писать строку .. Чего вы ожидаете?
если вы хотите протестировать и увеличить в конце, используйте do, while
зарегистрируйте ошибку в вашем компиляторе c - это неправильно
Пре- и пост-инкременты выполняются за одну операцию и не имеют ничего общего с циклом. В условии whilex++ возвращает текущее значение x (0 в первой итерации) и увеличивает значение на единицу. В следующей строке x был увеличен, поэтому вы видите вывод 1 на консоль.
Ваш второй фрагмент кода представляет собой бесконечный цикл!





Поведение правильное, и 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)
отметьте как ответ, если это поможет