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?
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
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
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 = 3x=-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 simplesx=-x+9// x = 3, com o operador unário "-" ficax=-3+9// soma simplesx=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.
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]
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?
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.