VB6多变量连续赋值:偶数变量数时首变量为-1的原因探究
VB6连续赋值偶数变量数出现-1的成因
这是VB6编译器的一个已知bug,根源在于VB6对连续赋值语句的解析和编译逻辑错误:
- VB6的赋值运算符
=本身不支持“连续赋值”语法,当你写出a% = b% = c% = d% = 0这类语句时,编译器会将其按右结合的方式拆解为嵌套表达式:a% = (b% = (c% = (d% = 0))) - 对于奇数个变量(比如3个变量:
a% = b% = c% = 0),编译器会将所有嵌套的=都解析为赋值操作:- 先执行
c% = 0,返回被赋值的数值0 - 再执行
b% = 0,返回0 - 最后执行
a% = 0,所有变量都被正确赋值为0
- 先执行
- 对于偶数个变量(比如4个变量:
a% = b% = c% = d% = 0),编译器会错误地将最外层的嵌套表达式中的=解析为比较运算符:- 执行
d% = 0,返回0 - 执行
c% = 0,返回0 - 执行
b% = 0,返回0 - 此时最外层的
a% = (b% = 0)中,b% = 0被当作比较运算(判断b%是否等于0),由于b%已经被赋值为0,比较结果为True - VB6中Boolean类型的
True转换为Integer类型时会变成-1,因此a%最终被赋值为-1,而其余变量因都是赋值操作保持0
- 执行
这个bug仅在变量数为偶数时触发,是因为偶数个变量对应奇数层嵌套,编译器在处理奇数层嵌套时错误地将最后一层的赋值转换为比较操作,而奇数个变量对应偶数层嵌套时则保持正确的赋值解析。
内容的提问来源于stack exchange,提问作者samgak
相关产品推荐
相关产品推荐

