s1结果?why? (300分)

  • 主题发起人 主题发起人 影 子
  • 开始时间 开始时间
结果是 'Hello' 完全正确。
简单说是因为资源分配和字符串结束符号以及’+‘的运算符问题。
强烈建议不明白的去看看清华大学 95 年左右出的一本 PASCAL 编程的
入门书籍,里面关于这个说的很详细。我是心里明白,不过说不出来。
郁闷

一开始 s1 = 'hello';分配了5个字符资源。
s2和s3='',没有分配资源。
s1=s2+s3,因为S2,S3相当于没有任何东西。自然S1还是’Hello‘。(因为没有字符串结束符号)
如果是s1=s2+s3+#0就不同了,相当于S1='#0ello',这个时候S1显示出来就是'';
如果该为 s2,s3= ' '//1个空格
s1=s2+s3,s1=' '了。//2个空格
说得一塌糊涂。具体可以去看看PASCAL语言。
 
to 楼上的:
为什么AnsiString 没有这种问题呢?
我想:
如果 s2 = '';
s3 = '';
s1 := s2 + s3;
则s1必须等于 '' ,否则就是错了
这是概念和实现的问题,除非你证明概念有误,否则就是语言实现错了
 
绝对是个Bug.
如果s1:=s2+s3+#13, 则s1='',但是s1:=s2+s3,s1='hello'。
简直是莫名其妙!WideString有问题。
 
to楼上的楼上://写完变成不是楼上的了,郁闷
长字符串可以用预定义的标识符 AnsiString 来声明,也可以把编译开关{$H}设为
{$H+}后用保留字 String 来声明的。长字符串的最大长度几乎是无限制的,理论上可
达到 2GB,实际上只受计算机的内存限制。
长字符串类型的变量实际上是一个 32 位的指针,指向为字符串动态分配的一块区域。
如果字符串是空的,则指针的值就是 NIL。对长字符串类型的变量赋值,实际上只是复制一个32 位的指针,而不是长字符串的全部字符。
正因为长字符类型的变量实际上是一个指针,所以多个变量可以同时引用同一个长
字符串,内存中不会重复开辟多个区域。另外,长字符串具有引用记数机制,所以即使
多个变量引用的是同一个字符串,修改其中一个变量的值,也不会影响其它变量的值。
长字符串在声明后自动被初始化为空字符串,与字符串变量是全局的还是局部的无关。
// 长字符串有太多特点,说不完,不过解析楼上的问题应该够用了。
// 如果还是不了解,建议自己去看看 OBJECT PASCAL 的入门书籍
 
to 楼上的兄弟:
你所说的这么多东西,实际上和楼主的题目没有任何关系,
大家其实是在说的宽字符串(WideString),
而不是说的长字符串(AnsiString或String),
长字符串和宽字符串的区别主要有两点:
一个字符是8位的,另一个字符是16位的Unicode字符集
一个是基于引用计数管理内存的,另一个不是(主要是为了兼容COM调用中的BSTR)
但是在Linux(Kylix)中,它也是基于引用计数的,仅仅是字符宽度不同
他们都是引用类型,都是一个32位的指针,引用一块内存的
但是,这些说法,和题目有关系吗?能够解释 s1='Hello' 吗?
那该怎么去解释呢? 麻烦楼上的兄弟详细的解释解释吧,愿闻高见!
(Object Pascal的入门书籍现在是很少看了,即使看了,恐怕也解释不了这个问题)
注意: 这个题目中用的是 WideString 而不是长字符串
 
s1:= s2;
显示空。
s1:= s2 + s2;
显示'Hello'。
s1:= s2 + s2 + s2;
显示空。
s1:= s2 + s2 + s2 + s2;
显示空。
s1:= s2 + s3;
显示'Hello'。
s1:= s2 + s3 + s3;
显示空。
s1:= s2 + s2 + s3 + s3;
显示空。
只要是两个相加,就是Hello,否则正确。
 
也许是我们的理解方法不对。
打倒日本
国人当自强
 
建议楼主看看这段代码,这是Delphi自己带的帮助,看过之后,也许就能明白为什么把变量设成WideString为何会显示Hello的原因:
The WideChar type allows wide character strings to be represented as arrays of WideChars. Wide strings are strings composed of 16-bit Unicode characters. As with long strings, wide strings are dynamically allocated with a maximum length of two Gigabytes, but the practical limit is usually dependent on the amount of available memory. In Delphi, wide strings are not reference-counted. Every assignment of a wide string to a wide string var creates a copy of the string data. In Kylix, WideStrings are reference counted.
The dynamically allocated memory that contains the string is deallocated when the wide string goes out of scope. In all other respects wide strings possess the same attributes as long strings. The WideString type is denoted by the predefined identifier WideString.
Since the 32-bit version of OLE (Windows only) uses Unicode for all strings, strings must be of wide string type in any OLE automated properties and method parameters. Also, most OLE API functions use null-terminated wide strings.
For more information, see WideString.
 
灭了小日本
 
To Rudder:
  你不要给一段E文之后,希望楼主看了能明白。
  问题你明白了没有,如果你明白了,能用中文说一说为什么吗?[:)]
 
楼上的,你说的太好了,痛快,很多人就是这样,对别人的求助,贴上一大段E文Help,让你看明白就好了,他自己明白了吗?要是看E文Help能明白还来问什么?
爽!
 
to all:
宽字符串后面有几个#0?
 
pyzfl,dirk 真是明白人,
我就搞不明白,某些人根本就不懂,
而且贴出来的文字或发表的高论和楼主的题目毫不相关,
却以为自己懂了,还想让别人“懂”,(我甚至怀疑他连那段E文都不懂)
具体是谁,看看上面的回复就明白了
现在我已经确认,这的确是个Bug,
(仅仅是在两个空的宽字符串相加时才会出现)
我在Borland的新闻组提出了这个问题,
Rob kennedy 给了下面的回复,但是我没有找到他所说的内容:
That's a known bug. See QualityCentral entry 3945, which also includes a
workaround and a solution.
--
Rob
各位可以到这个新闻组看一下
borland.public.delphi.language.objectpascal
 
他奶奶的
 
呵呵,这个问题是同事问的,我将它转贴过来。现在很少上网了。
草原牧歌:
至于是哪个影子,似乎都不重要
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
867
DelphiTeacher的专栏
D
D
回复
0
查看
836
DelphiTeacher的专栏
D
D
回复
0
查看
785
DelphiTeacher的专栏
D
后退
顶部