Почему вывод echo $ ((i ++)) отличается от echo $ ((i = i + 1))

!#/bin/bash
i=1
echo $((i++))

i=1
echo $((++i))

i=1
echo $((i=i+1))

Это результат

bash increment
1
2
2

Я думал, что выражение i = i + 1 было идентично i ++.

Есть ли способ проверить, равны друг другу?

0
задан 7 December 2011 в 09:49

2 ответа

Хорошо помните, что выполнение ++ i (Pre-Increment) не совпадает с i ++ (Post-Increment).

Предварительные приращения увеличат значение перед выходом на терминал. Post-Increments будут делать это после отправки его на терминал. Итак, вы увидите, что первое значение совпадает с назначением в начале первого случая.

Чтобы проверить это, выполните это дважды:

i=1   
$((i++)) // The output will be 1,2

И затем проверьте остальные два раза:

i=1   
$((++i)) // The output will be 2,3

Для echo $((i=i+1)) он будет вести себя так же, как предварительный приращение в том смысле, что (как показано уравнением) он присваивает +1 значение из 1, а затем выведите результат.

Чтобы проверить результаты, я сделал небольшой скрипт для игры с:

x=1
xx=$((x++))

y=1
yy=$((y=y+1))

z=1
zz=$((++z))

echo $xx "Post-Increment"
echo $yy "Y+1 Sum / Same as Pre-Increment"
echo $zz "Pre-Increment"

if [ $xx -eq $yy ]; then
 echo "Post-Increment X equals normal Y+1 method.. yeah right.."
elif [ $xx -eq $zz ]; then
 echo "Post-Increment X equals Pre-Increment Z.. yeah sure..no problem"
elif [ $yy -eq $zz ]; then
 echo "Normal Y+1 method equals Pre-Increment Z.. BINGO! You get a cookie"
fi
6
ответ дан 25 May 2018 в 16:11

Традиционно i ++ был оператором post-increment, а это означало, что новое добавочное значение не будет доступно до следующей ссылки на него. В то время как оператор pre-increment ++ i сразу сделает инкрементное значение. Использование i = i + 1 не использует эту логику, потому что поведение специфично для инкрементных операторов.

1
ответ дан 25 May 2018 в 16:11

Другие вопросы по тегам:

Похожие вопросы: