Форум: Форум C++Разное
Новые темы: 00
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Счетчики цикла
 
 автор: alex19921992   (01.03.2007 в 11:35)   письмо автору
 
 

Почему после использования цикла

for(int i=0;i<10;i++)for(int j=0;j<19;j++)
{
}
i=0; //  эта строка выполняется - переменная i объявлена в цикле
j=0; //  тут ошибка(почему?), переменная j объявлена, однако компилер пишет, что она не существует.

переменная i существует, а переменная j не существует?

  Ответить  
 
 автор: Shishkin   (01.03.2007 в 13:36)   письмо автору
 
   для: alex19921992   (01.03.2007 в 11:35)
 

i - видима потому что она находиться в блоке цыкла а j - уже нет :-)

  Ответить  
 
 автор: alex19921992   (01.03.2007 в 13:54)   письмо автору
 
   для: Shishkin   (01.03.2007 в 13:36)
 

Вообще, получается, что надо все переменные объявлять в начале функцыи, чтоб потом путаницы не было?

  Ответить  
 
 автор: Shishkin   (01.03.2007 в 14:10)   письмо автору
 
   для: alex19921992   (01.03.2007 в 13:54)
 

Переменные обьявленные в теле цыкла используй только в этом цыкле, это стандарт С89 и за телом цыкла эти переменные невидимы;
например j - обьявленная вне цыкла не будет иметь отношения к j - в цыкле а после выхода с цыкла ты уже можешь использовать j - обьявленную до цыкла; - )

  Ответить  
 
 автор: cheops   (01.03.2007 в 14:21)   письмо автору
 
   для: alex19921992   (01.03.2007 в 13:54)
 

Например, в C переменные следует объявлять вне цикла, поэтому, чтобы добиться большей переносимости, часто объявляют переменные вне цикла.

  Ответить  
 
 автор: Shishkin   (01.03.2007 в 14:23)   письмо автору
 
   для: alex19921992   (01.03.2007 в 13:54)
 

Переменные обьявленные в теле цыкла используй только в этом цыкле, это стандарт С89 и за телом цыкла эти переменные невидимы;
например j - обьявленная вне цыкла не будет иметь отношения к j - в цыкле а после выхода с цыкла ты уже можешь использовать j - обьявленную до цыкла; - )
int i = 5;   //глобальная
int main ()
{
    int i = 10; // локальная
    for(int i = 0;i<10;i++)
    {       //локальная в цыкле;
    }
    i = 25;//изменяем i в main(){int i=10;}
    ::i = 25; // изменяем глобальную
}

  Ответить  
 
 автор: oleg_alexeev   (01.03.2007 в 15:10)   письмо автору
 
   для: alex19921992   (01.03.2007 в 11:35)
 

По-моему, дело тут в следующем:

Изначально при создании С++ (автор ведь спрашивает про С++ ?) объявление переменной
в операторе for было эквивалентно определению этой переменной непосредственно перед
for, т.е.


for (int i=0; i<10; i++)
{
}

был эквивалентен

int i = 0;
for (; i<10; i++)
{
}


поэтому пример автора эквивалентен следующему:


int i = 0;
for (; i<10; i++)
{
  int j = 0;
  for (; j<10; j++)
  {
  }
}
i = 0;  // работает
j = 0;  // не работает (вышли из блока, где j была объявлена)


Сейчас стандарт С++ изменили, так что i и j не будут существовать вне своих циклов.
Скомпилировав приведенный код компилятором GCC мы увидим, что это так.
Но компилятор от Microsoft умничает, он ругается только тогда, когда имеются объявления
переменных с такими же именами вне циклов. Когда же их нет, он ведет себя согласно
старому стандарту, обеспечивая большую совместимость со старым кодом.

  Ответить  
 
 автор: Shishkin   (01.03.2007 в 17:29)   письмо автору
 
   для: oleg_alexeev   (01.03.2007 в 15:10)
 

да это правильно спасибо
и еще Алег Алексеевич не могли бы вы мне подробнее про функцию с упаковаными битами
char codes[SIZE];  // упакованные данные
int size;          // их размер в байтах

int code;          // буфер для записываемых бит
int codesize;     // число бит в буфере

void PutCode(int nCode, int nCodeSize)
{
  code |= (nCode<<codesize);
  codesize += nCodeSize;
  for (; codesize>=8; codesize-=8)
  {
    codes[size++] = (char)code;
    code >>= 8;
  }
}

Спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования