系统 + 编译器
偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
到底是编译器实现的不同,还是系统分配的问题我倒无法肯定,
不过对于 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