gpt4 book ai didi

C:f>0 与 Perl:$f>0?

转载 作者:太空宇宙 更新时间:2023-11-04 00:17:17 26 4
gpt4 key购买 nike

此 C 代码显示斐波那契数列:

#include <stdio.h>
int main(){
for (long long int t, i=1, p=1, f=2; f>0 ; i++, t=f, f+=p, p=t)
printf("%lli: %lli\n", i, f);
}

按照预期,它无需硬编码迭代次数即可停止。

Perl 中的代码试图使用相同的技术:

my $t;
my $p=1;
my $f=2;
for ($i=1; $f>0; $t=$f, $f+=$p, $p=$t, $i++){
printf("%i: %i\n", $i, $f);
if ($i>50){exit;}
}

但它并没有像预期的那样停止,值在 45 处溢出而不是在51 当额外检查开始时。

44: 1836311903
45: -1323752223
46: -1
47: -1
48: -1
49: -1
50: -1
51: -1

Perl 有什么不同之处导致了这种情况?

最佳答案

Perl 使用任意类型,根据需要在无符号和有符号整数以及 float 之间切换。然而,printf 强制将任意类型转换为整数。尝试使用 %s 代替:

my $t;
my $p=1;
my $f=2;
for ($i=1; $f>0; $t=$f, $f+=$p, $p=$t, $i++){
printf("%i: %s\n", $i, $f);
if ($i>50){exit;}
}

这个大的负数实际上是作为无符号整数存储在 perl 中的; -1 是太大的 float ,被截断为最大无符号整数,但随后被视为由 %i 签名。

关于C:f>0 与 Perl:$f>0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5489626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com