以下代码显示的输出与预期不同。“我”应该是答案。
代码:
$var = 'i';
$var++;
print $var;
$var--;
print " * ",$var;
结果:
j ***** -1
谁能解释一下行为?我知道我错过了一件非常愚蠢的事情。
谢谢
以下代码显示的输出与预期不同。“我”应该是答案。
代码:
$var = 'i';
$var++;
print $var;
$var--;
print " * ",$var;
结果:
j ***** -1
谁能解释一下行为?我知道我错过了一件非常愚蠢的事情。
谢谢
自增运算符++
是“神奇的”,因为它还可以增加非数字字符串。就这样i
变成了j
。自动减量运算符--
没有这种“神奇”功能。因此,字符串j
被转换为一个数字,该数字将为0
,然后递减为-1
。
这记录在perldoc perlop中:
自增运算符有一点额外的内置魔法。如果你增加一个数值变量,或者曾经在数值上下文中使用过的变量,你会得到一个正常的增量。但是,如果该变量自设置以来仅在字符串上下文中使用,并且其值不是空字符串并且与模式匹配 /^[a-zA-Z] [0-9] \z/ ,增量作为一个字符串完成,将每个字符保留在其范围内,并带有进位:
print ++($foo = "99"); # prints "100" print ++($foo = "a0"); # prints "a1" print ++($foo = "Az"); # prints "Ba" print ++($foo = "zz"); # prints "aaa"
undef 始终被视为数字,特别是在递增之前更改为 0(因此 undef 值的后递增将返回 0 而不是 undef)。
自减运算符并不神奇。
perl 中没有 char 类型。“i”与“i”是同一个字符串。问题是为什么 ++ 确实增加了 char 的值。这个问题已经在这里讨论过:Increment (++) and decrement (--) strings in Perl