系统 + 编译器
----------------解决方案--------------------------------------------------------
在我的pc中运行printf("%d",sizeof('a'));结果也是2!怎么回事?
----------------解决方案--------------------------------------------------------
#include "stdio.h"
main()
{ printf("%d",sizeof('\n'));}
C-Free 3.5 & winxp sp2 结果是1
----------------解决方案--------------------------------------------------------
请17楼的说明一下你的4是在什么环境下得到的?
系统 + 编译器
系统2000。编译器vc.版本不知道。
----------------解决方案--------------------------------------------------------
到底是编译器实现的不同,还是系统分配的问题我倒无法肯定,
不过对于 sizeof('\n') 的问题,
我想这样解释会好些:将 sizeof('\n') 当作是 sizeof(13) 会让人觉得好理解一点,
理由是:计算机能处理的只是字符的 ASCII 码,而字符的 ASCII 是一个整数。
此外需要知道的是,sizeof 同样能求常量的宽度,如 sizeof(1.235) 的宽度求得的结果是 8,
因为双精度的长度在常规编译器下的宽度就是8。
当然也会存在一些编译器实现的不同的因素,因为变量的存储长度是由各编译系统只由定义的,
只要能保证对变量基本单位的值是相同的应该就行了。
如:
char T = '\n';
sizeof(T) ,对于字符变量T而言,应该无论哪个编译系统得出的都是 1。
sizeof(常量) 格式的宽度可能会因为编译系统不同而不同,就如 sizeof('\n') 来说,
Borland Turbo C 2.0 下的值是 2,可能的原因便是:'\n' 的值是一个整型变量 13,
尝试一下在 TC2 下求65536的长度 ―― sizeof(65536),结果是 4。
这便说明了,当常量值属于某一范围的类型,TC2 便使用该类型的长度。
在 TC2 下,short int 与 int 的长度都是 16 位,所以无论是 '\n'(值为 short 类型的 13),还是 'A' (值为 short 类型 65), TC 都视其长度为 2 字节。
而出现 VC 的“1字节”、“2 字节”甚至“4 字节”的原因应该也因为此,VC 的整型值是 32 位的,也就是 4 个字节,所以当使用 sizeof(13) 的时候,将会得到的值是 4,
虽然 VC 在处理 sizeof 的时候,与 TC 一样能按值表示的范围求得该常量的类型,
对于字符类型为什么能准确求得 1,只能这种求字符常量宽度的能力,VC 的 sizeof 是能被支持的――那是一个字符类型。
以上仅属本人掘见,只供参考。
[此贴子已经被作者于2005-11-10 20:43:52编辑过]
----------------解决方案--------------------------------------------------------
到底是编译器实现的不同,还是系统分配的问题我倒无法肯定,
不过对于 sizeof('\n') 的问题,
我想这样解释会好些:将 sizeof('\n') 当作是 sizeof(13) 会让人觉得好理解一点,
理由是:计算机能处理的只是字符的 ASCII 码,而字符的 ASCII 是一个整数。
此外需要知道的是,sizeof 同样能求常量的宽度,如 sizeof(1.235) 的宽度求得的结果是 8,
因为双精度的长度在常规编译器下的宽度就是8。
当然也会存在一些编译器实现的不同的因素,因为变量的存储长度是由各编译系统只由定义的,
只要能保证对变量基本单位的值是相同的应该就行了。
如:
char T = '\n';
sizeof(T) ,对于字符变量T而言,应该无论哪个编译系统得出的都是 1。
sizeof(常量) 格式的宽度可能会因为编译系统不同而不同,就如 sizeof('\n') 来说,
Borland Turbo C 2.0 下的值是 2,可能的原因便是:'\n' 的值是一个整型变量 13,
尝试一下在 TC2 下求65536的长度 ―― sizeof(65536),结果是 4。
这便说明了,当常量值属于某一范围的类型,TC2 便使用该类型的长度。
在 TC2 下,short int 与 int 的长度都是 16 位,所以无论是 '\n'(值为 short 类型的 13),还是 'A' (值为 short 类型 65), TC 都视其长度为 2 字节。
而出现 VC 的“1字节”、“2 字节”甚至“4 字节”的原因应该也因为此,VC 的整型值是 32 位的,也就是 4 个字节,所以当使用 sizeof(13) 的时候,将会得到的值是 4,
虽然 VC 在处理 sizeof 的时候,与 TC 一样能按值表示的范围求得该常量的类型,
对于字符类型为什么能准确求得 1,只能这种求字符常量宽度的能力,VC 的 sizeof 是能被支持的――那是一个字符类型。
以上仅属本人掘见,只供参考。
----------------解决方案--------------------------------------------------------
呵呵,好久没上C语言版块来灌水了,趁Knocker不在,赶紧把我的想法说说
其实大家都被蒙蔽在鼓里了。
这不是什么高深的问题,也不是什么C语言的缺陷,其实ChenMo说对了一半
而且是致命的一半,他说出了1,2,4的由来,但是他没说出为什么会得出这
1,2,4出来。
原因1. sizeof既不是个函数,也不是个宏,
而是一个实实在在的单目运算符,如同++、--
原因2. 任何整数在运算的过程中都将被视为int型!
这就是ChemMo所说的
"sizeof(常量) 格式的宽度可能会因为编译系统不同而不同"
这是关键,也是他说得不完全对的地方。
'\n'是一个整数10,'a'、'b'等等他们如果直接作为运算符的操作数的话将会被直接看成int型
剩下的也就如同ChenMo所说:"在 TC2 下,short int 与 int 的长度都是 16 位,所以无论是 '\n'(值为 short 类型的 13),还是 'A' (值为short 类型 65), TC 都视其长度为 2 字节。
而出现 VC 的“1字节”、“2 字节”甚至“4 字节”的原因应该也因为此,VC 的整型值是 32 位的,也就是 4 个字节,所以当使用 sizeof(13) 的时候,将会得到的值是 4"
举个例子
int main(void)
{
printf("%d\n",sizeof 'a');
printf("%d\n",sizeof ('a'+0.1));
getch();
}
输出2和8
----------------解决方案--------------------------------------------------------
我在,你的原因二说错了
----------------解决方案--------------------------------------------------------
老K,那你说错那里
----------------解决方案--------------------------------------------------------
给你一个提示,这个与编译器的标准有关。也就是C89隐含的int规则,而c99没这规则
但是,17楼的结果,我想不明白,所以,这个贴子我一直没回
----------------解决方案--------------------------------------------------------