Summary: globals have "static storage duration" (yes, static is way overloaded) and uninitialized variables of that type are cleared to zero automatically.
The final standards are not available for free, but late drafts are (see iso-9899.info). I'm using the C standard even though we Casey is technically using C++.
From 6.2.1, item 4 (define file scope):
... If the declarator or type specifier that declares the identifier appears outside of any block or list of parameters, the identifier has file scope, which terminates at the end of the translation unit.
From 6.7.1, item 1 (define storage-class specifier):
From 6.2.2, item 5 (establish globals have external linkage):
... If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.
From 6.2.4, item 1 (establish the different storage durations):
An object has a storage duration that determines its lifetime. There are three storage
durations: static, automatic, and allocated.
From 6.2.4, item 3 (establish that globals, which have external linkage, have static storage duration):
An object whose identifier is declared with external or internal linkage, or with the
storage-class specifier static has static storage duration. Its lifetime is the entire
execution of the program and its stored value is initialized only once, prior to program startup.
From 6.7.8, item 10 (establish uninitialized static storage duration types get set to zero):
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.
That was a bit painful... :)