-1

以下片段显示了一个简单的 n-perline 输出过程。

显示了两种情况,一种在布尔表达式中使用前缀 ++,另一种使用后缀 ++。

由于 '++' 比 '==' 具有更高的优先级,我希望结果是相同的,但事实并非如此:一个每行执行 5 个,另一个执行 6 个。

use English;

my @arr = (1,2,3,4,5,6,7,8,9,8,7,6);
my $perline = 5;
my $ndone = 0;

for(@arr) {
    print "  $ARG";
    if(++$ndone == $perline) {
        $ndone = 0;
        print "\n";
    }
}

print "\n---\n";

my $perline = 5;
my $ndone = 0;

for(@arr) {
    print "  $ARG";
    if($ndone++ == $perline) {
        $ndone = 0;
        print "\n";
    }
}

输出:

  1  2  3  4  5
  6  7  8  9  8
  7  6
---
  1  2  3  4  5  6
  7  8  9  8  7  6
4

1 回答 1

3

这不是关于操作的优先级,而是关于前缀和后缀 ++ 返回的内容。来自 perldoc perlop:

"++" 和 "--" 与 C 中一样工作。也就是说,如果放在变量之前,它们在返回值之前将变量递增或递减 1,如果放在后面,则在返回值后递增或递减。

本质上,您可以将这些定义为函数:

sub prefix_plusplus {
    $_[0] = $_[0] + 1;   # increment value
    return $_[0];        # returns value after increment
}

sub postfix_plusplus {
    my $before = $_[0];
    $_[0] = $_[0] + 1;  # increment value
    return $before;     # returns value before increment
}


my $x = my $y = 5;
printf "%d,%d\n", prefix_plusplus($x), postfix_plusplus($y);   #  6,5
printf "%d,%d\n", $x, $y;                                      #  6,6

# and same thing with the ++ operand
$x = $y = 5;
printf "%d,%d\n", ++$x, $y++;                                  #  6,5
printf "%d,%d\n", $x, $y;                                      #  6,6
于 2017-10-29T12:32:01.993 回答