Visual Studio's compilers have flags for both standard conformance and MS extensions. The default is something. To be fair, GCC's default mode is to enable GNU extensions rather than strict standard.
Yes, they do, but up intil recent versions ANSI mode was unusable as many headers provided with compiler weren't compatible with it.
I actually dislike when different extensions are enabled by default (GCC valarray support, MS "Threat use of non-ms-specific c-string manipulation functions as error" (or warning, I don't remember)) and GCC defaults to C++03 mode.
The only difference is that when you declare i before the loop, it can be reused throughout the function it is in whereas, when you declare it within the loop. It can only be used within that loop, and if you attempted to call it outside of the loop you would get a compiler error stating that it is an undeclared variable.