2017-01-10 4 views
0

例:算術式では、変数をインクリメントすると、他の操作ではない元の部分が変更されるのはなぜですか?

$ number=1 
$ ((number++)) 
$ echo $number 
2 
$ ((number * 10)) 
$ echo $number 
2 

修正は簡単です:number=$((number * 10))、私はちょうど2つの操作が異なる動作を可能にどのような理由のために理解していません。

+0

'++'演算子の動作は特別な場合です。これは、Cで同じ演算子の動作を反映しています.Bashでは、オペランドを直接変更する操作はほとんどありません。ほとんどの場合、値を計算するだけです。このような演算は一般的にはより便利であるが、 '++ '演算子の動作は、通常の' + '演算子と一緒にインクルージョンを保証するのに十分なほど頻繁に必要とされる。 –

+0

'((number * = 10))'と試してみてください。演算子はCの部分をエミュレートするので、これらについて知るにはCの背景が必要です。 –

+0

Thanks @JohnBollinger - あなたのコメントが答えだったら、私はそれを受け入れたでしょう。 – ElectricWarr

答えて

2

に計算された値を返しながらしたがって++$numberの値を増加させる:number=$((number * 10))、[…]

表記あなたが探しているのは

((number *= 10)) 

です。これは略語です

((number = number * 10)) 

のために私はあなたがecho $((3 * a + 12 * b))のようなものが突然aまたはbの値を変更した場合、それは驚くべきだろうことに同意すると思います。したがって、変数への変更は常に明示的であり、割り当てのために特別に設計された演算子の1つ、たとえば=および+=を使用します。ご覧のとおり、インクリメント演算子++はこれらの1つです(デクリメント演算子の場合は--)。

+0

Wikipediaには、 "算術演算子"の下にインクリメント演算子(foo ++)がありますが、私がほとんど認識していなかった "複合代入演算子"の全テーブルがあります(bar '+ =')。 '* ='は意外にも「乗算代入」演算子と呼ばれます。 興味深い!ありがとうruakh。 – ElectricWarr

3

これはそのために設計されたものです。

numberを変更せずにnumber+1の値を使用する場合は、(意外にも)number+1を使用します。

+0

新しいプログラマーにはあまり無礼にしないでください。 – Cybersupernova

+4

@Cyber​​supernova愚かさを無礼に誤解しないでください。 – chepner

1

そのすべてが約valuereferenceです。

++オペレータは、他のすべての演算子プロセス$numberの値のみ(数より--よう残す)しながら$numberによって参照されるメモリセルの値をインクリメントします。

他は修正が簡単である任意の変数(あなたのケースで$number

関連する問題