'abc'的值是多少?

  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     /* 将单个字符赋值给整形变量,结果为字符的ASCII值 */  
  6.     int   a = 'a';  
  7.     printf("a = %d\n", a);  
  8.   
  9.     /* ?这里如何解释 */  
  10.     a = 'abc';  
  11.     printf("a = %d\n", a);  
  12.           
  13.     /* 将字符串赋值给整形变量,结果为字符串的地址值 */  
  14.     a = "a";  
  15.     printf("a = %d\n", a);  
  16.   
  17.     a = "abc";  
  18.     printf("a = %d\n", a);    
  19.     return 0;  
  20. }  

'abc'这样的写法,我也是第一次见到,居然编译器只给一个警告。

程序的运行结果是:

 

第二行的结果,即a = 'abc';后a的值显得诡异,跟贴中,大家纷纷猜测。

 

我对这种情况也不清楚,这时想到的是,要将整型数a中的4个字节中每个字节的值能分隔出来,应该就一目了然了,最好将每个字节解释成一个之字符直接输出来看。

想到了“联合体”union,将程序改造了一下,得到下面的程序:

 

  1. #include <stdio.h>  
  2. union un  
  3. {  
  4.     int i;  
  5.     char c[4];  
  6. };  
  7. int main(void)  
  8. {  
  9.     /* 将单个字符赋值给整形变量,结果为字符的ASCII值 */  
  10.     int   a = 'a';  
  11.     union un b;  
  12.     printf("a = %d\n", a);  
  13.     /* 这里的b.i就相当于原来的a,而b.c数组与b.i占用同一段4字节的空间 */  
  14.     b.i = 'abc';  
  15.     printf("b.i = %d\n", b.i);  
  16.     printf("b.c = %c %c %c %c\n", b.c[0], b.c[1],b.c[2],b.c[3]);  
  17.   
  18.     /* 将字符串赋值给整形变量,结果为字符串的地址值 */  
  19.     a = "a";  
  20.     printf("a = %d\n", a);  
  21.   
  22.     a = "abc";  
  23.     printf("a = %d\n", a);  
  24.     return 0;  

运行结果是:

 

结果不解释了,原理应该在“计算机组成原理”或“计算机体系结构”中介绍,学过汇编语言的人也明白。程序员学软件,要对计算机系统有理解,这是专业人员该关注的。

C/C++中的union,似乎在教学中都是一带而过,感兴趣的同学,再找其他资料了解了解即可。

永不止步步 发表于04-19 15:06 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308117个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号