打印(2&2)>> 1有什么问题?

时间:2019-06-12 07:30:29

标签: perl bit-manipulation

我只是想知道这段代码会发生什么。 为什么仅直接打印时结果不正确,为什么换行符会被忽略?

user@host_09:22 AM: perl
print 2 >> 1, "\n";
print 2 & 2, "\n";
print (2 & 2) >> 1, "\n";
1
2
2user@host_09:22 AM: perl
$a = (2 & 2) >> 1;
print "$a\n";
1

2 个答案:

答案 0 :(得分:6)

Perl将括号解释为函数参数标记,您可以使用

进行验证
perl -MO=Deparse,-p -e 'print (2 & 2) >> 1'

输出:

(print(2) >> 1);

规范的方法是在左括号之前加上+

print +(2 & 2) >> 1

答案 1 :(得分:4)

在打印带有警告的内容时,它会变得很清晰

perl -we'print (2 & 2), "\n"'

print (...) interpreted as function at -e line 1.
Useless use of a constant ("\n") in void context at -e line 1.

它将print(2&2)作为对print的函数调用,打印出2,然后继续评估comma operator,接下来在空白上下文中"\n",这它警告我们。

>> 1也存在的情况下,1的返回print(2&2)(成功)被移至0,它消失在空白中,我们得到 另一个“ 在无效上下文中无用的... 。”

一种解决方法是添加一个+,以使解释器知道(用于表达式。

perl -we'print +(2 & 2) >> 1, "\n"'

或者,适当地调用print,并在整个内容中加上括号

perl -we'print((2 & 2) >> 1, "\n")'

都用1打印一行。

这在print中有所提及,在Terms and List operatorsSymbolic Unary operators中,都在perlop中有更完整的记录。