Duvida com incrementador

12 respostas
alucardeck

não lembro onde, mas alguem aqui no GUJ uma vez postou essa linha de comando

int x=3; x = -x + x++ * --x; System.out.println(x);

fazendo na mão…
achei q daria 4 o resultado…
mas ai fiz varias tentativas diferentes na mão e nenhuma deu o certo…
a saida é 6…

pensei na ordem q aconteceria…

  • primeiro…

então (para X=3 inicialmente)
x = -x + (x++ * --x)
o x++ acontece depois da função… e o --x antes
x = -4 + (2++ * 2)
x = -4 + (4++) —> agora o ++ ativa
x = -3 + (5)
x = 2

enfim… pensei em varias ordens q isso poderia ter ocorrido…
com o x++ depois de todos os calculos… ou depois do bloco do ’ * '…

e nenhuma deu exatamente 6…

alguem sabe me explicar qual a ordem que o compilador trata essa conta?

12 Respostas

sergiotaborda

alucardeck:
não lembro onde, mas alguem aqui no GUJ uma vez postou essa linha de comando

int x=3; x = -x + x++ * --x; System.out.println(x);

fazendo na mão…
achei q daria 4 o resultado…
mas ai fiz varias tentativas diferentes na mão e nenhuma deu o certo…
a saida é 6…

pensei na ordem q aconteceria…

  • primeiro…

então (para X=3 inicialmente)
x = -x + (x++ * --x)
o x++ acontece depois da função… e o --x antes
x = -4 + (2++ * 2)
x = -4 + (4++) —> agora o ++ ativa
x = -3 + (5)
x = 2

(precedencia de  e ++)

x = -3 + (3++) * (3) =  -3 + (4) * (2)

= -3 + 8 = 5;

fim da instrução x++ -> x =6;

Acho que é isso…

alucardeck
<blockquote><div class="quote-author">sergiotaborda:</div>

(precedencia de  e ++)

x = -3 + (3++) * (–3) =  -3 + (4) * (2)

= -3 + 8 = 5;

fim da instrução x++ -> x =6;

Acho que é isso…

mas se o 2ºx ficou 4… então o X++ jah foi utilizado

pq utiliza ele novamente no final da linha ‘5 --> 6’ ?

L

Nenhum compilador do mundo vai substituindo todas as variáveis por seus valores primeiro, pra depois fazer o cálculo. Por fazer isso, você não consegue entender o que acontece.

O que acontece é isso:

x = -x + x++ * --x	// x = 3
x = -x + x++ * --x	// calcula primeiro membro da multiplação, x = 4, mas, por ser postfix, o resultado é o de "antes do incremento"
x = -x + 3 * --x	// calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de "depois do decremento"
x = -x + 3 * 3	// multiplicação simples
x = -x + 9	// x = 3, com o operador unário "-" fica
x = -3 + 9	// soma simples
x = 6
sergiotaborda

Leonardo3001:
Nenhum compilador do mundo vai substituindo todas as variáveis por seus valores primeiro, pra depois fazer o cálculo. Por fazer isso, você não consegue entender o que acontece.

O que acontece é isso:

x = -x + x++ * --x // x = 3 x = -x + x++ * --x // calcula primeiro membro da multiplação, x = 4, mas, por ser postfix, o resultado é o de "antes do incremento" x = -x + 3 * --x // calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de "depois do decremento" x = -x + 3 * 3 // multiplicação simples x = -x + 9 // x = 3, com o operador unário "-" fica x = -3 + 9 // soma simples x = 6

humm… mas se isso e´verdade então poderiamos substituir por
x = -x + 3 * --x
já que x++ é equivalente a 3.

Mas desta forma não dá 6. Porquê ?

[adicionado]

Na sua logica vc escreve // calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de “depois do decremento” mas inclui 3 em vez de 2. É isso mesmo ?
[/adicionado]

alucardeck

Leonardo3001:

O que acontece é isso:

x = -x + x++ * --x // x = 3 x = -x + x++ * --x // calcula primeiro membro da multiplação, x = 4, mas, por ser postfix, o resultado é o de "antes do incremento" x = -x + 3 * --x // calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de "depois do decremento" x = -x + 3 * 3 // multiplicação simples x = -x + 9 // x = 3, com o operador unário "-" fica x = -3 + 9 // soma simples x = 6

