老K,我没有ANSI C89 和 C99的说明,最好能发个英文版本上来看看
ChenMo关于1,2,4的解释没错
----------------解决方案--------------------------------------------------------
给你一个提示,这个与编译器的标准有关。也就是C89隐含的int规则,而c99没这规则
但是,17楼的结果,我想不明白,所以,这个贴子我一直没回
隐含的 int 规则 ―― 我只认为是隐含指定“不指定函数类型的函数”为 int。
那么这原因应该是:char 默认转换为 int 类型处理了,既然有两字节存储能力,那么一个字符常量就可以写两个了 ―― 'ab' ?……
[此贴子已经被作者于2005-11-11 7:32:43编辑过]
----------------解决方案--------------------------------------------------------
'ab'这个在16位编译器中是合法
'abcd'这个在32位编译器中是合法
这个叫多字节字符常量
隐含的 int 规则 不仅用函数类型,也适用变量
如:
foo(a,b)
{......}
原先,我对有三种结果非常疑惑不解,我和你的看法是差不多,但你也无法解释怎么会有三种结果,现在我明白^_^
结果是 2,4的用的都是C标准去编译的
结果是 1 的用的是c++标准去编译的
----------------解决方案--------------------------------------------------------
可是有人用VC得4
----------------解决方案--------------------------------------------------------
VC得4,他编译时用的是C89标准,也就是说17楼的在编译时其源文件后缀用的是 .c
----------------解决方案--------------------------------------------------------
咦,你又。。。
----------------解决方案--------------------------------------------------------
to Knocker
我认为,我已经在"原因2. 任何整数在运算的过程中都将被视为int型!"这一句中说明了隐含int规则了
'a'如果不进行变量赋值char a='a'的话,默认类型int
'ab'和'abcd'分别在16位和32位中是合法的那是因为他们采用的寄存器是16位的和32位的,一旦写入内存还是得按照预先声明的格式 (''为字符char类型) 进行
char a='aa',*p=&a;
printf("%c,%c",*p,*(p+1));
很明显的,*(p+1)的输出不会是a
所以这里的问题不是你所说的多字节字符常量的原因
结果是1的
char a='a';
printf("%d",sizeof a);//因为char本来就规定为8个字节
这个是一定的,不管你的编译器是什么牌子
用
printf("%d",sizeof 'a');
得2或者4的朋友,我认为这里是由C语言C89标准默认int规则导致的,而在不同的编译器中,int的大小是不同的故得出2或者4
但是我觉得得2的朋友比较多,因为C89的C编译器大多是16位的
但是在c99中废除的默认int规则,也就是说'a'的长度在C99中是必须为1的,从'aa'开始到'aaaa'才被编译器强制转换为int类型所以'a'还是会被认为是char类型,sizeof的结果自然为1
----------------解决方案--------------------------------------------------------
我靠,我发了34楼的回复后到37楼竟然用了半个小时,服务器一直说他忙~郁闷
----------------解决方案--------------------------------------------------------
[QUOTE]printf("%d",sizeof 'a');
得2或者4的朋友,我认为这里是由C语言C89标准默认int规则导致的,而在不同的编译器中,int的大小是不同的故得出2或者4
但是我觉得得2的朋友比较多,因为C89的C编译器大多是16位的[/QUOTE]
我的测试这个是对的
[QUOTE]但是在c99中废除的默认int规则,也就是说'a'的长度在C99中是必须为1的,从'aa'开始到'aaaa'才被编译器强制转换为int类型所以'a'还是会被认为是char类型,sizeof的结果自然为1[/QUOTE]
我用C99得的还是 4
只有用c++得的才是 1
不知别人是否还有其它结果
----------------解决方案--------------------------------------------------------
是吗?把你的C语言标准资料发上来看一看啊~
你C99采用的是什么编译器,我也去看看
目前也只能有1,2,4这三种结果了,不会出现0,3,8吧
----------------解决方案--------------------------------------------------------