|
|
|
| Почему после использования цикла
for(int i=0;i<10;i++)for(int j=0;j<19;j++)
{
}
i=0; // эта строка выполняется - переменная i объявлена в цикле
j=0; // тут ошибка(почему?), переменная j объявлена, однако компилер пишет, что она не существует.
|
переменная i существует, а переменная j не существует? | |
|
|
|
|
|
|
|
для: alex19921992
(01.03.2007 в 11:35)
| | i - видима потому что она находиться в блоке цыкла а j - уже нет :-) | |
|
|
|
|
|
|
|
для: Shishkin
(01.03.2007 в 13:36)
| | Вообще, получается, что надо все переменные объявлять в начале функцыи, чтоб потом путаницы не было? | |
|
|
|
|
|
|
|
для: alex19921992
(01.03.2007 в 13:54)
| | Переменные обьявленные в теле цыкла используй только в этом цыкле, это стандарт С89 и за телом цыкла эти переменные невидимы;
например j - обьявленная вне цыкла не будет иметь отношения к j - в цыкле а после выхода с цыкла ты уже можешь использовать j - обьявленную до цыкла; - ) | |
|
|
|
|
|
|
|
для: alex19921992
(01.03.2007 в 13:54)
| | Например, в C переменные следует объявлять вне цикла, поэтому, чтобы добиться большей переносимости, часто объявляют переменные вне цикла. | |
|
|
|
|
|
|
|
для: 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; // изменяем глобальную
} |
| |
|
|
|
|
|
|
|
для: 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 умничает, он ругается только тогда, когда имеются объявления
переменных с такими же именами вне циклов. Когда же их нет, он ведет себя согласно
старому стандарту, обеспечивая большую совместимость со старым кодом. | |
|
|
|
|
|
|
|
для: 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;
}
} |
Спасибо | |
|
|
|