让我们从我的终端采取以下示例:
$ a=0 && b=1
$ echo $a $b
0 1
$ # Everything OK
$ ((a++)) && ((b++))
$ echo $a $b
1 1
$ # What? Why only a changed its value and b no?
$ ((a++)) && ((b++))
$ echo $a $b
2 2
$ # Now the value of b has changed...
有人可以让我理解为什么会这样吗?
答案 0 :(得分:5)
a++
post -increment,即在测试值后,增量发生。
a
上的测试失败,因为a
在测试时为零。
答案 1 :(得分:3)
&安培;&安培;是逻辑AND运算符。如果它的第一个参数是假的,那么它就不会对第二个参数进行评估。这被称为"短路"并节省处理时间。
由于++是后递增,如果在评估((a++)) && ((b++))
时a为零,则评估第一个,得到零(这是假),将a加1,然后由于短路退出而不评估第二部分。所以b不会增加。
答案 2 :(得分:2)
((a++))
会增加$a
中1
的值。如果评估的表达式不是$?
,则退出状态0
为0,否则为1
。如果由于&&
导致其退出状态,则第二个命令 - ((b++))
- 将无法运行。
如man bash
所示,如果表达式的值非零,则返回状态为0;否则返回状态为1 。根据{{1}}是一个后增量表达式,表达式会计算a++
本身,然后递增其值,以便当表达式$a
的返回状态为((a++))
时是非零,否则为0
。
所以,反直觉地说:
1
时,返回状态为$a
。1
为字符串时,返回状态为$a
。1
等于$a
时,返回状态将为0
。1
设置为不同于0的数字时,返回状态将为$a
。变量为0
。
0
我们执行$ t=0
并查看命令返回的((t++))
表达式:
echo $( command )
但请注意$ echo $(((t++)))
0
的值已增加。
$t
如果我们再次这样做,也是如此:
$ echo $t
1
请参阅$ echo $(((t++)))
1
$ echo $t
2
$ echo $(((t++)))
2
$ echo $t
3
:
(适用(表达式))强>
根据下述规则评估表达式 在算术评估下。 如果表达式的值是 非零,返回状态为0;否则返回状态为1 。 这完全等同于让“表达”。
答案 3 :(得分:1)
当a
为0时,((a++))
的值被解释为不为真。