Por que a saída de echo $ ((i ++)) é diferente de echo $ ((i = i + 1))?

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

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

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

Esta é a saída

bash increment
1
2
2

Eu achei que a expressão i = i + 1 era idêntica a i ++.

Existe uma maneira de verificar se duas expressões são iguais entre si?

    
por user784637 07.12.2011 / 04:49

2 respostas

6

Ok, lembre-se de que fazer um ++ i (Pre-Increment) não é o mesmo que i ++ (Post-Increment).

Os pré-incrementos aumentarão o valor antes da saída para o terminal. Os pós-incrementos o farão depois de publicá-lo no terminal. Então você verá que o primeiro valor é o mesmo que o atribuído no primeiro caso.

Para verificar isso, faça isso duas vezes:

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

E depois verifique o resto duas vezes também:

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

Para o echo $((i=i+1)) , ele se comportará da mesma forma que um pré-incremento no sentido de que (conforme mostrado pela equação) ele atribuirá +1 ao valor de 1 e, em seguida, gerará o resultado.

Só para testar os resultados, fiz um pequeno roteiro para brincar:

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
    
por Luis Alvarado 07.12.2011 / 05:04
1

Tradicionalmente, o i ++ era um operador de pós-incremento, o que significava que o novo valor incrementado não estaria disponível até a próxima referência a ele. Considerando que o operador de pré-incremento ++ i faria o valor incrementado disponível imediatamente. O uso de i = i + 1 não está usando essa lógica, porque o comportamento é específico para os operadores incrementais.

    
por Justin Andrusk 07.12.2011 / 04:55