读书人

趣味题:考考你的Delphi基础,该怎么处

发布时间: 2012-03-07 09:13:51 作者: rapoo

趣味题:考考你的Delphi基础
活跃一下D版的气氛,出个趣味只是题。

下面的代码中,定义了一个记录类型,定义了2个同名的方法(同不同名无所谓),v1和v2的x字段都初始化为10,分别调用2个方法后。提问:
1、v1.x与v2.x的值分别为多少?(要求不要在机上测试)
2、加入从记录定义中去掉y字段,v1.x与v2.x的值又分别为多少?(要求不要在机上测试)
3、为什么会是这样的结果?希望大家讨论。


Delphi(Pascal) code
type  TTest = record    x: Integer;    y: Integer;  end;procedure IncX(var v: TTest); overload;begin  Inc(v.x);end;function IncX: TTest; overload;begin  Inc(Result.x);end;var  v1, v2: TTest;begin  v1.x := 10;  v2.x := 10;  v1 := IncX;  IncX(v2);end;


[解决办法]
发现自己的基础不是一般地差:)
口算的一个都不对:(
[解决办法]
v1.x 1
v2.x 11

不知道对不对
[解决办法]
1、值相同;
2、值不同;
3、为什么呢?期待高人回答...
[解决办法]
sdfdsfsdgdfgfdgfdgfdgfd
[解决办法]
jjjjjj
[解决办法]
口算:值没变吧.

沉默中...
[解决办法]
讲的不错非常有价值!
[解决办法]
原来真的很差..
[解决办法]
原来真不行
[解决办法]
绕晕了
1.都是11?
2.不变?
3.难道没有参与计算的Y字段也影响结果?
[解决办法]
1 结果都是11
2 v1 结果随机 v2 结果11

v1是局部变量的时候是直接把v1当result的
如果改成全局变量result是栈中的另一块地址 返回后再赋值给v1 这样的话就得到随机的值了

当v1只有一个integer的字段的时候 好像就没有特殊处理
[解决办法]
不都是11吗?
[解决办法]
v1 := IncX;
这样的赋值?
没见过
[解决办法]
不会啊
[解决办法]
不错哦
[解决办法]
学习
[解决办法]
很不错支持一下哈哈
[解决办法]
v1 := IncX;
这样的语句不懂,
偶是delphi新手
[解决办法]
不用说了,请楼上马上结贴,回答!
[解决办法]
等100楼
[解决办法]
此贴很好,很强大。
[解决办法]
支持下,不会
[解决办法]
1.都是11?
2.不懂y怎么影响的。
[解决办法]
buhui

[解决办法]
以前看到过一个“为什么对象不创建也能用”的问题,可能跟那个问题原因差不多。

等楼主解释。。。
------解决方案--------------------


等100楼
[解决办法]
不懂啊
[解决办法]
不错哦
[解决办法]

探讨
v1.x 1
v2.x 11

不知道对不对

[解决办法]
探讨
引用:
v1.x 1
v2.x 11

不知道对不对


v1.x因为incX()是对一个未初始化的result进行inc,结果是不确定的
一般未初始化就是0,看编译器是统一更新为0还是不做处理
incX()这样的函数应该绝对不允许出现

[解决办法]
阿发伯出来了
[解决办法]
IncX代码确实有问题。
一般来说,编译系统再返回值时应该会在堆栈上建立临时变量,Pascal更应该如此。
[解决办法]
这个纯粹是为了考人,没有什么意思
[解决办法]
探讨
引用:
v1.x 1
v2.x 11

不知道对不对


v1.x因为incX()是对一个未初始化的result进行inc,结果是不确定的
一般未初始化就是0,看编译器是统一更新为0还是不做处理
incX()这样的函数应该绝对不允许出现

[解决办法]
探讨
还是发哥厉害,想出这样的题来折腾人。。。

我想答案主要取决于delphi编译器对结构体类型的Result的处理方式(似乎lz也有这方面的暗示),要么直接传入地址赋值,要么先创建一个局部变量再拷贝。如果这个猜想成立的话,那Y就成为一个关键,是不是只有一个x的时候,会采用直接传入地址?(因为调用过程对x赋值可以保证记录体的完整性,即要么成功,要么失败)而有y的时候,则会采用后一种方式(即随机值)?


[解决办法]
32位以下返回是用寄存器返回值,32位以上用寄存器返回指针。
估计又被编译器优化了。
[解决办法]
那你猜这几个是eax返回呢,还是变成参数呢?
T1 = packed record
a: Byte;
b: Word;
end;

T2 = record
x: array[1..3]of Byte;
end;

T3 = record
DynArr: array of Integer;
end;

T4 = record
S: string;
end;
它们可都是32位及32位以下的

delphi传参数的细节多着呢,传 procedure/function of object 类型的参数还有bug,但这些东西只是编译器的实现,跟基础一点关系都没有。

[解决办法]
这几天阿发伯很活跃啊

读书人网 >.NET

热点推荐