微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

三元产生与 If 不同的结果

如何解决三元产生与 If 不同的结果

编辑:对于遇到此问题的任何人,我在 https://perldoc.perl.org/perlop#Conditional-Operator

的 perldoc 中几乎逐字记录了这一点

在编写一个简单的子程序时,我发现我使用三元运算符不断得到错误的结果,但使用更简单的 if 语句得到正确的结果。我确定有一个解释,但我只是没有看到。

当输入以下输入时:

my @input = (4,5,7,8,1,2,3,0);
sum_square_even_root_odd(\@input);

结果应该是 91.61。

以下(使用三元)结果为 175.61。

sub sum_square_even_root_odd {
    my ($nums) = @_;
    my $sum = 0;
    map { $_ % 2 ? $sum+= sqrt $_ : $sum += $_ ** 2 } @{$nums};
    return sprintf('%.2f',$sum) + 0;
};

然而,结果是简单地更改为 if 语句时的预期

sub sum_square_even_root_odd {
    my ($nums) = @_;
    my $sum = 0;
    map { if( $_ % 2 ) { $sum+= sqrt $_ } else { $sum += $_ ** 2 } } @{$nums};
    return sprintf('%.2f',$sum) + 0;
};

有人可以解释为什么会发生这种情况吗?我假设一个我不期望的值正在悄悄地进入 $_,但我不确定为什么。

谢谢!

解决方法

事实上,这是一个优先级问题。诊断优先级问题的方法是使用 B::Deparse:

$ perl -MO=Deparse,-p -e 'map { $_ % 2 ? $sum+= sqrt $_ : $sum += $_ ** 2 } @ARGV'
map({((($_ % 2) ? ($sum += sqrt($_)) : $sum) += ($_ ** 2));} @ARGV);
-e syntax OK

啊哈,: 的优先级高于其右侧的 +=。要做到您的意思,请在三元运算的最后一个子句上使用括号:

$_ % 2 ? $sum+= sqrt $_ : ($sum += $_ ** 2)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。