Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Почему переменная должна быть объявлена перед использованием?  [new]
argnis
Member

Откуда:
Сообщений: 2
Здравствуйте, простите за вопрос новичка, только начал разбираться с программарованием.

Почему переменная должна быть объявлена перед использованием: чтобы избежать двусмысленности или чтобы компилятор знал
как интерпретировать последовательность битов?
5 мар 19, 12:38    [21825258]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
andreykaT
Member

Откуда:
Сообщений: 1695
а что можно объявить переменную после использования? )
5 мар 19, 13:00    [21825298]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 15272
andreykaT
а что можно объявить переменную после использования? )
некоторые яп допускают такое. для них компиляторы , как минимум, двухпроходные.
5 мар 19, 13:16    [21825317]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1852
погуглил:
https://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141270.html
пункт 6.3
5 мар 19, 13:31    [21825329]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
andreykaT
Member

Откуда:
Сообщений: 1695
вадя
andreykaT
а что можно объявить переменную после использования? )
некоторые яп допускают такое. для них компиляторы , как минимум, двухпроходные.

не ну ты ее можешь вообще не объявлять как вариант, просто подразумевая ее в контексте. но ты же понимаешь что по факту она контекстно объявлена.
5 мар 19, 13:45    [21825353]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37071
вадя
двухпроходные
а если 1 стадия - написать сам скрипт, то трехпроходная.))
5 мар 19, 13:52    [21825361]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37071
argnis
последовательность битов?
не думай о битах.
Думай о Hello world!))))
5 мар 19, 13:54    [21825363]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 15272
andreykaT
не ну ты ее можешь вообще не объявлять как вариант, просто подразумевая ее в контексте. но ты же понимаешь что по факту она контекстно объявлена.
кажется есть и такие яп....
5 мар 19, 13:57    [21825368]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
argnis
Member

Откуда:
Сообщений: 2
Nixic, спасибо, посмотрел. Вот только там просто написано, что переменную нужно объявлять в начале блока кода, но не написано почему.
5 мар 19, 13:59    [21825372]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Alexey Tomin
Member

Откуда: Самара
Сообщений: 1648
argnis
Здравствуйте, простите за вопрос новичка, только начал разбираться с программарованием.

Почему переменная должна быть объявлена перед использованием: чтобы избежать двусмысленности или чтобы компилятор знал
как интерпретировать последовательность битов?


Чтобы проще отлавливать опечатки
5 мар 19, 14:25    [21825408]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1852
argnis
Nixic, спасибо, посмотрел. Вот только там просто написано, что переменную нужно объявлять в начале блока кода, но не написано почему.

" it can confuse the unwary programmer and hamper code portability within the scope."
5 мар 19, 14:26    [21825410]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
andreykaT
Member

Откуда:
Сообщений: 1695
ты можешь в той же джаве например, объявить в классе все методы, а потом вконце поля класса (переменные да). и методы из класса будут работать с этими полями, хотя поля объявлены "визуально" после кода где они заюзаны.
5 мар 19, 15:23    [21825468]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
alex55555
Member

Откуда:
Сообщений: 1727
argnis
Почему переменная должна быть объявлена перед использованием

Причин несколько, но главная - нужно учиться правильно думать, а как раз для этого необходимо явно проговаривать много чего из того, что предполагается использовать.

Но можно писать вон как андрейка предлагает - всё куда-то в задницу, что бы никто не догадался (там порядок "задний" и смысл объявления не соответствует вопросу). Может так даже у кого-то получается...
6 мар 19, 13:11    [21826183]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4849
argnis
Здравствуйте, простите за вопрос новичка, только начал разбираться с программарованием.

Почему переменная должна быть объявлена перед использованием: чтобы избежать двусмысленности или чтобы компилятор знал
как интерпретировать последовательность битов?


в java нет требования разделять инициализацию переменной и ее объявление. Как сказали уже ранее, скорее, наоборот, просто при обяъвлении переменную инициализировать.
Например:

int i = 1;


Но, бывают случае, связанные с "видимостью" переменных. Зачастую, вы можете встретить подобные конструкции:

Integer i;
try {
 //какая-то логика
} catch (Exception e) {
 log.error("err", e);
}

System.out.println(i);



Если переменную i обяъвить "внутри блока, то для остального кода она (переменная) будет не инициализированной, о чем вам компилятор и сообщит.

p.s. Подобные конструкции "небезопасны", о чем вам любая вменяемая среда разработки и сообщит словами "Переменная может быть не инициализирована".
6 мар 19, 13:25    [21826203]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4849
*будет необъявленной
6 мар 19, 13:57    [21826280]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
lleming
Member

Откуда:
Сообщений: 1536
argnis
Здравствуйте, простите за вопрос новичка, только начал разбираться с программарованием.

Почему переменная должна быть объявлена перед использованием: чтобы избежать двусмысленности или чтобы компилятор знал
как интерпретировать последовательность битов?


чтобы компилятор заранее зарезервировал требуемое количество памяти для экземпляра типа на которую ссылается эта переменная
6 мар 19, 15:32    [21826409]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4849
lleming
argnis
Здравствуйте, простите за вопрос новичка, только начал разбираться с программарованием.

Почему переменная должна быть объявлена перед использованием: чтобы избежать двусмысленности или чтобы компилятор знал
как интерпретировать последовательность битов?


чтобы компилятор заранее зарезервировал требуемое количество памяти для экземпляра типа на которую ссылается эта переменная


