1. When we write printf("%d",x); this means
compiler will print the value of x. But as here, there is nothing
after %d so compiler will show in output window garbage value.
2. When we use %d the compiler internally uses it to access the
argument in the stack (argument stack). Ideally compiler determines
the offset of the data variable depending on the format
specification string. Now when we write printf("%d",a) then compiler
first accesses the top most element in the argument stack of the
printf which is %d and depending on the format string it calculated
to offset to the actual data variable in the memory which is to be
printed. Now when only %d will be present in the printf then
compiler will calculate the correct offset (which will be the offset
to access the integer variable) but as the actual data object is to
be printed is not present at that memory location so it will print
what ever will be the contents of that memory location.
3. Some compilers check the format string and will generate an error
without the proper number and type of arguments for things like
printf(...) and scanf(...).