Ответы:
Потому что эти переменные доступны всей программе, а значит могут быть случайно изменены не той функцией, что надо. И такую ошибку очень сложно искать. Кроме того, они занимают имена.
Это не плохо. Это малоприменимо, поскольку возникают многочисленные трудности программирования, НО применимо. Мегасложный алгоритм легче составить и отладить без многочисленных глобальных переменных и применить их только в специальных случаях. Возникает так называемый "гнилой код", большая многомодульная программа (в связке с операционной системой) очень нестабильна, а "выловить" связанные с этим семантически ошибки чрезвычайно трудно или невозможно вследствие ограниченного времени разработки ПО. А вот в простеньких программах - пожалуйста, применяйте, но учтите - у Вас выработается плохой стиль программирования.
Говорить в программировании что что-то в общем плохо - это неправильно. Все зависит от ситуации.
Глобальные переменные - это переменные доступные всем модулям и живущие все время выполнения программы. Соответственно они еще и занимают место.
Локальные переменные - это переменные доступные только из текущего модуля и живущие вместе с модулем.
Если бы создание глобальных переменных - было очень плохо, то их бы не было в языке. Раз они есть значит есть случаи, когда они необходимы.
На практике пользуйся правилом - сначала создаются локальные переменные внутри функции/процедуры, потом внутри модуля, и только в последнюю очередь глобальные.
По моему опыту они плохи тем, что программу становится труднее поддерживать и модифицировать. А для любой программы, хотя бы с 10 пользователями цикл поддержки гораздо дольше разработки. 10 раз пожалеете. Вот конкретные затыки:
Допустим программа оперирует с каким-то сложным объектом, который хранится в файле, например с изображением, и экземпляр открытого файла описан сложной структурой, которая хранится в глобальной переменной. Для того чтобы заставить программу работать с 2-я файлами вам одновременно, переключаясь между ними, вам придется переделывать переменную на массив и изменять ВСЕ места в программе, в которых к ней идет обращение.
Если вам при этом придется добавлять многопоточность, то вы быстрее перепиште весь код чем поймете, в каких местах две разные функции одновременно пишут в глобальную переменную.
Если у вас какая-то часть получилась очень удачно и вы захотите включить ее в другой свой проект, то вам придется тащить еще и все глобальные переменные.
13 лет назад