当前位置: 代码迷 >> C语言 >> 很愧对老师这个职业,快帮帮我呀!不胜感谢
  详细解决方案

很愧对老师这个职业,快帮帮我呀!不胜感谢

热度:297   发布时间:2005-11-10 12:12:00.0
请17楼的说明一下你的4是在什么环境下得到的?

系统 + 编译器
----------------解决方案--------------------------------------------------------
在我的pc中运行printf("%d",sizeof('a'));结果也是2!怎么回事?
----------------解决方案--------------------------------------------------------
#include "stdio.h"
main()
{ printf("%d",sizeof('\n'));}

C-Free 3.5 & winxp sp2 结果是1
----------------解决方案--------------------------------------------------------
以下是引用baidu在2005-11-10 12:12:39的发言:
请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编辑过]


----------------解决方案--------------------------------------------------------
以下是引用ChenMo在2005-11-10 20:30:55的发言:

到底是编译器实现的不同,还是系统分配的问题我倒无法肯定,

不过对于 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楼的结果,我想不明白,所以,这个贴子我一直没回
----------------解决方案--------------------------------------------------------
  相关解决方案