user-0 提问: int a = 'abc';  结果是多少？如何理解？

回复:
user: user-1
content: #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; }

user: user-1
content: 在c++中， 仅 int a = 'a';有效。

user: user-2
content: zhege??

user: user-3
content: a = 'abc'; 这个定义很别扭，如果学了C语言基础，应该不会出现这样的定义； 首先字符和字符串在存储器中的区别是：字符串最后一位是结束符：'\0'，而字符没有结束符； 字符型和INT型是一样的； 你这样定义，即使编译通过，但是别人看到这个变量的定义，感觉很别扭；

user: user-4
content: a = 'abc'; mov         dword ptr [a],616263h

user: user-5
content: 将代码改为： #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 这个输出就清楚了。

user: user-6
content: a = 'abc';  就是一个宽字符

user: user-7
content: 'abc' 这种常量一般很少用， 只有VC开发驱动时，偶尔见过 是这样写的  L'DCBA'     //L'DCBA' 即 ABCD 定义一个常量，顺序是 ABCD， 是这4个字母的ASCII码的顺序排列。 用来做驱动程序的标志。

user: user-8
content: #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; }

user: user-9
content: #include <stdio.h>  int main(void) {     printf("%x\n", 'aabc');     return 0; }  打印了61616263，应该是当成个数字对待的吧.....

user: user-10
content: VC++6.0 这样写 a="a"与a="abc"会报错 那个 a='abc' 我也觉得是这么来的，一个a在VC中占一个字节 0110 0001 同理b为0110 0010 c为0110 0011 然后再合并就成了6382179

user: user-11
content: 那第四个字节呢？我说的是第四个字节！

user: user-12
content: 引用 16 楼 worldy 的回复:[quote=引用 7 楼 u011779875 的回复:]  6382179 代表的16进制是 616263 代表的是 abc  这个是正确的 我刚才只是猜测 我又没遇到过 后面没随机  第四个字节应该是个随机数 [/quote] 说法错误,第四个字节根本就不是个随机数,编译器直接用616263h来替换了'abc'了呀,你反汇编看一下就知道了

user: user-13
content: 学习了，提示我们数据的异常判断很重要。

user: user-14
content: 计算机组成原理→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、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-15
content: 引用 16 楼 worldy 的回复:[quote=引用 7 楼 u011779875 的回复:]  6382179 代表的16进制是 616263 代表的是 abc  这个是正确的 我刚才只是猜测 我又没遇到过 后面没随机  第四个字节应该是个随机数 [/quote]不是随机数 是00000000

user: user-11
content: 引用 7 楼 u011779875 的回复:6382179 代表的16进制是 616263 代表的是 abc  这个是正确的 我刚才只是猜测 我又没遇到过 后面没随机  第四个字节应该是个随机数

user: user-0
content: 经过试验得出结论：     a = 'abc';      VC、GCC里处理实际就是将三个字符的ASCII码二进制合并起来     0110 0001    0110 0010   0110 0011     合并后转换为十进制，结果就是6382179     'abc'是int，不是地址     用char ch = 'abc'，输出结果是'c'

user: user-16
content: 请问'abc'，里面的值到底是a、b还是c呢？  不同的编译器，处理不一样，ANSIC对此的结果是未定义。。。。

user: user-0
content: 引用 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 而下面字符串地址则会发生变化