Member 8150795 Ответов: 3

для цикла в программировании на языке Си


что произойдет, если мы поменяем положение условия цикла и выражение инкремента в "for loop" в c

для(i=0;i++;i<5)
и
для(i=0;i<5;i++)


в чем разница между этими двумя понятиями?

Kenneth Haugland

Один будет работать, а другой нет...

[no name]

Хорошо, что я этого не сказал. Но я думал об этом.

Kenneth Haugland

???

[no name]

Бы, казалось, для нас обоих странное, чтобы сказать то же самое в то же время.

Kenneth Haugland

лол... Великие умы думают как... или что-то в этом роде... Я просто подумала о том, что сказал Крис... Почему бы не попробовать? Я этого не понял....

[no name]

Что произошло, когда вы попытались его скомпилировать?

Member 8150795

он не показывает никаких ошибок и никаких выходных данных

[no name]

Первая форма вообще не должна компилироваться, так как это недопустимый код на языке Си.

[no name]

http://cprogramminglanguage.net/c-for-loop-statement.aspx

Eugen Podsypalnikov

Почему в с ? :)))))

3 Ответов

Рейтинг:
7

ridoy

Это правильный формат в случае цикла for.

for(i=0;i<5;i++)

Если вы попробуете с другим, о котором вы упомянули..
for(i=0;i++;i<5)

Компилятор не будет компилировать его и указывать здесь на ошибку.Потому что это противоречит грамматике цикла for.


pnr4code

Компилятор будет компилироваться. но это еще не конец.

Richard MacCutchan

Вы проделали весь этот путь только для того, чтобы оставить комментарий к вопросу пятилетней давности?

Рейтинг:
28

xenotron

Эй, вот что вы должны знать: эти штуковины, разделенные символами ';' в голове цикла for, являются выражениями, все три из них! Оба цикла for компилируются но это должно дать предупреждение: for(i=0;i++;i<5) потому что последнее выражение не имеет побочного эффекта (то есть: оно ничего не меняет), а ваш компилятор умен! Как я уже сказал, Все три вещи являются выражениями, но первое используется для инициализации, второе-для предварительного тестирования перед каждым выполнением тела цикла, а третье выражение выполняется после каждого выполнения тела цикла.

Этот код c:

for (expr1; expr2; expr3)
{
   code_in_the_body_of_for_loop
}


Может быть записан таким образом:
expr1            // initialization, like i=0; the compiler should warning if this
                 // has no side effect (if it doesnt change anything like i<5)

while (1)        // infinite loop
{
    if (!expr2)  // pre testing before execution of the loop-body
        break;

                 // this is the code inside the for loop, note that
                 // a "continue" statement in the body of the  for loop
                 // jumps to expr3 and not to the beginning of the for loop!!!
    code_in_the_body_of_for_loop

    expr3;       // usually some expressions that change the loop-counter
                 // like i++ or i+=5 or ptr = ptr->parent;
                 // the compiler should warning if this has no side effect.
}


В вашем случае, когда предтестовое выражение (expr2) равно i++, цикл for никогда не выполняет основной код, потому что значение i++ равно нулю, поэтому он немедленно вырывается из вашего цикла for! Вы компилятор также должны предупредить, если expr3 просто i<5 потому что обычно вы никогда не пишете заявление типа i<5; в вашем коде, не так ли? :D


Kenneth Haugland

Итак, в двоичном формате: 1 - 0 ? :-D

CPallini

Ух ты, здорово!.
5+

xenotron

Да, это почти одно и то же! :-)

xenotron

Обратное проектирование C в C... :-)

Kenneth Haugland

Я дам тебе 5 баллов :)

xenotron

Спасибо!
К сожалению, я не могу превзойти вашу двоичную арифметику, которая находится примерно на том же уровне, что и эта запись. :-)

Kenneth Haugland

Просто поищите в google и вы найдете какой нибудь способ лол :)

nv3

Спрашивающий должен был проявить любезность и воспользоваться своей любимой книгой на языке Си++, чтобы посмотреть ее. Но ваш ответ очень старательный. 5.

xenotron

Спасибо! Может быть, у него нет любимой книги. :-)

Sergey Alexandrovich Kryukov

Мой 5. Возможно, слишком много усилий для такого ленивого вопроса...
—СА

Рейтинг:
19

Christian Graus

Разница в том, что один из них является допустимым C, а другой вообще не собирается компилироваться. Почему бы вам не задать этот вопрос, а не просто ввести его и посмотреть, что произойдет ? Зачем спрашивать, что что-то делает, не пытаясь увидеть это для себя ?