我对以下代码输出感到困惑:
print "1234567890" x (10+9)/10;
输出为
1.23456789012346e+188.
我知道代码应该是这样才能获得预期的结果:
"1234567890" x ((10+9)/10)
但是为什么以前的代码会生成浮点数而不是字符串?在Perl中,运算符“ x”不是字符串运算符吗?
答案 0 :(得分:6)
好吧,让我们看看perl在使用B::Deparse模块时如何对待该表达式:
$ perl -MO=Deparse,-p -e 'print "1234567890" x (10+9)/10;'
print((3993258840062839 * 2**573));
显然,它正在将其评估为数字。也许是因为分裂?让我们尝试将其取出。
$ perl -MO=Deparse,-p -e 'print "1234567890" x (10+9);'
print('1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');
看起来正确。因此,基本上,它会打印出该数字,因为多亏了除法,您才将那个长字符串视为一个数字。
请注意,x
和/
的优先级相同,并且保持关联,因此a x b / c
被视为(a x b) / c
。
答案 1 :(得分:5)
http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
x
和/
具有相同的优先级。所以
print "1234567890" x (10+9)/10;
等同于
print( ("1234567890" x (10+9)) / 10 );
请注意,x
不仅是字符串重复运算符。它可以生成列表:(1) x 3
是(1, 1, 1)
答案 2 :(得分:3)
x是一个字符串运算符,但是您在它产生的字符串上使用/,该字符串将“ 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789123456789012345678901234567890123456789012345678901234567890”除以10。
答案 3 :(得分:1)
似乎1234467890
被连贯了19次,然后除以10便产生了浮动。