Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определение переменной в цикле 
:(
    Опции темы
YahоО
Дата 4.6.2021, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 11.6.2015

Репутация: нет
Всего: 1



Код

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;

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


PM MAIL   Вверх
Oldshelf
Дата 4.6.2021, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 22.4.2018

Репутация: нет
Всего: 4



Условие цикла может зависеть от факторов, проявляющихся только в работе программы. Например, повторить цикл C раз, где C приходит из функции, которая читает из файла, создаваемого самой программой. А внутри цикла может быть, скажем, return из функции. Тогда, в первом случае, до переменной, объявленной в цикле, может не дойти (компилятор не может быть в этом уверен), а во втором цикл оборвётся и не произойдёт объявления переменной после цикла. Видимо, чтобы не вдаваться в такие подробности, компилятор пропускает такие "ошибки". И, кажется, именно эту задачу решают статические анализаторы.
PM MAIL WWW   Вверх
YahоО
Дата 4.6.2021, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 11.6.2015

Репутация: нет
Всего: 1



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

Компилятор пропускает такие "ошибки" - очевидно.  И невероятно smile
Скорее всего всему этому есть какое то разумное объяснение, может быть это скобки. Ведь С++ так строг!
PM MAIL   Вверх
YahоО
Дата 4.6.2021, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 11.6.2015

Репутация: нет
Всего: 1



Код

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

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

cout <<k<< "\n";

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

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

Это сообщение отредактировал(а) YahоО - 4.6.2021, 14:11
PM MAIL   Вверх
_zorn_
Дата 7.6.2021, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



...

Это сообщение отредактировал(а) _zorn_ - 7.6.2021, 20:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1179 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.