2014-08-27 5 views
5

Здесь очень простая программа C:Сообщение Increment в то время как цикл в C

int main() 
{ 
    int i = 0; 
    while(i++ < 10) 
     printf("%d\n", i); 

    return 0; 
} 

Результат:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Почему 0 не первый номер для печати? И если я заменю i++ с ++i я получаю это:

1 
2 
3 
4 
5 
6 
7 
8 
9 

Для обоих i++ и ++i первый номер 1.
Я ожидал увидеть 0 для приращения постов во время цикла while().
Спасибо.

+1

i ++ увеличивает время выполнения, конечно, это одно. – BernardoLima

+0

Независимо от используемого оператора, вы печатаете 'i' ** после **, он был изменен, так как вы можете видеть' 0' !? – StoryTeller

+1

'while (i ++ <10)/* i здесь увеличивается здесь */printf ("% d \ n ", i);' – HolyBlackCat

ответ

4

i++++i) выполняются как часть оценки в while выражении, которое происходит до того печати. Это значит, что он всегда будет печатать 1.

Разница между вариантами i++ и ++i заключается в том, что приращение происходит внутри самого выражения, и это влияет на окончательное значение, напечатанное. Эквивалент псевдо-код для каждого является:

while(i++ < 10)   while i < 10: 
           i = i + 1 
    printf("%d\n", i);   print i 
          i = i + 1 

и:

      i = i + 1 
while(++i < 10)   while i < 10: 
    printf("%d\n", i);   print i 
           i = i + 1 

Скажем i встает 9. С i++ < 10 он использует 9 < 10 для выражения while, затем приращений i до 10 перед печатью. Таким образом, проверка использует 9 затем печатает 10.

С ++i < 10, он сначала с шагом iзатем использует 10 < 10 для выражения while. Таким образом, проверка использует 10 и не распечатайте что-нибудь, потому что из-за этой проверки вышел цикл.

+0

Отличный ответ (и вопрос) на потенциально мимолетную материю, которая может остаться незамеченной многими. +1 –

1

i++ является пост-инкремент и ++i является предварительно приращение. Пост-приращение означает, что предыдущее значение возвращается после приращения объекта. Предварительное приращение означает, что объект увеличивается, а затем возвращается. В любом случае объект увеличивается, когда его выражение оценивается, и поэтому вы не получаете 0 в качестве первого вывода.

0

Вы увеличиваете i после проверки и перед печатью. Либо приращение после проверки и печати, или использовать do while цикл:

int main() 
{ 
    int i = 0; 
    do { 
     printf("%d\n", i); 
    } while(i++ < 10); 
    return 0; 
} 
0

Это потому, что вы уже увеличившая i, прежде чем вы назвали команду печати.

Таким образом, если вы хотите начать с печатью 0,

вы можете попробовать использовать это:

int main() 
{ 
    int i = 0; 
    while(i < 10) 
     printf("%d\n", i++); 

    return 0; 
} 

Таким образом, вы увеличиваете его после того, как вы печатаете; это post-increment.

Если вы изменили его на ++i следующим образом, вы получите 1 от первой печати.
Это pre-increment.

int main() 
{ 
    int i = 0; 
    while(i < 10) 
     printf("%d\n", ++i); 

    return 0; 
} 

Я думаю, что теперь вы будете иметь представление о post-increment и pre-increment.

0

Когда цикл в то время как while(i++ < 10) оценивается он проверяет значение I, прибавление к нему, и сравнивая старую значения 10. При изменении его while(++i < 10) она увеличивает значение i перед сравнением нового значение до 10.

В любом случае, к тому времени, как вы дойдете до следующего оператора, i уже был увеличен.

Если вы хотите напечатать от 0 до 9, вы можете попробовать

while(i < 10) 
    printf("%d\n", i++); 

вместо этого. В этом случае значение i увеличивается с после, исходя из его первоначального значения в заявлении printf.

-1

The Whie петель проверки условий является истинным, выполненные в то время как блок и протестировать

условия ложно завершить время цикла.

посмотрим после приращения внутри время цикла ++

недействительным основного()

{

INT rmvivek;

clrscr();

printf ("« целое число от 1 до 10 »);

scanf ("% d", & rmvivek);

в то время (10> = rmvivek ++)

{

Е ("значение =% d \ п", rmvivek);

getch();

 Смежные вопросы

  • Нет связанных вопросов^_^