безотносительно "правильности" ответа, какое отношение компилятор вообще имеет к экземплярам, резервированию памяти и так далее?
6 мар 19, 15:46    [21826430]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7443
Озверин
безотносительно "правильности" ответа, какое отношение компилятор вообще имеет к экземплярам, резервированию памяти и так далее?

Если атомарные типы выделяемые в стеке (не совсем в стеке, в JVM вроде отдельные кадры/таблицы локальных переменных) - то самое прямое. Ровно так же, как и в других языках программирования.

Да и выделение памяти в куче, точно так же. Байт-код new (0xbb) требует указания типа, т.е. он должен быть известен в процессе/после компиляции.

IMHO & AFAIK
6 мар 19, 17:30    [21826597]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
andreykaT
Member

Откуда:
Сообщений: 1695
alex55555
argnis
Почему переменная должна быть объявлена перед использованием

Причин несколько, но главная - нужно учиться правильно думать, а как раз для этого необходимо явно проговаривать много чего из того, что предполагается использовать.

Но можно писать вон как андрейка предлагает - всё куда-то в задницу, что бы никто не догадался (там порядок "задний" и смысл объявления не соответствует вопросу). Может так даже у кого-то получается...

ты книжку клинкод читал? там ясно написано что где и как рекомендуется объявлять. что поля, что методы.
не всё должно быть попендикулярно, как некоторые думают.

впрочем, это лишь предложения и рекомендации. ты можешь строго все объявлять сверху а юзать где нибудь вообще нигде.
6 мар 19, 17:49    [21826622]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4849
Leonid Kudryavtsev
Озверин
безотносительно "правильности" ответа, какое отношение компилятор вообще имеет к экземплярам, резервированию памяти и так далее?

Если атомарные типы выделяемые в стеке (не совсем в стеке, в JVM вроде отдельные кадры/таблицы локальных переменных) - то самое прямое. Ровно так же, как и в других языках программирования.

Да и выделение памяти в куче, точно так же. Байт-код new (0xbb) требует указания типа, т.е. он должен быть известен в процессе/после компиляции.

IMHO & AFAIK


в java один компилятор(javac) таки превращает java файл в class, а второй(часть JVM - тот самый JIT компилятор) - компилирует часто используемые в рантайме куски кода в близкий к машинному или какому там коду.
Где в этом функционале может появиться вообще выделение памяти под экземпляры класса?
6 мар 19, 19:49    [21826710]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4849
Leonid Kudryavtsev
Озверин
безотносительно "правильности" ответа, какое отношение компилятор вообще имеет к экземплярам, резервированию памяти и так далее?

Если атомарные типы выделяемые в стеке (не совсем в стеке, в JVM вроде отдельные кадры/таблицы локальных переменных) - то самое прямое. Ровно так же, как и в других языках программирования.

Да и выделение памяти в куче, точно так же. Байт-код new (0xbb) требует указания типа, т.е. он должен быть известен в процессе/после компиляции.

IMHO & AFAIK


а что касается объявления переменной и выделения памяти, конечно же это несвязные вещи.
Да, в частном случае, при объявлении переменной примитивных типов это таки происходит, но, скорее, потому, что примитивы автоматически инициализируются значением по умолчанию(впрочем, так же в зависимости от скопа, в методе - нет, в классе как филд - да).

А уж для объектов память при объявлении выделяется только для хранения ссылки, т.е. - мизерная(читай, не помню сколько).
6 мар 19, 19:57    [21826719]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 306
Leonid Kudryavtsev
Озверин
безотносительно "правильности" ответа, какое отношение компилятор вообще имеет к экземплярам, резервированию памяти и так далее?

Если атомарные типы выделяемые в стеке (не совсем в стеке, в JVM вроде отдельные кадры/таблицы локальных переменных) - то самое прямое. Ровно так же, как и в других языках программирования.

Да и выделение памяти в куче, точно так же. Байт-код new (0xbb) требует указания типа, т.е. он должен быть известен в процессе/после компиляции.

IMHO & AFAIK

Точнее, стек нити состоит из кадров (frame). А вот уже внутри кадра есть (среди прочего) массив локальных переменных (там хранятся примитивы или ссылки на объектные типы, точнее на дескриптор объекта. А вот в дескрипторе уже содержатся 2 указателя: на тип Class; и указатель на область в куче, выделенную для его локальных переменных), длина его определяется уже при компиляции, а ссылки на переменные являются индексами в этом массиве.

И для argnis - вот чтобы "использовать" ссылки на эти переменные (индексы в массиве локальных переменных ) при компиляции эти ссылки УЖЕ должны существовать на момент прохода компилятора "по использованию" переменной.
Остальные детали можете почитать "где то тут" - https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7 - сами, "своими руками"
6 мар 19, 20:34    [21826750]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Alex_SQLru
Member

Откуда:
Сообщений: 6
Главное объявляем тип данных переменной, числовой или символьный. Для арифметических операций нужны числовые, при этом объявляется диапазон допустимых значений, для более простых или точных вычислений.
7 мар 19, 06:49    [21826909]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная должна быть объявлена перед использованием?  [new]
Герой дня
Member

Откуда: obmanula.ru
Сообщений: 30511
argnis
Здравствуйте, простите за вопрос новичка, только начал разбираться с программарованием.

Почему переменная должна быть объявлена перед использованием: чтобы избежать двусмысленности или чтобы компилятор знал
как интерпретировать последовательность битов?


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

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

если переменная не будет объявлена - то где хранить ее значение ?
7 мар 19, 13:02    [21827243]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить