网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月28日漏签0天
vb吧 关注:156,060贴子:1,166,189
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 42回复贴,共1页
<<返回vb吧
>0< 加载中...

VB是如何诠释日期常量绝对值的

  • 只看楼主
  • 收藏

  • 回复
  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ⅤB的类型的转换有两种,一种是根据上下文系统自动转换,另一种是用户使用类型转换函数手动转换。绝对值是数学方面的问题,参数是数值,计算结果也应该是数值!可在ⅤB里绝对值函数abs()并不是这样理解的,不知道是更人性化了,还是随意违背规则,就是说abs(number)函数,如果实参放的日期型常量(臂如#12/29/1899#)的话,结果会是怎么样那?(请不要上机测试,直接按自己的理解回答)。按我个人的理解,实参按形参的类型自动转换,那么会转成数值(应该是-1),然后求-1的绝对值,结果是+1,返回值类型是数值型或是数值型字符均可以理解,可此函数返回的确是日期型,并且按数轴的对应关系计算出了新的日期,人性是蛮人性的,可我还是觉的有点乱,有点僭越,有点不守规矩,有点任意妄为!


  • 初音七奈
  • 钩子编程
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这实际上是Variant数据类型的问题,“进去什么就出来什么”;
以及Date数据类型的表示方法,实际上VB就是用数值来表示日期和时间的,也就是VB内部可以直接将数值解释成日期和时间。
所以这个结果在VB看来是很自然的:参数值是-1,类型是日期型;运算结果是1,类型仍是日期型。但是由于VB对日期零点的选择并不符合自然日期记法,而是选在了常用年份的区域,因此这个结果就显得违反常识了。
这可以算是VB函数的bug,如果设计成“限定参数必须为数值型”,就不会出现这样的问题;事实上,之所以这些函数的参数类型和返回值类型都是Variant,只是为了处理Null这个特殊值,而没有考虑其他输入的数值类型。


2025-12-28 12:11:54
广告
不感兴趣
开通SVIP免广告
  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
<这实际上是Variant数据类型的问题,“进去什么就出来什么”>
此句说的是函数的形参和返回值的,在变体变量的前题下。对于一个函数来讲,例如Abs(number)当初定义时,两者均为Variant类形。你得出‘进出一样’的结论,请问此结论出处是高手的经验积累,还是有官方的文字说明?我个人觉得是编程者在过程内加以约束了,并非所有过程都加此约束


  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
<实际上VB就是用数值来表示日期和时间的>
这句话也不是很准确,所有类型严格的说都是数值。我们姑且把它看成和字符串一样有别于数值类型的一种类型罢了,它不是数值型,但依据一定规则可以和数值相互转化。得出-1是规则起了作用………………


  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
<事实上,之所以这些函数的参数类型和返回值类型都是Variant,只是为了处理Null这个特殊值>
这句说的非常有道理,但我还是想不出和这个特殊值有什么连代关系


  • 初音七奈
  • 钩子编程
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
嘛,还是分析一下数学函数的执行过程吧:
首先传入参数;
然后将参数代入一个表达式中(具体形式不确定),计算表达式并赋值给函数名(相当于一个普通变量);
最后通过函数名返回计算结果。
(怎么看起来像“把大象装冰箱总共分三步”但是这样一个简化的过程也能说明问题了)
可以看到,其中的关键步骤就是表达式的计算。
由于不知道数学函数的具体表达式,我们可以构造一个自己的函数:
Function Plus1(Number)
Plus1 = Number + 1
End Function
通过这个函数,就可以解释Variant类型的“进出一致”现象了,在此不展开分析。
需要解释的是String、Boolean和Date这几种类型。
String和Boolean这两种,如我已经说过的,需要进行强制转换才能进行数值运算,而转换之后的类型自然和参数原本的类型就不一致了,因此表达式结果的类型以及函数值的类型就和参数类型不同了。而我们可以看到,这个函数中并没有将函数值的类型再转换回参数类型的过程,因此这个不同就保留下来了。
而Date类型,也是我们讨论的重点,它根本【就是】一个数值类型!注意我的说法,既不是“需要跟数值类型相互转换”,也不是“用数值表示的非数值类型”,而是“就是数值类型”!Date类型在内存中的存储格式就是Double类型的数据!给你看两句出自MSDN的原话:
Date 变量存储为 IEEE 64 位(8 个字节)浮点数值形式……
Double(双精度浮点型)变量存储为 IEEE 64 位(8 个字节)浮点数值的形式……
看见没有?这俩类型完全就是一回事!只是给人看的时候VB把它们处理成了不同的样子而已。
但这种“无差别对待”无形中也成了数学函数的bug:进去的是日期型,出来的还是日期型……
但是!谁在使用数学函数的时候会无聊到去触发这种bug啊,正常人都不会用日期型数值作为参数的吧


  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
<而Date类型,也是我们讨论的重点,它根本【就是】一个数值类型!注意我的说法,既不是“需要跟数值类型相互转换”>

就Abs(number)这个函数来讲,如果1899-12-29不从日期到数值的类型转换,而是直接用表示日期的Double进行绝对值的计算的话,返回值就不会是1899-12-31 。正是以1899-12-30作为数轴的原点,并且经过了日期到数值的类型转换,才会计算出-1这个值,求绝对值后得+1,之后在由数值转日期,才得出了1899-12-31的返回值


  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个是整型的测试


2025-12-28 12:05:54
广告
不感兴趣
开通SVIP免广告
  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
布尔型和字符串型


  • 初音七奈
  • 钩子编程
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不就是想知道Date类型的内存数据存储方式么?
有个API函数叫CopyMemory,作用就是复制内存(数据原样复制,不是VB中的赋值),用它就可以实现“直接看到内存数值”的目的了。
以下是代码和测试结果:

结果非常明确:Double型的-1和Date型的1899-12-29在内存中的存储数值是完全一样的,Double型的1和Date型的1899-12-31也是如此。并且它们的8个字节的内存数值也显示出来了。


  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
高手就是高手,我学习编程时间不长,还不会API那!请把源码发给我一个,研究测试!


  • 悬壶求教
  • 函数调用
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回归初心-结贴,绝对值的计算是数学问题,是计算一个数值类型(或者是可以转成此类型的)数据绝对值(其实都是废话,但为了回归初心,我还是重申一下),参数是什么类型,函数没做具体要求,也就是Variant型,返回值是什么类型,函数也没具体标明也是Variant型,但从用户角度看来应该是数值型,假如计算出了日期型或者布尔型是没有一点实际意义的,也不是用户想看到的
本着这样的思路,我对Abs(number)进行了测试,先是数值型做参数,而后是可以转换成数值型的,例如数字字符串,布尔的真假以及日期常量,当测试到日期常量时,出现了状况,返回的不是数值是日期,于是我便对电脑讲,怎么会是这个样子呢?绝对值怎么计算出日期来了?电脑反问我,怎么会不是这个样子呢?计算绝对值是用数计算,有计算日期绝对值的吗?于是我回答之所以放日期是因为你可以转成数,谁叫你可以任意转换那?电脑回答,我可以转换是为方便你写程序,但必须遵守规则,你这样求绝对值不产生二义性才怪?我无言以对,真不知道是VB不守规矩还是我不守规矩


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 42回复贴,共1页
<<返回vb吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示