Using the gcc compiler (WinAVR) then all global variables are set to 0 before calling your main.
Some folk have said that you should initialise variables explicitly to avoid confusion. ie:
int myVar = 0;
In an 'ideal' world this is true - because you can read the code and know that the start value is 0.
However: doing this will actually make your 'program' bigger - ie it will need more flash memory !
Well all un-initialised variables are just lumped together into sequential bytes of RAM (called the BSS). The C compiler then inserts a 'for' loop to zap all of these to zero before calling your main since it knows how many there are and how big they are.
The compiler also lumps together all the variables that you give an initial value to. It has no choice but to store this list of initial values in program (flash) memory. It then has a similar 'for' loop, before your main, to copy all of these initial values out of your program memory and into the RAM.
So if you initialise global variables to a specific value then the variable will take up not only runtime RAM space but also the same amount of flash/program space to store the initial value.
Of course if you are using a large AVR then this may not be a problem.