0

以下代码显示的输出与预期不同。“我”应该是答案。

代码:

$var = 'i';
$var++;
print $var;
$var--;
print " * ",$var;

结果:

j ***** -1

谁能解释一下行为?我知道我错过了一件非常愚蠢的事情。

谢谢

4

2 回答 2

7

自增运算符++是“神奇的”,因为它还可以增加非数字字符串。就这样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)。

自减运算符并不神奇。

于 2013-05-30T10:05:45.683 回答
5

perl 中没有 char 类型。“i”与“i”是同一个字符串。问题是为什么 ++ 确实增加了 char 的值。这个问题已经在这里讨论过:Increment (++) and decrement (--) strings in Perl

于 2013-05-30T10:00:36.410 回答