加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 编译顺序和post前缀opertors

发布时间:2020-12-15 21:52:58 所属栏目:大数据 来源:网络整理
导读:我想知道为什么以下输出7 7 6 7而不是5 6 6 7 my $a = 5;printf("%d %d %d %d",$a,++$a,$a++,$a); 我很确定它与参数编译的顺序有关 谢谢, 解决方法 在我开始之前,让我指出一般应该避免在表达式中设置和读取变量的情况. 首先,让我们看一下操作数评估顺序.这不
我想知道为什么以下输出7 7 6 7而不是5 6 6 7
my $a = 5;
printf("%d %d %d %d",$a,++$a,$a++,$a);

我很确定它与参数编译的顺序有关

谢谢,

解决方法

在我开始之前,让我指出一般应该避免在表达式中设置和读取变量的情况.

首先,让我们看一下操作数评估顺序.这不是为许多运算符定义的,而是为列表运算符定义的.记录下以从左到右的顺序评估其操作数[1].这意味着printf的参数按以下顺序计算:

>“%d%d%d%d”
> $a
> $a
> $a
> $a

关键在于知道$a不会在堆栈上放置$a值的副本.它放置标量本身(SV *,用C表示).在Perl术语中,我们说堆栈元素别名为$a [2].在计算理论中,你会说参数是通过引用传递的.

同样适用于$a,但$a必须在堆栈上放置$a的副本.

这意味着我们可以将上面的printf调用视为等效

use Data::Alias qw( alias );

{
    local @_;
    alias $_[0] = "%d %d %d %d";
    alias $_[1] = $a;    # Places $a on the stack.
    alias $_[2] = ++$a;  # Adds one to $a and places $a on the stack.
    alias $_[3] = $a++;  # Places a copy of $a on the stack and adds one to $a.
    alias $_[4] = $a;    # Places $a on the stack.
    &CORE::printf;
 }

当$a被调用时,$a包含6.

到调用printf时,$a包含7.

解决方法是复制值.

$perl -le'$a = 5; my @b = ($a,$a); print "@b";'
7 7 6 7

$perl -le'$a = 5; my @b = (0+$a,0+(++$a),$a); print "@b";'
5 6 6 7

>从perlop开始,“在列表上下文中,它只是列表参数分隔符,并将其参数插入到列表中.这些参数也从左到右进行计算.”
>从perlsyn开始,“传入的任何参数都显示在数组@_中.因此,如果你调用一个带有两个参数的函数,那么它们将存储在$_ [0]和$_ [1]中.数组@_是一个局部数组,但它的元素是实际标量参数的别名.“

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读