标题:很愧对老师这个职业,快帮帮我呀!不胜感谢
只看楼主
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
请17楼的说明一下你的4是在什么环境下得到的?

系统 + 编译器

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2005-11-10 12:12
zhqtao
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-11-10
得分:0 
在我的pc中运行printf("%d",sizeof('a'));结果也是2!怎么回事?
2005-11-10 15:39
freeforever
Rank: 4
等 级:业余侠客
威 望:3
帖 子:368
专家分:201
注 册:2005-11-2
得分:0 
#include "stdio.h"
main()
{ printf("%d",sizeof('\n'));}

C-Free 3.5 & winxp sp2 结果是1

其实我也很无聊!
2005-11-10 16:38
ghy2001
Rank: 1
等 级:新手上路
威 望:1
帖 子:87
专家分:0
注 册:2005-10-30
得分:0 
以下是引用baidu在2005-11-10 12:12:39的发言:
请17楼的说明一下你的4是在什么环境下得到的?

系统 + 编译器

系统2000。编译器vc.版本不知道。


2005-11-10 19:24
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
得分:0 

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

不过对于 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编辑过]


欢迎加入 MVC 技术讨论群(新群:90093426)
2005-11-10 20:30
不羁浪子
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2004-6-16
得分:0 
以下是引用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 是能被支持的——那是一个字符类型。

以上仅属本人掘见,只供参考。




我虽然菜! 但我会更努力!
2005-11-10 23:41
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 

呵呵,好久没上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


淘宝杜琨
2005-11-11 00:04
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
我在,你的原因二说错了

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2005-11-11 00:07
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 

老K,那你说错那里


淘宝杜琨
2005-11-11 00:12
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
给你一个提示,这个与编译器的标准有关。也就是C89隐含的int规则,而c99没这规则
但是,17楼的结果,我想不明白,所以,这个贴子我一直没回

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2005-11-11 00:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-32990-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.291737 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved