看見一個貼子,發貼人搞不清輸出結果中的“為什么”(見[http://bbs.csdn.net/topics/390623518](http://bbs.csdn.net/topics/390623518))。給出的程序是:
~~~
#include <stdio.h>
int main(void)
{
/* 將單個字符賦值給整形變量,結果為字符的ASCII值 */
int a = 'a';
printf("a = %d\n", a);
/* ?這里如何解釋 */
a = 'abc';
printf("a = %d\n", a);
/* 將字符串賦值給整形變量,結果為字符串的地址值 */
a = "a";
printf("a = %d\n", a);
a = "abc";
printf("a = %d\n", a);
return 0;
}
~~~
'abc'這樣的寫法,我也是第一次見到,居然編譯器只給一個警告。
程序的運行結果是:

第二行的結果,即a = 'abc';后a的值顯得詭異,跟貼中,大家紛紛猜測。
我對這種情況也不清楚,這時想到的是,要將整型數a中的4個字節中每個字節的值能分隔出來,應該就一目了然了,最好將每個字節解釋成一個之字符直接輸出來看。
想到了“聯合體”union,將程序改造了一下,得到下面的程序:
~~~
#include <stdio.h>
union un
{
int i;
char c[4];
};
int main(void)
{
/* 將單個字符賦值給整形變量,結果為字符的ASCII值 */
int a = 'a';
union un b;
printf("a = %d\n", a);
/* 這里的b.i就相當于原來的a,而b.c數組與b.i占用同一段4字節的空間 */
b.i = 'abc';
printf("b.i = %d\n", b.i);
printf("b.c = %c %c %c %c\n", b.c[0], b.c[1],b.c[2],b.c[3]);
/* 將字符串賦值給整形變量,結果為字符串的地址值 */
a = "a";
printf("a = %d\n", a);
a = "abc";
printf("a = %d\n", a);
return 0;
}
~~~
運行結果是:

結果不解釋了,原理應該在“計算機組成原理”或“計算機體系結構”中介紹,學過匯編語言的人也明白。程序員學軟件,要對計算機系統有理解,這是專業人員該關注的。
C/C++中的union,似乎在教學中都是一帶而過,感興趣的同學,再找其他資料了解了解即可。