Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Цикл For


Автор: Lion_Smith 16.7.2008, 11:38
Есть вот такой цикл:
Код

   for (int i =0,j =str.Length-1; i<j; i++,j--)
      if(str[i]!=str[j]) return(false);


А что мне сделать что бы переменная i была типа float, а переменная j типа int?? Или все инициализаторы в цикле For должны непременно быть одного типа? А если я например хочу использовать в качестве счётчиков две переменные разного типа int и string?

Автор: MasterOfCode 16.7.2008, 11:41
Что мешает непосредственно в теле цикла опреировать переменно типа float...

Автор: Lion_Smith 16.7.2008, 11:46
Ни чего! smile Вопрос то о другом! Можно ли использовать разнотипные перемеенные в качестве инициализаторов!? И если можно, то как их объявить? Я просто не нашёл ответа на свой вопрос, по этому на форуме и пишу!

Автор: QryStaL 16.7.2008, 11:46
Код

int j = 10;
for (float i = 0; i < j; i++, j--)
{
}

Автор: Ram1reS 16.7.2008, 11:47
Цитата(Lion_Smith @ 16.7.2008,  11:38)
Есть вот такой цикл:
Код

   for (int i =0,j =str.Length-1; i<j; i++,j--)
      if(str[i]!=str[j]) return(false);


А что мне сделать что бы переменная i была типа float, а переменная j типа int?? Или все инициализаторы в цикле For должны непременно быть одного типа? А если я например хочу использовать в качестве счётчиков две переменные разного типа int и string?

Хмм... видимо Вы неправильно понимаете как работает цикл For.

Код

for( инициализация счетчиков/условий ; условие продолжения цикла ; действие по окончании итерации цикла )
{
    // тело
}


т.е. можете оперировать чем угодно и как угодно, например:
Код

for (string s = String.Empty; s != "aaaa"; s += "a")
{
       // some work
}

Автор: Lion_Smith 16.7.2008, 11:58
Хм.. 

Цитата


т.е. можете оперировать чем угодно и как угодно, например:Код
Код

for (string s = String.Empty; s != "aaaa"; s += "a")
{
       // some work
}





здесь в качестве инициализатора используется одна переменная типа string, а если я хочу использовать 2 переменные? Например одну s типа стринг, а другую i типа int?? Как их инициализировать в инициализаторе??

Такой код не подходит:

Цитата

Код

int j = 10;
for (float i = 0; i < j; i++, j--)
{
}



В данном случае переменная j не умрёт после того как цикл будет закончен, а нужно чтоб умерла.

Кроме того при компиляции выдало ошибку:
  Error    1    A local variable named 'j' cannot be declared in this scope because it would give a different meaning to 'j', which is already used in a 'child' scope to denote something else    C:\Documents and Settings\Rkuznetsov\My Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs    95    23    WindowsFormsApplication1



Автор: Ram1reS 16.7.2008, 13:02
Вот вырезка из спецификации C# (8.8.3)
Цитата

The for-initializer, if present, consists of either a local-variable-declaration (§8.5.1) or a list of statement-expressions (§8.6) separated by commas. 


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

Автор: Lion_Smith 17.7.2008, 10:01
Спецификация дело хорошее!  smile 

А на практике я имею примерно следующее! 
Вот синтаксис цикла for:
Цитата

for(инициализаторы; условие; список_выражений) оператор

Cколько раз будет выполнено тело этого цикла зависит от трех управляющих элементов, заданных в скобках:

1) Инициализаторы задают начальное значение одной или нескольких переменных, часто называемых счетчиками или просто переменными цикла.
2) Условие задает условие окончания цикла. Результатом вычисления условия должно быть значение true или false. Условие вычисляется на каждой итерации цикла. Если условие цикла истинно, то выполняется тело цикла, т.е. оператор. Как только условие становится ложным, цикл завершает свою работу.
3) После того как выполненно тело цикла, изменяются значения счетчиков и снова проверяется условие. Значения счётчиков (инициализаторов) изменяются в списке выражений, которые записываются через запятую.

С условием всё ясно. Это любое логическое выражение, оно одно его значения true или false. 
Со списком вырожений тоже всё понятно. Это просто блок выражений которые изменяют значения переменных, причём в этом блоке можно на ряду с инициализаторами использовать и ранее объявленные и инициализированные в коде переменные. Например:
Код

int str = 56;
string MyStr = "приветик";
for (int k = 0; k < str; k++, k++, k = MyStr.Length - 1)
 { k = k + 1; }

Из этого же примера видно, что значение счётчиков можно свободно использовать и в теле цикла.
Теперь обратим внимание на счётчики (инициализаторы). Это как минимум одна переменная любого типа срок жизни которой ограничен циклом. Тоесть переменная-инициализатор уничтожается как только цикл перестаёт работать, её значение теряется и показанный ниже код выдаст нам ошибку ещё на этапе компиляции, потому что к моменту str=k, переменая k уже будет уничтожена. В этом и есть прелесть использования инициализаторов.
Код

int str = 56;
string MyStr = "приветик";
for (int k = 0; k < str; k++, k++, k = MyStr.Length - 1)
 { k = k + 1; }
str=k;

Стоит отметить что иницализатор вовсе не обязательно вообще где бы то ни было использовать. Здесь мы создаём счётчик, но не где его не используем, по этому инициализировать, тоесть присваивать ему значение вовсе не обязательно:
Код

int str = 56;
for (int k; 0 < str; str = str - 1) { ; }

а если не создавать счётчик, а попытаться использовать уже существующую переменную str, то нам опять выдаст ошибку компиляции.

Счётчиков может быть несколько, тогда их можно перечислить через запятую.
Код

int str = 56;
for (int k, y, w; 0 < str; str = str - 1) { ; }

Все эти переменные создаются и существуют внутри цикла и у всех у них один тип. В данном случае это тип int.

Нельзя задать в качестве инициализаторов цикла две и более разнотипных переменых!!! Нельзя использовать в качестве инициализатора уже существующую переменную. Нельзя задать в области инициализации значение кукой-нибудь существующей переменной. Такой код выдаст ошибку:
Код

    str=32;
                for (int k, z=0, string w; 0 < str; str = str - 1) { ; }
                
                int z;
                for (int k, z=0,w; 0 < str; str = str - 1) { ; }
                
                int z=1;
                for (int k, z=0,w; 0 < str; str = str - 1) { ; }
                
За то, раз переменная k является инициализаторорм цикла, то мы можем использовать её вновь и вновь в нескольких циклах нашего кода подряд, всё равно по окончани каждого из этих циклов она будет уничтожена.

PS: это конечно всем известно, так что сорри за мой маленький  smile писал скорее для себя...

Автор: oleeg 17.7.2008, 12:43
Так в чем проблема, можно использовать 2 цикла.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)