Нужна помощь в понимании того, как работает мой цикл - PullRequest
1 голос
/ 14 сентября 2011
#include<stdio.h>

int main(){
    int i;
    clrscr();
    for(i=0,i++,i<=5;i++,i<=2;i=0,i<=5,i+=3){
         printf("%d ",i);
    }
    return 0;
}

Вывод этой программы равен 2. Пожалуйста, уточните логику

Ответы [ 5 ]

8 голосов
/ 14 сентября 2011

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

i = 0;
i++;
i <= 5;

i++;
while (i <= 2)
{
    printf("%d ", i);

    i = 0;
    i <= 5;
    i += 3;

    i++;
}

Я предполагаю, что часть, с которой вы, возможно, раньше не сталкивались, - это оператор запятой .Последовательность выражений, разделенных запятыми, оценивается по очереди, а возвращаемое значение является значением конечного выражения.Например:

x = (y + 3, ++y, y + 5);

примерно эквивалентно:

y + 3;
++y;
x = y + 5;
2 голосов
/ 14 сентября 2011

i=0,i++,i<=5; соответствует инициализации. Здесь i становится 1
i++,i<=2; соответствует условию теста. Здесь i становится 2 и его значение печатается.
i=0,i<=5,i+=3; соответствует условию приращения, в котором значение iстановится 5, что не соответствует условию проверки, поэтому цикл заканчивается здесь.

1 голос
/ 14 сентября 2011

ну, это может сбить с толку стартера, но позвольте мне объяснить это более понятным способом, чем просто фрагмент

Позвольте мне разделить мое решение на 3 части как 1) инициализация 2) условие 3) приращение как 3 части цикла for

1st part 
i=0,i++,i<=5
i is assigned 0 
i++ increments to 1 
i<=5 \\ this code has no effect as it is used in assinging part of for loop
          it should be used only in condtions. so value of i is 1 
i<=5 \\ doesnt make any sense it keeps i value as it is

2nd part
i++,i<=2
i++ \\ i value is 2
i<=2 \\ these code has effect as it is in conditional part of for loop
  so now it checks the condition i<=2 and i value is 2 So condition becomes true
and enters into loop and prints the i value as 2

3rd part
i=0,i<=5;i+=3
i=0 assigns i = 0
i<=5 \\ as i told you, code has no effect so i still holding zero value in it
i+=3 implies i=i+3 (right hand operators)
as i value is zero it becomes i = 0+3 now i value is 3

goes to the condition part again
i++ \\ now i has four in it
i<=2 \\ fails as i value is 4 so loop exits

Помните и читайте больше об операторах запятой и правой руке.

x=4
x=(x+2,++x,x-4,++x,x+5) 
x value is 11 now guess it why?

сначала выполняет x + 2, получает 6, но игнорирует, потому что вы не упомянули переменную для хранения значения, ++ x делает ее 5, поскольку это инкремент, или вам не нужно присваивать, даже если значение x-4 игнорируется и ++ x делает x равным 6, а x + 5 дает 11 по окончании, значение сохраняется в x

Я думаю, я дал вам понять и очистить Спасибо больше сомнений не стесняйтесь спрашивать меня!

1 голос
/ 14 сентября 2011

Инициализация: i ++ //, поэтому i = 1

условие: i ++ // поэтому i = 2 и i <= 2 истинно </p>

печать 2

Инкремент i + = 3 //, поэтому условие i = 5 ложно. выйти из цикла

0 голосов
/ 14 сентября 2011

Добавление к ответу @Oli Charlesworth:

  1. Вы увеличиваете i дважды перед входом в цикл.
  2. Как только петля введена, вы печатаете номер 2.
    • Другие ваши условия никогда не оцениваются.
  3. Наконец, вы увеличиваете i, что делает его равным 3, и цикл останавливается на следующей итерации (для i установлено значение 3 и, следовательно, i теперь больше 2), программа завершается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...