Почему выходные данные 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 в 07:49

2 ответа

Хорошо, помните, что выполнение a ++ 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)) он будет вести себя так же, как Pre Инкремент в том смысле, что (как показано в уравнении) он присвоит +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
0
ответ дан 7 December 2011 в 07:49

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

0
ответ дан 7 December 2011 в 07:49

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

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