Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > определение переменной в цикле


Автор: YahоО 4.6.2021, 10:52
Код

for (HWND hwnd = GetTopWindow(NULL); hwnd != NULL; hwnd = GetNextWindow(hwnd, GW_HWNDNEXT))
{   
      int length = GetWindowTextLength(hwnd);
      ...
}

При рассмотрении этого кусочка кода возникает вопрос, почему определение переменной находится в цикле?
Если не меняя ничего в коде дописать до начала цикла строку int length; и тем самым более чем дважды определить length, то код все равно скомпилируется, хотя его дальнейшее выполнение будет прервано.
А что мануалы? А мануалы пишут "нельзя объявить больше одной переменной с одним и тем же именем". 
Так как же так, почему тогда компилятор компилирует "неправильный" код, 
и совсем не понятно почему можно написать определение переменной в цикле, который конечно же повторяется не один раз и каждый раз определяется одна и та же переменная с одним и тем же именем?

А вот такой код:
Код

for (HWND hwnd = GetTopWindow(NULL); hwnd != NULL; hwnd = GetNextWindow(hwnd, GW_HWNDNEXT))
{   
      int length = GetWindowTextLength(hwnd);
      ...
}
int length;

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


Автор: Oldshelf 4.6.2021, 11:42
Условие цикла может зависеть от факторов, проявляющихся только в работе программы. Например, повторить цикл C раз, где C приходит из функции, которая читает из файла, создаваемого самой программой. А внутри цикла может быть, скажем, return из функции. Тогда, в первом случае, до переменной, объявленной в цикле, может не дойти (компилятор не может быть в этом уверен), а во втором цикл оборвётся и не произойдёт объявления переменной после цикла. Видимо, чтобы не вдаваться в такие подробности, компилятор пропускает такие "ошибки". И, кажется, именно эту задачу решают статические анализаторы.

Автор: YahоО 4.6.2021, 12:55
Oldshelf, Вы конечно во всем правы, однако это не проясняет тему и не дает ответа вопрос.
Если в javascript можно злоупотреблять объявлением var, то С++ как раз напротив четко за этим следит.
"до переменной, объявленной в цикле, может не дойти (компилятор не может быть в этом уверен)" и опять же в javascript есть даже такое как "Поднятие" или hoisting — это механизм, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен. Думаете в С++ по другому? т.е. в С++ по Вашему можно написать гору определений после того в одном из условий предусмотрен выход?

Компилятор пропускает такие "ошибки" - очевидно.  И невероятно smile
Скорее всего всему этому есть какое то разумное объяснение, может быть это скобки. Ведь С++ так строг!

Автор: YahоО 4.6.2021, 14:09
Код

int k=100;
cout <<k<< "\n";

{
    int k=500;
    cout <<k<< "\n";
}

cout <<k<< "\n";

100
500
100
Скобки, точно! А в цикле или не в цикле это вторично, главное что в скобках.

Если что не ладится берем в скобки, всего делов то ))) 
Даешь скобки!

Автор: _zorn_ 7.6.2021, 20:37
...

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