Другие языки программирования и технологии

Программирование на с++, переменные и особенности языка

Привет, я школьник, участвую на олимпиадах по инфе, работаем на c++. Я понимаю, что мог бы спросить учителей, но мне кажется, что об этом уже говорили. Скажите пожалуйста, почему если ты заводишь переменную до int main() её значение равно нулю, а если внутри int main(), то например целочисленная переменная принимает значение 4285854.
Обнуляются и не обнуляются потому, что таков стандарт языка. Предыдущий комментатор сказал немного не то, на это можно полагаться, так как это стандарт.

Теперь о том, почему так.

Переменные вне функций называются глобальными, они видны из всех функций и получают начальное значение один раз при старте программы. При этом обычно просто грузится кусок .exe файла, где для каждой из этих переменных уже выделено место. Если вы задаете конкретное начальное значение, и оно константа, то оно вычисляется в момент создания .exe и потом грузится при старте. Если вы не пишете начальное значение, то на месте этой переменной лежат нулевые байты и грузится ноль. Это бывает удобно.

Переменные внутри функций называются локальными. Место под них выделяется (в стеке) каждый раз, когда вызывается функция, и это каждый раз может быть новое место. Если объявлен десяток локальных переменных без начальных значений, тогда для их обнуления пришлось бы вызывать десять раз присваивание нулю при каждом вызове функции - это дополнительное процессорное время. Поэтому вместо этого просто выделяется место в стеке - для этого надо один раз сдвинуть указатель конца занятой области - это быстрее. Но значение переменных при этом будет неопределенным - то, что лежало на этом месте в стеке раньше. Изначально язык Си делался с прицелом на самое быстрое исполнение, видимо, поэтому принудительное обнуление делать не стали.
NN
Namozjon Normurodov
2 757
Лучший ответ
Это нужно компилятор спрашивать конкретный.
Али Абенов
Али Абенов
93 469
Руслан Клангузов mingw - компилятор, никаких предустановок нет.
Не надо писать ненадёжный код используя всякие тонкости и "особенности языка". Они имеют "особенность" меняться с разными реализациями. Переменные очень желательно инициализировать дабы потом не удивляться.
Руслан Клангузов Простите, а вы читать умеете????
Перечитайте вопрос и ответ, вами отправленный. Они по смыслу не совпадают. Как писать код, учить меня не нужно, я прошу объяснить, или найти (ибо я не смог) почему объявляя перемнюенную внутри функции она не обнулина.
потому что в int main() память выделяется на стеке, а вне int main() в bss
https://en.wikipedia.org/wiki/.bss
память на стеке занулять в компиляторах не принято, разве что в целях безопасности там, где это уместно

ну как "не принято", скорее в стандарте зануление не оговорено, в отличие от зануления статических переменных из bss

на самом деле переменные и массивы выделяются на стеке в любом вызове функции, не только в main
Игорь Винников
Игорь Винников
51 164
Али Абенов Поэтому хороший стиль - всегда присваивать переменной значение при объявлении.
Руслан Клангузов Спасибо большое, осталось узнать, что такое bss)

Похожие вопросы