no X++:
o resultado é antes do incremento, correto…

só q nesse caso o ++ é nulo ?
ele no final das contas não incrementa o X ?
sendo q deveria ser incrementado apos as operações ou não ?

sergiotaborda

Ah! agora sim.
Valeu.

alucardeck

entendi melhor agora…

mas isso é da esquerda para direita ?
ou na ordem normal das operações?

pois só para constar
o ’ -x ’ (o primeiro)

foi incrementado e depois decrementado tb ? 3–>4–>3 ?

eu achava q o x++ iria incrementar somente no final da linha de codigo ou bloco de calculo…
e não no momento após o compilador passar pela variavel X++ indo para o ’ * ’

claudneto

a multiplicação vem antes do incremento…

pq o incremento é uma soma!!!

-x + x++ * --x = -x + (x+1) * (x-1)
sergiotaborda

[quote=claudneto]a multiplicação vem antes do incremento…

pq o incremento é uma soma!!!

-x + x++ * --x = -x + (x+1) * (x-1)

O incremento não é uma soma.
A multiplicação não vem antes do incremento. Veja a ordem de precedência de operadores

claudneto

[quote=sergiotaborda]

claudneto:
a multiplicação vem antes do incremento…

pq o incremento é uma soma!!!

-x + x++ * --x = -x + (x+1) * (x-1)

O incremento não é uma soma.
A multiplicação não vem antes do incremento. Veja a ordem de precedência de operadores

Incremento não é somar 1…ou subtrair 1?

Sefo

sergiotaborda:
Leonardo3001:
Nenhum compilador do mundo vai substituindo todas as variáveis por seus valores primeiro, pra depois fazer o cálculo. Por fazer isso, você não consegue entender o que acontece.

O que acontece é isso:

x = -x + x++ * --x // x = 3 x = -x + x++ * --x // calcula primeiro membro da multiplação, x = 4, mas, por ser postfix, o resultado é o de "antes do incremento" x = -x + 3 * --x // calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de "depois do decremento" x = -x + 3 * 3 // multiplicação simples x = -x + 9 // x = 3, com o operador unário "-" fica x = -3 + 9 // soma simples x = 6


(1)
humm… mas se isso e´verdade então poderiamos substituir por
x = -x + 3 * --x
já que x++ é equivalente a 3.

Mas desta forma não dá 6. Porquê ?

adicionado

Na sua logica vc escreve // calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de “depois do decremento” mas inclui 3 em vez de 2. É isso mesmo ?
[/adicionado]

  1. Se vc apenas substituir o primeiro membro da multiplicação pelo valor 3, a variavél x não será incrementada. Observe que se x=3, x++, o valor de x na expressão será 3, mas antes que o segundo membro da multiplicação seja calculado o valor da variavél já será 4. Fui claro?

  2. A variavel x, inicialmente 3, foi incrementada após o seu uso como primeiro termo da multiplicação tornando-se 4. Para o segundo termo(operador pré-fixo), o seu valor é decrementado antes de ser usado na expressão, tornando-se 3 novamente.

Auf Wiedersehen!!!

Sefo

alucardeck:
Leonardo3001:

O que acontece é isso:

x = -x + x++ * --x // x = 3 x = -x + x++ * --x // calcula primeiro membro da multiplação, x = 4, mas, por ser postfix, o resultado é o de "antes do incremento" x = -x + 3 * --x // calcula segundo membro da multiplicação, x= 3, por ser prefix, o resultado é o de "depois do decremento" x = -x + 3 * 3 // multiplicação simples x = -x + 9 // x = 3, com o operador unário "-" fica x = -3 + 9 // soma simples x = 6

no X++:
o resultado é antes do incremento, correto…

só q nesse caso o ++ é nulo ?
ele no final das contas não incrementa o X ?
sendo q deveria ser incrementado apos as operações ou não ?

Não é nulo não.
Se vc não usar o operador, o segundo termo da expressão seria 2 (e não 3). Ele incrementa a variavel em algum momento depois da substituiçaõ de x por 3 no primeiro termo e antes do calculo do segundo termo.

O incremento/decremento sempre ocorrerá, a diferença é o momento o qual será efetivado, se antes ou depois de ser usado na expressão.

Auf Wiedersehen!!!

Criado 19 de agosto de 2008
Ultima resposta 19 de ago. de 2008
Respostas 12
Participantes 5