趣味题:考考你的Delphi基础,该怎么处理
趣味题:考考你的Delphi基础活跃一下D版的气氛,出个趣味只是题。下面的代码中,定义了一个记录类型,定义了2个
趣味题:考考你的Delphi基础
活跃一下D版的气氛,出个趣味只是题。
下面的代码中,定义了一个记录类型,定义了2个同名的方法(同不同名无所谓),v1和v2的x字段都初始化为10,分别调用2个方法后。提问:
1、v1.x与v2.x的值分别为多少?(要求不要在机上测试)
2、加入从记录定义中去掉y字段,v1.x与v2.x的值又分别为多少?(要求不要在机上测试)
3、为什么会是这样的结果?希望大家讨论。
Delphi(Pascal) codetype 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楼
[解决办法]不懂啊
[解决办法]不错哦
[解决办法][解决办法][解决办法]阿发伯出来了
[解决办法]IncX代码确实有问题。
一般来说,编译系统再返回值时应该会在堆栈上建立临时变量,Pascal更应该如此。
[解决办法]这个纯粹是为了考人,没有什么意思
[解决办法][解决办法][解决办法]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,但这些东西只是编译器的实现,跟基础一点关系都没有。
[解决办法]这几天阿发伯很活跃啊