Dado que b é sempre diferente de zero, por que `b? --b: ++ b` funciona, mas `--b` não funciona?
Eu estava tentando multiplicar dois números inteiros usando recursão e escrevi este código acidentalmente:
//the original version
int multiply(int a, int b)
{
if ( !b )
return 0;
else
return a + multiply(a, b ? --b : ++b ); //accident
}
Eu disse, escrevi isso acidentalmente, porque pretendia escrever:
b > 0 ? --b : ++b
ao invés deb ? --b : ++b
Eu percebo que o que eu pretendia escrever não funcionaria. Mas o que é surpreendente para mim é o que eu fiznã pretendo escreverfuncion.
Agora, noto queb ?--b : ++b
é basicamente equivalente a--b
Porqueb
no outro bloco é garantido como diferente de zero. Então eu modifiquei o código acima, substituindob?--b:++b
com--b
, como mostrado abaixo
//the modified version
int multiply(int a, int b)
{
if ( !b )
return 0;
else
return a + multiply(a, --b); //modification here
}
Desde a versão original do woks, eu esperava que a versão modificada também funcionasse. Mas, novamente, para minha surpresa, ele não funciona!
O que está errado na versão modificada? Não é equivalente à versão original?É--b
não é equivalente ab ?--b : ++b
E SEb
é diferente de zero? Se for equivalente, por que o primeiro código funciona, mas o segundo nãNota: aqui, por "trabalho", quero dizer que dá a saída correta. Ou seja, dá omultiplicaçã dos números inteiros passados para a funçã