'abc'的值是多少?

简介: 看见一个贴子,发贴人搞不清输出结果中的“为什么”(见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,似乎在教学中都是一带而过,感兴趣的同学,再找其他资料了解了解即可。




目录
相关文章
String对象的特点,new创建的字符串对象地址值不同,String s3 = “abc“; s4=“abc“ sout(s1 == s2)比较地址和内容,s1.equals(s3)比较内容
String对象的特点,new创建的字符串对象地址值不同,String s3 = “abc“; s4=“abc“ sout(s1 == s2)比较地址和内容,s1.equals(s3)比较内容
|
4月前
String字符串的替换 生成新的字符串
String字符串的替换 生成新的字符串
31 0
求a+aa+aaa+aaaa+aaaaa的值
求a+aa+aaa+aaaa+aaaaa的值
118 0
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制
749 0
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制
lodash检查字符串string是否以给定的字符串结尾
lodash检查字符串string是否以给定的字符串结尾
179 0
检查`string`是否以给定的目标字符串结尾
检查`string`是否以给定的目标字符串结尾
91 0
|
存储 算法 Java
First Unique Character in a String (找到一个字符串中第一个不重复的字符)
针对给定的一个字符串 s,你需要写一个算法,返回给定字符串中不重复字符的位置(index),如果所有的字符在给定的字符串中都有重复的话,那么你应该返回 -1。
331 0
string.replace 用变量替换
string.replace 用变量替换
164 0