int a = 'abc'; 结果是多少?如何理解?

netbooting 2013-10-24 01:20:03

#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;
}



输出结果
a = 97
a = 6382179
a = 4206600
a = 4206602

...全文
1436 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-10-25
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
	
	int   a = 'a'; //type promotion
	printf("a = %d\n", a);

	
	a = 'abc';
	//printf("a = %d\n", a);
        printf("a = %x\n", a); //616263, 0x61 == 97 == 'a'
		
	//it's okay to convert char const* to int in C
	a = "a";
	printf("a = %d\n", a);

	a = "abc";
	printf("a = %d\n", a);	
	return 0;
}

mujiok2003 2013-10-25
  • 打赏
  • 举报
回复
在c++中, 仅
int a = 'a';
有效。
pc_zhoucw 2013-10-25
  • 打赏
  • 举报
回复
zhege??
亚细亚 2013-10-25
  • 打赏
  • 举报
回复
a = 'abc'; 这个定义很别扭,如果学了C语言基础,应该不会出现这样的定义; 首先字符和字符串在存储器中的区别是:字符串最后一位是结束符:'\0',而字符没有结束符; 字符型和INT型是一样的; 你这样定义,即使编译通过,但是别人看到这个变量的定义,感觉很别扭;
largeskymengsk 2013-10-25
  • 打赏
  • 举报
回复
a = 'abc'; mov dword ptr [a],616263h
迂者-贺利坚 2013-10-25
  • 打赏
  • 举报
回复
将代码改为:

#include <stdio.h>
union un
{
	int i;
	char c[4];
};
int main(void)
{
	/* 将单个字符赋值给整形变量,结果为字符的ASCII值 */
	int   a = 'a';
	printf("a = %d\n", a);
	/* ?这里如何解释 */
	union un b;
	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;
}

运行结果: a = 97 b.i = 6382179 b.c = c b a (非Ascii符号) a = 4206665 a = 4206667 这个输出就清楚了。
ZG 2013-10-25
  • 打赏
  • 举报
回复
a = 'abc'; 就是一个宽字符
lm_whales 2013-10-25
  • 打赏
  • 举报
回复
'abc' 这种常量一般很少用, 只有VC开发驱动时,偶尔见过 是这样写的 L'DCBA' //L'DCBA' 即 ABCD 定义一个常量,顺序是 ABCD, 是这4个字母的ASCII码的顺序排列。 用来做驱动程序的标志。
ForestDB 2013-10-25
  • 打赏
  • 举报
回复
#include <stdio.h> int main(void) { int a = 'a'; printf("a = %d\n", a); printf("a = %x\n", a); // 顺便也看看%x的输出 a = 'abc'; // 这个叫multi-character character constant printf("a = %d\n", a); printf("a = %x\n", a); // 顺便也看看%x的输出 a = "a"; // 这个和下个都是把一个地址赋给a了 printf("a = %d\n", a); a = "abc"; printf("a = %d\n", a); return 0; }
SoWhat 2013-10-24
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
    printf("%x\n", 'aabc');
    return 0;
}
打印了61616263,应该是当成个数字对待的吧.....
N33_烟灰 2013-10-24
  • 打赏
  • 举报
回复
VC++6.0 这样写 a="a"与a="abc"会报错 那个 a='abc' 我也觉得是这么来的,一个a在VC中占一个字节 0110 0001 同理b为0110 0010 c为0110 0011 然后再合并就成了6382179
worldy 2013-10-24
  • 打赏
  • 举报
回复
那第四个字节呢?我说的是第四个字节!
  • 打赏
  • 举报
回复
引用 16 楼 worldy 的回复:
[quote=引用 7 楼 u011779875 的回复:] 6382179 代表的16进制是 616263 代表的是 abc 这个是正确的 我刚才只是猜测 我又没遇到过 后面没随机
第四个字节应该是个随机数 [/quote] 说法错误,第四个字节根本就不是个随机数,编译器直接用616263h来替换了'abc'了呀,你反汇编看一下就知道了
ooolinux 2013-10-24
  • 打赏
  • 举报
回复
学习了,提示我们数据的异常判断很重要。
赵4老师 2013-10-24
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物; 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
lin5161678 2013-10-24
  • 打赏
  • 举报
回复
引用 16 楼 worldy 的回复:
[quote=引用 7 楼 u011779875 的回复:] 6382179 代表的16进制是 616263 代表的是 abc 这个是正确的 我刚才只是猜测 我又没遇到过 后面没随机
第四个字节应该是个随机数 [/quote]不是随机数 是00000000
worldy 2013-10-24
  • 打赏
  • 举报
回复
引用 7 楼 u011779875 的回复:
6382179 代表的16进制是 616263 代表的是 abc 这个是正确的 我刚才只是猜测 我又没遇到过 后面没随机
第四个字节应该是个随机数
netbooting 2013-10-24
  • 打赏
  • 举报
回复
经过试验得出结论: a = 'abc'; VC、GCC里处理实际就是将三个字符的ASCII码二进制合并起来 0110 0001 0110 0010 0110 0011 合并后转换为十进制,结果就是6382179 'abc'是int,不是地址 用char ch = 'abc',输出结果是'c'
  • 打赏
  • 举报
回复
请问'abc',里面的值到底是a、b还是c呢? 不同的编译器,处理不一样,ANSIC对此的结果是未定义。。。。
netbooting 2013-10-24
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
[quote=引用 2 楼 u011779875 的回复:] a = 'abc'; printf("a = %d\n", a); 'abc'代表的是一段内存地址 存的是979899xx的二进制 xx是随机的意思 而a是int型的 所以取四个字节吧 就会取到6382179 我没有具体算 但是应该是这样
别闹 'abc' 不是"abc" 'abc'只是一个int 表示的值依赖实现 这里是想为 0x979899 没有后面随机二进制 [/quote] 觉得你说的是对的,'abc'不是一个地址值 我用三种编译器编译运行这个程序,结果都是6382179 而下面字符串地址则会发生变化
加载更多回复(12)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