私はこれがバグではなく意図的なものだと思います。その場合は、根拠に関する関連文書をご案内ください。
~$ i=0; ((i++)) && echo true || echo false
false
~$ i=1; ((i++)) && echo true || echo false
true
2行の唯一の違いはi=0
vs。i=1
答え1
i++
本当にそうだからです。ポスト増分で説明されているようにman bash
。これは、式が次のように評価されることを意味します。オリジナルvalue i
、値が増加したわけではありません。
ARITHMETIC EVALUATION
The shell allows arithmetic expressions to be evaluated, under certain circumstances (see the let and
declare builtin commands and Arithmetic Expansion). Evaluation is done in fixed-width integers with no
check for overflow, though division by 0 is trapped and flagged as an error. The operators and their prece-
dence, associativity, and values are the same as in the C language. The following list of operators is
grouped into levels of equal-precedence operators. The levels are listed in order of decreasing precedence.
id++ id--
variable post-increment and post-decrement
する:
i=0; ((i++)) && echo true || echo false
動作は次のようになります。
i=0; ((0)) && echo true || echo false
ただし、i
次のような場合でも増加します。
i=1; ((i++)) && echo true || echo false
動作は次のようになります。
i=1; ((1)) && echo true || echo false
除いてもi
増加しました。
値が0でない場合、この構成の戻り値は(( ))
true(0
)であり、その逆も同様です。
事後増加演算子がどのように機能するかをテストすることもできます。
$ i=0
$ echo $((i++))
0
$ echo $i
1
事前増分と比較:
$ i=0
$ echo $((++i))
1
$ echo $i
1
答え2
]# i=0; ((i++)) && echo true || echo false
false
]# i=0; ((++i)) && echo true || echo false
true
の「戻り値」の値は、接頭辞または((expression))
接尾辞によって異なります。論理は次のようになります。
((expression))
The expression is evaluated according to the rules described be low under ARITHMETIC EVALUATION.
If the value of the expression is non-zero,
the return status is 0;
otherwise the return status is 1.
これは戻り値ではなく一般値に変換されることを意味します。