2017-01-10 12 views
0

Пример:В арифметическом выражении, почему приращение переменной модифицирует оригинал, где нет других операций?

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

Исправление прост: number=$((number * 10)), я просто не понимаю, для того, что возможная причина две операции ведут себя по-разному.

+0

Поведение оператора '++' является особым случаем. Он отражает поведение одного и того же оператора в C. В Bash очень немногие операции непосредственно изменяют их операнды; большинство из них вычисляет значение. Такие операции, как правило, более удобны в использовании, но поведение оператора '++' требуется достаточно часто, чтобы гарантировать его включение, наряду с обычным оператором '+'. –

+0

просто попробуйте '((число * = 10))' и посмотрим. Операторы подражают своим C-образным аналогам, поэтому вам нужно знать C о них. –

+0

Спасибо @JohnBollinger - если бы ваш комментарий был ответом, я бы принял его. – ElectricWarr

ответ

2

Исправления просто: number=$((number * 10)), [& hellip;]

обозначение вы ищете

((number *= 10)) 

который является сокращением для

((number = number * 10)) 

Я думаю, вы согласитесь, что было бы удивительно, если бы что-то вроде echo $((3 * a + 12 * b)) внезапно изменили значение a или b. Поэтому переменные в переменных всегда явно: они используют один из операторов, специально предназначенных для назначения, таких как = и +=. Как вы заметили, оператор инкремента ++ является одним из них (как и оператор декремента, --).

+0

В Википедии есть оператор инкремента (foo ++), указанный в разделе «Арифметические операторы», но есть целая таблица «Операторы вспомогательного присваивания», о которых я в основном не знал (bar '+ ='). '* =' неудивительно называют оператором «Умножение умножения». Интересно! Спасибо, ruakh. – ElectricWarr

3

Потому что это то, что они предназначены для работы.

Если вы хотите, чтобы значение number+1 без изменения number, вы используете (неудивительно) number+1.

+0

Пожалуйста, не будьте так грубы к новым программистам. – Cybersupernova

+4

@Cybersupernova Не ошибитесь в грубости за грубость. – chepner

1

Его все о value и reference.

++ оператор увеличивает значение ячейки памяти, на который ссылается $number в то время как все другие (оставив несколько подобных --) операторов процесса только значение $number.

Следовательно ++ увеличивает значение $number в то время как другие возвращают вычисленное значение любого переменный ($number в вашем случае)