代码之家  ›  专栏  ›  技术社区  ›  Rook

为什么“print(52-80)*42”与Perl中的“print 42*(52-80)”不同?

  •  3
  • Rook  · 技术社区  · 14 年前

    Perl::什么是:

    1. (52-80)*42
    2. 42*(52-80)
    

    答复:

    1. -28
    2. -1176
    

    为什么?

    请好好解释/证明这一点!

    #!/usr/bin/perl
    use strict;
    print 42*(52-80) , "\n";
    print ((52-80)*42) , "\n";
    print (52-80)*42 , "\n";
    print "\n";
    my $i=(52-80)*42;
    print $i, "\n";
    

    输出:

    > -1176
    > -1176-28
    > -1176
    
    3 回复  |  直到 10 年前
        1
  •  24
  •   ysth    14 年前

    如果你加上 use warnings; 你会得到:

    print (...) interpreted as function at ./test.pl line 5.
    Useless use of a constant in void context at ./test.pl line 5
    
        2
  •  17
  •   mob    14 年前

    Alex Howansky的警告意味着

    print (52-80)*42 , "\n"
    

    被解析为

    (print(52-80)) * 42, "\n"
    

    print(-28) ,和(2)包含换行符的字符串。(1)的副作用是打印值 -28 (没有换行)到标准输出。

    如果需要打印以括号开头的表达式,解决方法是在其前面加上 + :

    print +(52-80)*42, "\n"         #  ==> -1176
    
        3
  •  6
  •   John Kugelman Michael Hodel    14 年前

    多亏了Perl古怪的解析规则(哦Perl,你这个疯子!),这些声明:

    print ((52-80)*42) , "\n";
    print (52-80)*42 , "\n";
    

    (print ((52-80)*42)), "\n";
    (print (52-80))*42, "\n";
    

    这就是为什么你最后看到 -1176-28 (print-expr), "\n"; 简单地扔掉新行而不是打印它。