字符串超有趣有关问题

字符串超有趣问题!

#include <stdio.h>
int main()
{
printf("%d" "%d" "%d" "%d" "\n", 1, 2, 3, 4);//为什么这样也行?
return 0;
}

学习宏中无意中发现的
本来是这样的

#include <stdio.h>
#define D "%d"
#define NL "\n"
#define D4 D D D D NL
int main()
{
printf(D4, 1, 2, 3, 4);
return 0;
}

为什么这样也行?不应该是

printf("%d %d %d %d \n",1,2,3,4);

这样的吗????
------解决方案--------------------
标准规定 
预处理阶段 把代码中任一多个空白字符分割的字符串字面量处理为一个字符串

------解决方案--------------------
参考MSDN:http://msdn.microsoft.com/zh-cn/library/wc7014hz.aspx
int printf(
   const char *format [,
   argument]... 
);
参数

format

    格式控件。
argument

    可选参数。
实例:
   char     ch = 'h', 
            *string = "computer";
   wchar_t  wch = L'w', 
            *wstring = L"Unicode";
   int      count = -9234;
   double   fp = 251.7366;

   // Display integers
   printf( "Integer formats:\n"
           "   Decimal: %d  Justified: %.6d  "
           "Unsigned: %u\n",
           count, count, count, count );
------解决方案--------------------
#include <stdio.h>
int main()
{
    printf("%d" "%d" "%d" "%d" "\n", 1, 2, 3, 4);//为什么这样也行?
    return 0;
}


C标准中会自动把中间的双引号去掉,这个语句跟
printf("%d %d %d %d \n", 1, 2, 3, 4);

这句效果是一样的。
------解决方案--------------------
c语言规定。。。