C的''符号输出字符串问题,求C语言大神解决!!
我记得以前有人发过的,下面的这个程序是输出的cba,这个是内存大小端模式存储数据的问题,我可以理解。
#include <stdio.h>
int main()
{
int a = 'abc';
printf("%s", &a);
system("pause");
return 0;
}
但是下面的这个程序为什么不是输出edcba???
#include <stdio.h>
int main()
{
// long a = 'abcde';
long a = 256 * 256 * 'abc' + 'de';
printf("%s", &a);
system("pause");
return 0;
}
long a = 'abcde',报错我就认了,大概是''最多容纳转换四个字节吧。但是long a = 256 * 256 * 'abc' + 'de',转化过来的值也一样了,为什么还是不行呢?难道是long的数据问题???还是其它的什么问题???
求大神解决!!!!
[解决办法]
'abc'这种单引号内有多个字符的用法不符合C标准。
还是看看《C语言参考手册》吧。
(('a'<<16)|('b'<<8)|('c')) 这样的写法符合标准。
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
不要写连自己也预测不了结果的代码!
[解决办法]
呵呵,我也来说说这玩意吧,这货叫"多字节字符常量",,在标准文档中有提到这货,但是,这货如何存储的,是环境决定的(编译器决定的),这个确实不属于未定义行为,这个行为是可重现的,
好了,说完这货是什么东西之后,来解释楼主的问题出在哪吧,,楼主的问题确实是出在类型上,但楼主有点想当然了,他想当然的认为等号后面的值会按long型计算,,而事实上,'abc'的值是0x616263,,256的值是0x100,
这个计算过程是,首先,这两个数都可以用int型存储下,所以,在计算前先做整形提升,变成了0x00000100*0x00000100
得到0x00010000,再去与整形提升后的0x00616263相乘,很悲剧,*两端的数都是能够用int表示的,所以得数也是int,结果本应该是0x6162630000但这个数超过了int范围,而结果必须是int,所以产生截断,变成了0x62630000,然后与后面的'de'相加,得到的结果应该是0x62636465,,然后把这个值赋给了long,实际上这个long的存储方式是0x0000000062636465(如果你的long是64位的话,如果你的long是32位的,那和前面的就一样了,建议使用long long类型,肯定是64位以上的),
这就很明显了,如果按楼主前一个程序的方式来算的话,这个输出应该是edcb,,