积极答复者
错误语法带来的奇特现象,求解其背后运作机理

问题
-
程序非常之短
#include<stdio.h>
int main()
{
int p[2] = { 'abcd' };
printf("%s\n", p);
return 0;
}我知道不能往单引号中填字符串,但……其运行结果是dcba,这个程序会把单引号中的“字符串”(长度不能超过4)反过来输出,打印长度为2的数组却得到了4个字符,这不科学!照理说‘abcd’应该等于‘d'才对啊,求解运作机理!
- 已编辑 Free Quark 2013年11月21日 14:09
- 已移动 Sheng Jiang 蒋晟Moderator 2013年11月21日 14:33
答案
-
Free Quark,你好:
你定义p是整型,但是在printf里用的是%s,如果你把int p[2]改成char p[2],运行结果就是d了。
- 已标记为答案 Anna CcModerator 2013年11月26日 13:38
-
看这里,解释得很清楚 http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters
简单的说就是 int p[2] = {'abcd'} 相当于:
char c[] = {'a','b','c','d'}; int *p = (int*)c;
- 已标记为答案 Anna CcModerator 2013年11月26日 13:38
-
其实知道它原理也没啥特别的,但是这个在release模式下开优化不一定会工作
int是四个字节,'abcd'以int数组四个字节的方式赋值=0x61626364,因为int是低位在低地址,所以在内存里0x61626364,就成了0x64 0x63 0x62 0x61
打印出来就是dcda。
但是你这个是写的有问题的,数组第二个int没有值,所以它可能是任何数字,在这个程序里恰好碰到了0 ,不然还有乱码出现。写成int x[2]={'abcd', 0};就稳定了
你要写成int x[2]={"abcd", 0};输出的又是另一回事
0xDEADBEEF
- 已标记为答案 Anna CcModerator 2013年11月26日 13:38
全部回复
-
Free Quark,你好:
你定义p是整型,但是在printf里用的是%s,如果你把int p[2]改成char p[2],运行结果就是d了。
- 已标记为答案 Anna CcModerator 2013年11月26日 13:38
-
看这里,解释得很清楚 http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters
简单的说就是 int p[2] = {'abcd'} 相当于:
char c[] = {'a','b','c','d'}; int *p = (int*)c;
- 已标记为答案 Anna CcModerator 2013年11月26日 13:38
-
其实知道它原理也没啥特别的,但是这个在release模式下开优化不一定会工作
int是四个字节,'abcd'以int数组四个字节的方式赋值=0x61626364,因为int是低位在低地址,所以在内存里0x61626364,就成了0x64 0x63 0x62 0x61
打印出来就是dcda。
但是你这个是写的有问题的,数组第二个int没有值,所以它可能是任何数字,在这个程序里恰好碰到了0 ,不然还有乱码出现。写成int x[2]={'abcd', 0};就稳定了
你要写成int x[2]={"abcd", 0};输出的又是另一回事
0xDEADBEEF
- 已标记为答案 Anna CcModerator 2013年11月26日 13:38