Почему статические переменные детерминированно инициализированы, а локальные - нет?
Посмотрите, как реализованы статические переменные. Память для них выделяется во время соединения, и начальное значение для них также предоставляется во время соединения. Нет никаких накладных расходов времени выполнения.
С другой стороны, память для локальных переменных выделяется во время выполнения. Стек должен расти. Вы не знаете, что там было раньше. Если вы хотите, вы можете очистить эту память (обнулить ее), но это приведет к накладным расходам времени выполнения. Философия C ++ гласит: «Вы не платите за вещи, которые не используете», поэтому по умолчанию она не обнуляет эту память.
Хорошо, но почему статические переменные инициализируются нулем, а не каким-либо другим значением?
Ну, вы обычно хотите что-то сделать с этой переменной. Но тогда как вы узнаете, была ли она инициализирована? Вы можете создать статическую логическую переменную. Но тогда это также должно быть надежно инициализировано чем-то (предпочтительно ложным). Как насчет указателя? Вы бы предпочли, чтобы оно было инициализировано значением NULL, а не каким-то случайным мусором. Как насчет struct / record? Внутри него есть некоторые другие данные. Имеет смысл инициализировать все их значения по умолчанию. Но для простоты, если вы используете стратегию «Initialize to 0», вам не нужно проверять отдельных членов и проверять их типы. Вы можете просто инициализировать всю область памяти на 0.
Это не совсем техническое требование. Семантика инициализации все еще может считаться разумной, если значением по умолчанию является что-то отличное от 0, но все еще детерминированное. Но тогда какой должна быть эта ценность? Вы можете довольно легко объяснить, почему используется 0 (хотя на самом деле это звучит несколько произвольно), но объяснить -1 или 1024 кажется еще сложнее (особенно если переменная может быть недостаточно большой, чтобы содержать это значение и т. Д.).
И вы всегда можете инициализировать переменную явно.
И у вас всегда есть параграф 8.5.6 стандарта C ++, который гласит: «Каждый объект статической длительности хранения должен быть инициализирован нулем при запуске программы».
Для получения дополнительной информации, пожалуйста, обратитесь к этим другим вопросам: