ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
看见一个贴子,发贴人搞不清输出结果中的“为什么”(见[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'这样的写法,我也是第一次见到,居然编译器只给一个警告。   程序的运行结果是:   ![](https://box.kancloud.cn/2016-06-07_575640493855f.jpg)   第二行的结果,即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; } ~~~   运行结果是:   ![](https://box.kancloud.cn/2016-06-07_5756404955930.jpg)   结果不解释了,原理应该在“计算机组成原理”或“计算机体系结构”中介绍,学过汇编语言的人也明白。程序员学软件,要对计算机系统有理解,这是专业人员该关注的。   C/C++中的union,似乎在教学中都是一带而过,感兴趣的同学,再找其他资料了解了解即可。