Как увеличить счетчик для цикла while внутри цикла?

У меня такое чувство, что я буду чувствовать себя здесь очень глупо, но я только изучаю использование ++ и -- для увеличения и уменьшения переменных для циклов while, и мне было интересно, почему этот фрагмент кода работает, а почему это не работает?

Плохой код:

int ctr = 0;
while (ctr < 10)
  printf("%d",ctr);
  ctr=ctr+1;

Плохой код бесконечно выводит нули.

Рабочий код:

int ctr=0;
while (ctr++ < 10)
    printf("%d",ctr);

Идея состоит в том, чтобы вывод был 012345678910, но даже в рабочем коде он начинается с 1 и доходит до 10, а не начинается с 0. Несмотря на то, что начальное значение ctr равно 0.


person King Sutter    schedule 02.02.2017    source источник
comment
C не заботятся о ваших пробелах и ручном отступе. Вам нужно немного {}.   -  person Cornstalks    schedule 02.02.2017
comment
C — это не Python. Отступ не имеет значения в C — по крайней мере, не для компилятора, но люди, пытающиеся прочитать ваш код, заботятся об этом.   -  person Jonathan Leffler    schedule 02.02.2017
comment
Просто чтобы добавить к тому, что сказал @JonathanLeffler, компилятор все равно прочитает и переведет ваш код, просто люди откажутся от вашего кода.   -  person Sourav Ghosh    schedule 02.02.2017
comment
В вашем плохом коде отсутствуют фигурные скобки: int ctr = 0; в то время как (ctr ‹ 10){ printf(%d,ctr); ctr=ctr+1;} Теперь напечатайте satement, и оператор приращения ctr будет находиться в рамках цикла while, и вы получите правильное значение ctr, т.е. от 0 до 9. Ваш рабочий код: int ctr=0; while (ctr++ ‹ 10) { printf(%d,ctr);} здесь вы получаете вывод для ctr от 1 до 9, потому что ctr++ увеличивает ctr до ctr+1, т.е. 0+1 = 1, а затем печать. если вы хотите, чтобы он печатался, начиная с 0 до 9, используйте первый подход, просто не забудьте добавить фигурную скобку, чтобы определить область действия while   -  person Sweekritee Singh    schedule 02.02.2017


Ответы (3)


В первом случае

while (ctr < 10)
  printf("%d",ctr);
  ctr=ctr+1;

тело цикла while считается только оператором printf(). ctr=ctr+1; не является частью тела цикла. Таким образом, у вас есть неизменная переменная в проверке условия цикла, что делает его бесконечным циклом.

Вам нужно заключить оба оператора в область блока, используя {}, чтобы оба оператора стали частью тела цикла. Что-то вроде

while (ctr < 10) {
  printf("%d",ctr);
  ctr=ctr+1;
}

Сделаю.


Во втором случае

int ctr=0;
while (ctr++ < 10)
    printf("%d",ctr);

ctr уже увеличивается как побочный эффект постфиксного оператора приращения в выражении проверки условия while. Таким образом, при печати значения печатается уже увеличенное значение.

person Sourav Ghosh    schedule 02.02.2017
comment
@KeineLust Верно, спасибо за указание - person Sourav Ghosh; 02.02.2017

Это действительно очень просто.

int ctr = 0;
while (ctr < 10)
  printf("%d",ctr);
  ctr=ctr+1;

В этом первом фрагменте кода, несмотря на отступ, ваш while включает только printf("%d",ctr);, потому что нет блока, делающего ctr=ctr+1; принадлежащим while.

Можно было бы написать:

int ctr = 0;
while (ctr < 10)
  printf("%d",ctr);
ctr=ctr+1;     // This is not in the loop, even with the previous indentation.

В этом цикле нет увеличения до ctr, и тогда он будет работать вечно, печатая нули.

В этом втором фрагменте кода

int ctr=0;
while (ctr++ < 10)
    printf("%d",ctr);

вы увеличиваете ctr каждый проход, и он будет работать нормально.

Если вы хотите, чтобы первый цикл работал, напишите его так:

int ctr = 0;
while (ctr < 10) {
  printf("%d",ctr);
  ctr=ctr+1;
}

Теперь ctr=ctr+1; действительно находится внутри цикла while.

person Ed de Almeida    schedule 02.02.2017

int ctr = 0;
while (ctr++ <= 10)
{ 
    printf("%d",ctr-1);
}

Выход будет 012345678910.

person Amit Prajapati    schedule 02.02.2017
comment
Выход? Где вы что-то печатаете в этом коде? - person Ed de Almeida; 02.02.2017
comment
var test недействителен C. Вы ничего не печатали? - person Jonathan Leffler; 02.02.2017
comment
Отредактированный код не ниже C. Однако нетрадиционно (и необязательно) использовать ctr - 1 при печати. Вы можете применить ++ в вызове к printf() — как в printf("%d", ctr++); — и опустить его в условии while. Вывод включает в себя начальный ноль, как и требовалось, но образец вывода изначально не включал его. Хорошие ответы на SO, как правило, содержат больше объяснений того, почему исправление подходит и почему оригинал был сломан. - person Jonathan Leffler; 02.02.2017