Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > определение переменной в цикле |
Автор: YahоО 4.6.2021, 10:52 | ||||
При рассмотрении этого кусочка кода возникает вопрос, почему определение переменной находится в цикле? Если не меняя ничего в коде дописать до начала цикла строку int length; и тем самым более чем дважды определить length, то код все равно скомпилируется, хотя его дальнейшее выполнение будет прервано. А что мануалы? А мануалы пишут "нельзя объявить больше одной переменной с одним и тем же именем". Так как же так, почему тогда компилятор компилирует "неправильный" код, и совсем не понятно почему можно написать определение переменной в цикле, который конечно же повторяется не один раз и каждый раз определяется одна и та же переменная с одним и тем же именем? А вот такой код:
не только компилируется, но и выполняется без проблем, где одна и та же переменная определена как минимум дважды. |
Автор: Oldshelf 4.6.2021, 11:42 |
Условие цикла может зависеть от факторов, проявляющихся только в работе программы. Например, повторить цикл C раз, где C приходит из функции, которая читает из файла, создаваемого самой программой. А внутри цикла может быть, скажем, return из функции. Тогда, в первом случае, до переменной, объявленной в цикле, может не дойти (компилятор не может быть в этом уверен), а во втором цикл оборвётся и не произойдёт объявления переменной после цикла. Видимо, чтобы не вдаваться в такие подробности, компилятор пропускает такие "ошибки". И, кажется, именно эту задачу решают статические анализаторы. |
Автор: YahоО 4.6.2021, 12:55 |
Oldshelf, Вы конечно во всем правы, однако это не проясняет тему и не дает ответа вопрос. Если в javascript можно злоупотреблять объявлением var, то С++ как раз напротив четко за этим следит. "до переменной, объявленной в цикле, может не дойти (компилятор не может быть в этом уверен)" и опять же в javascript есть даже такое как "Поднятие" или hoisting — это механизм, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен. Думаете в С++ по другому? т.е. в С++ по Вашему можно написать гору определений после того в одном из условий предусмотрен выход? Компилятор пропускает такие "ошибки" - очевидно. И невероятно ![]() Скорее всего всему этому есть какое то разумное объяснение, может быть это скобки. Ведь С++ так строг! |
Автор: YahоО 4.6.2021, 14:09 | ||
100 500 100 Скобки, точно! А в цикле или не в цикле это вторично, главное что в скобках. Если что не ладится берем в скобки, всего делов то ))) Даешь скобки! |
Автор: _zorn_ 7.6.2021, 20:37 |
... |