2015-01-08 4 views
-8

Я совершенно новый для C и прощаю, если ниже q. уже спросил, я видел кесарево программу, как показано ниже:Почему это для цикла ведет себя так?

#include <stdio.h> 

main() { 

    int i; 

    for (i=1;i<=5;printf("%d\n",i)) 
    i++; 

} 

я получаю выход как:

2 
3 
4 
5 
6 

Но я не мог понять, почему? Извините за неудобства. Точка с запятой после петли помещается случайно. Но то, что я думаю, выводится, должно быть 1,2,3,4,5, поскольку инструкция printf приходит перед оператором increment.

+8

Этот вывод не соответствует отображаемому вами коду. У вас есть бесконечный цикл, который будет печатать '' 1 \ n "' снова и снова. –

+7

Отправьте * реальный * код, соответствующий вашему результату. Этот цикл никогда не заканчивается. – WhozCraig

+0

привет, спасибо за ваш ответ и да, вы правы .., эта запятая после для дается по ошибке. извините за inconvinece – spectre

ответ

1
for (i=1;i<=5;printf("%d\n",i)) 

3-выражение оценивается как последний оператор в цикле, так к тому времени первый printf() Выполнено значение i is 2.

Таким образом, цикл сохраняет значение печати до i<=5

Я надеюсь, что ; в конце цикла является случайно. Потому что результаты не совпадают с показанным циклом.

for (i=1;i<=5;printf("%d\n",i)); 

Это бесконечный цикл, потому что i никогда не получает приращение

2

Ваша петля бесконечна, потому что вы никогда не заставляете ее останавливаться! Так что он просто печатает 1!

for (i=1;i<=5;printf("%d\n",i)); 
          //^And your loop ends here 

EDIT:

Если вы не точка с запятой есть, то выход происходит потому, что способ, как для цикла работ!

 1  2, 5   4 
     |  |   | 
     \/  \/   \/ 
for(i = 0; i <= 5 ; printf("%d\n",i)) { 
    //3 Go through the body 
    i++; 
} 

И через 5 она идет к 2,3,4,5 пока условие ложно

+0

Увидев вывод, уверен, что ';' помещается случайно. – haccks

+0

@haccks И вот почему вы голосуете? – Rizier123

+1

Да. Я остановился. И я всегда комментирую после downvote. – haccks

-1

Когда вы поставите; после того, как петли, как этот

Это означает, что вы хотите, чтобы тело цикла не делать ничего .

Если вы пишете

for (something); 
    i++; 

Ваш цикл будет работать, а затем я будет увеличиваться. Один раз после цикла, не каждый раз.

Я подозреваю, что это опечатка из-за того, что вы описали.

Настоящая проблема заключается в том, что когда вы делаете for(;;printf()), printf выполняется после тело петли. И в теле цикла вы делаете i ++. Вы увеличиваете i перед печатью.

0

Печать происходит после того, как вы прошли через цикл.

Обычно контур петли будет помещен туда.

Вы можете посмотреть на него как: для (i = 1; i < = 5; printf ("% d \ n", i ++));

Или у вас есть другой вопрос, кроме того, почему он начинает печатать 2?

-2

EIDT: Я не видел `for (i = 1; i < = 5; printf ("% d \ n ", i)); , эта точка с запятой.

для (i = 1; i < = 5; printf ("% d \ n", i)); i ++;

  • i=1 --- вы настраиваете 1 на i;
  • i<=5 --- в то время как я == 5 или я < 5 повторить цикл

    • printf("%d\n", i) - делает печать на экране я и то же, если и писать что-то вроде этого ->

      для (i = 1; i < = 5;) { printf ("% d \ n", i); i ++; }

потому, что третья часть for петли eexecute в нижней части петли. Вы также можете сделать так:

for (i=1;i<=5;printf("%d\n",i), i++) 
     ; 
1

Гадать, что точка с запятой после цикла является случайной, for цикла состоит из четырех частей:

  1. выражения инициализации
  2. условия экспрессии
  3. Итерации
  4. Корпус контура

Экспериментальное выражение (1) выполняется перед циклом. Цикл будет зацикливаться, пока условие (2) будет истинным. Цикл будет обрабатывать тело цикла (4) на каждой итерации, а затем будет выполняться итерационное выражение (3).

Давайте ваш for цикл:

for (i = 1; i <= 5; printf("%d\n", i)) 
{ 
    i++; 
} 

Это эквивалентно

i = 1; 
while (i <= 5) 
{ 
    i++; 
    printf("%d\n", i); 
} 

Это должно сделать его легко понять, почему вы получите вывод, который вы получите.

0

Вам нужно только понять, как для работы петли.Синтаксис для цикла является

for (1.variable initialization ; 2.condition ; 4.variable update) 
    { 
     3.code // 
    } 

Таким образом, в этом примере в первой итерации я бы значение 1. После этого будет проверено, если условие истинно. Да 1 меньше 5, поэтому код будет выполнен. i++ означает, что теперь i равно 2. Затем оно будет напечатано функцией printf(). Итак, теперь i равно 2, условие будет проверено и да снова истинно, поэтому цикл выполнил бы те же шаги и будет печатать 3 и так далее, пока условие не станет ложным. Также у вас есть опечатка. Точка с запятой, о которой упоминали другие пользователи.

+0

Я получил ваш ответ, но то, что я ожидаю, ответ должен быть 1,2, 3,4,5. поскольку printf выводится перед оператором increment. – spectre

+0

@spectre, в цикле 'for' выполняется первая инициализация (' i = 1'). Затем выполняется условие ('i <= 5'). Если true, тело цикла выполняется ('i ++;'), а затем выполняется 'printf'. –

+0

@spectre, for (i = 1; i <= 5; i ++) {printf ("% d \ n", i); }. Это даст результат, который вы хотите. – SVN