Duvida sobre prova

Ola distintos amigos em um texte para certificacao caiu o seguinte trecho de codigo
y=0;
y =y++;
o que imprime???Bom eu coloquei 1 mas ERREI!!o resultado é ZEROnao acreditei pois em c o resultado é um!!pois é, alguem sabe pq??
essas provas sao a nivel tao baixo de compucao???Poxa essa questao foi CRUEL

y = y++ - a atribuição acontece antes do incremento.
y = ++y - a atribuição acontece depois do incremento.

no caso aí, primeiro “acontece” o y=y e depois o y++…
entendeu?

Oi,
acontece o seguinte,

quando passado isso:

int y = 0;
System.out.println(y = y++); // Resultado 0

ele está mostrando e depois calculando.

quando mostrado isso:

int y = 0;
System.out.println(y = ++y); // Resultado 1

Ele esta calculando e depois mostrando…

Mas acredito que y = y++ ou y = ++y está absurdamente errado, pois deveria ser somente: y++ ou ++y.

Tchauzin!

++ é um operador unário, ou seja, que só tem um operando.

Pode-se pensar que “y++” faz o mesmo trabalho que “y = y + 1”

O operador pode ser pré-fixado ou pós-fixado ao operando.

Quando pré-fixado (ex.: ++y), primeiro ocorrerá a soma (y+1) e depois será feita a leitura do valor resultante.
Quando pó-fixado (ex.: y++), primeiro ocorrerá a leitura de y e depois será feita a soma (y+1).

Pode-se pensar da seguinte forma:

//código equivalente a ++y (supondo que o valor de y passado ao método vai ser alterado, o que não acontece em java)
public int incrementoPreFixado(int y) {

   y = y + 1; //atualiza o valor de y.

   return y; //exibe o novo valor de y, depois do incremento.
}

//código equivalente a y++ 
public int incrementoPosFixado(int y) {
   int retorno = y; //guarda o valor de y, antes do incremento

   y = y + 1; //atualiza o valor de y.

   return retorno; //exibe o antigo valor de y, antes do incremento.
}

public static void main(String[] args) {
    int y = 0;

    SysoutincrementoPosFixado(y); //exibe 0 e muda o valor de y pra 1

    Sysout(incrementoPreFixado(y)); // exibe 2 e muda o valor de y pra 2
    
}

Claro que esses métodos só não funcionarão exatamente como os operadores pois não teria como alterar valor de y passado ao método, pois em Java não existe passagem de valores por referência, apenas por cópia.

Isso aí é válido porque y++ ou ++y são operações que retornam um valor e, por isso, podemos atribuir tal resultado a uma variável.

I

[quote=rissato]y = y++ - a atribuição acontece antes do incremento.
y = ++y - a atribuição acontece depois do incremento.

no caso aí, primeiro “acontece” o y=y e depois o y++…
entendeu?[/quote]
Isso que me falaste nao é nada de novo leia por favor de novo a minha mensagem!!
class A{
int y=0;
y=y++;
System.out.println(y);//resultado é Zero ao invez de "1"pois em c em varios outros compiladores é 1 essa. Essa é a minha duvida e nao sobre o que é ++y ou y++ pré-incremento e pós-incremento
}
valeu!

[quote=rissato]y = y++ - a atribuição acontece antes do incremento.
y = ++y - a atribuição acontece depois do incremento.

no caso aí, primeiro “acontece” o y=y e depois o y++…
entendeu?[/quote]

Eu tbm não entendi.

primeiro acontece y=y

depois acontece y++

Logo se vc tivesse:

System.out.println(y=y++);
System.out.println(y);

deveria imprimir:
0
1

mas…não é o q ocorre?

pq? afinal de contas…depois acontece y++, então pq na segunda linha não imprimiu 1?

A atribuição é sempre a última operação a ser realizada… veja no passo a passo mais ou menos o q aconteceu:

int y = 0; //inicializou y com zero
y = y++;
/*

  • primeiro, será feita a avaliação dos operandos, do lado direito temos uma operacao y++… qual o resultado dela? ZERO, pois o operador foi pos-fixado… entao, a JVM já sabe que o valor a ser atribuido eh ZERO.
  • Em seguida, o valor de y é incrementado em 1 e o valor de y passa a ser 1.
  • Mas, por fim, aquele valor que foi lido inicialmente (ZERO) será atribuido a y (por causa do operador de atribuição)
  • Então, no final de tudo, nesse caso, o valor de y vai ser ZERO.
    */

Ou seja, se tivessemos apenas y++, o resultado de y seria 1, mas como tinhamos y = y++, entao o valor final eh zero.

se fosse usar a analogia dos metodos q eu fiz eh como se fizesse:

y = incrementoPosFixado(y); //após encerrar o método, temos que o retorno dele foi zero e o valor de y é 1… mas aih estamos pegando o resultado, que foi zero, e atribuindo a y, que passa a ser zero.

[]'s

[quote=RafaelVS]++ é um operador unário, ou seja, que só tem um operando.

Pode-se pensar que “y++” faz o mesmo trabalho que “y = y + 1”

O operador pode ser pré-fixado ou pós-fixado ao operando.

Quando pré-fixado (ex.: ++y), primeiro ocorrerá a soma (y+1) e depois será feita a leitura do valor resultante.
Quando pó-fixado (ex.: y++), primeiro ocorrerá a leitura de y e depois será feita a soma (y+1).

Pode-se pensar da seguinte forma:

//código equivalente a ++y (supondo que o valor de y passado ao método vai ser alterado, o que não acontece em java)
public int incrementoPreFixado(int y) {

   y = y + 1; //atualiza o valor de y.

   return y; //exibe o novo valor de y, depois do incremento.
}

//código equivalente a y++ 
public int incrementoPosFixado(int y) {
   int retorno = y; //guarda o valor de y, antes do incremento

   y = y + 1; //atualiza o valor de y.

   return retorno; //exibe o antigo valor de y, antes do incremento.
}

public static void main(String[] args) {
    int y = 0;

    SysoutincrementoPosFixado(y); //exibe 0 e muda o valor de y pra 1

    Sysout(incrementoPreFixado(y)); // exibe 2 e muda o valor de y pra 2
    
}

Claro que esses métodos só não funcionarão exatamente como os operadores pois não teria como alterar valor de y passado ao método, pois em Java não existe passagem de valores por referência, apenas por cópia.

Isso aí é válido porque y++ ou ++y são operações que retornam um valor e, por isso, podemos atribuir tal resultado a uma variável.[/quote]

Olha sinceramente acho que isso tem mais aver com o fato que o método vai ficar no heap ou algo assim e a variavel local na pilha, o compilador dever dar algun tipo de preferencia considerando o pós e o pré ,que eu nao sei

int y=0;
y =y++;
System.out.prinltn(y);resultado é zero mas ja em c e outros compiladores é um

[quote=RafaelVS]A atribuição é sempre a última operação a ser realizada… veja no passo a passo mais ou menos o q aconteceu:

int y = 0; //inicializou y com zero
y = y++;
/*

  • primeiro, será feita a avaliação dos operandos, do lado direito temos uma operacao y++… qual o resultado dela? ZERO, pois o operador foi pos-fixado… entao, a JVM já sabe que o valor a ser atribuido eh ZERO.
  • Em seguida, o valor de y é incrementado em 1 e o valor de y passa a ser 1.
  • Mas, por fim, aquele valor que foi lido inicialmente (ZERO) será atribuido a y (por causa do operador de atribuição)
  • Então, no final de tudo, nesse caso, o valor de y vai ser ZERO.
    */

Ou seja, se tivessemos apenas y++, o resultado de y seria 1, mas como tinhamos y = y++, entao o valor final eh zero.

se fosse usar a analogia dos metodos q eu fiz eh como se fizesse:

y = incrementoPosFixado(y); //após encerrar o método, temos que o retorno dele foi zero e o valor de y é 1… mas aih estamos pegando o resultado, que foi zero, e atribuindo a y, que passa a ser zero.

[]'s[/quote]

hmmmm…

agora entendi! Eu acreditava que o pós-incremento era sempre a última coisa a acontecer num comando. Ainda acho que isso seria o mais lógico, mas enfim, pra ter sido feito assim era pq deveria ter sua necessidade…

valeu Rafael!

[quote=fabioEM]
Olha sinceramente acho que isso tem mais aver com o fato que o método vai ficar no heap ou algo assim e a variavel local na pilha, o compilador dever dar algun tipo de preferencia considerando o pós e o pré ,que eu nao sei

int y=0;
y =y++;
System.out.prinltn(y);resultado é zero mas ja em c e outros compiladores é um[/quote]

Essa explicação que eu dei não foi em relação ao resultado de y = y++… foi apenas explicando o que eh pre e pos incremento. A explicação sobre o que realmente acontece foi a que eu respondi em seguida:

[quote=RafaelVS]A atribuição é sempre a última operação a ser realizada… veja no passo a passo mais ou menos o q aconteceu:

y = incrementoPosFixado(y); //após encerrar o método, temos que o retorno dele foi zero e o valor de y é 1… mas aih estamos pegando o resultado, que foi zero, e atribuindo a y, que passa a ser zero.

[]'s[/quote]

Como o retorno é um valor e existe outro valor??

y = incrementoPosFixado(y); //após encerrar o método, temos que o retorno dele foi zero e o valor de y é 1…
essa parte nao entendi quantas variaveis tem entao 2,uma na pilha??e a outra?Mas as variaves locais nao ficam todas la?
e desde ja agradeço sua atencao!!

se vc olhar o corpo do método, perceberá que tem uma variavel “retorno” que guarda o valor a ser retornado.

quote=RafaelVS]A atribuição é sempre a última operação a ser realizada… veja no passo a passo mais ou menos o q aconteceu:

y = incrementoPosFixado(y); //após encerrar o método, temos que o retorno dele foi zero e o valor de y é 1… mas aih estamos pegando o resultado, que foi zero, e atribuindo a y, que passa a ser zero.

[]'s[/quote]

[/quote]

Tudo bem mas me tira outra duvida
y++ é igual a y=y+1
System.out.println(y);//imprime 1;ok!!

entao por essa logica
y=y++ é igual y=y=y+1
deveria imprimir 0 ok?,mas…

class A{
public static void main(String a[]){
int y=0,a=0;
y=y++;
System.out.println(y);//tenho um resultado que é zero
//se fizer
a=a=a+1;
System.out.println(a);//tenho 1 outro resultado!!

Como fica??

}

}

veja…

quando vc usa y++ vc ta usando um operador unário pós-fixado… ele tem um funcionamento especial… como é esse funcionamento? primeiro lê-se o valor inicial do operando (que será o valor da expressão) e depois incrementa seu valor… o significado é: “incremente o valor de y e mas retorne o valor antigo dele”

quando vc usa a = a + 1, vc nao está usando um operador unário… não tem nenhum funcionamento especial aqui… então o que acontece? eu estou somando o valor de a, em seguida estou atribuindo esse valor a a… o operador “atribuição” também retorna um valor… e o valor que ele retorna é igual ao valor que foi atribuido. Assim sendo, como a + 1 retornou 1, então o valor da atribuição é 1.

Ou seja, se vc manda exibir y++, será exibido 0… se vc manda exibir a = a + 1, será exibido 1. Assim sendo, não será diferente se tentarmos atribuir essese valores a uma variável. Então, temos que:

y = y++; // valor final de y = 0
a = a = a + 1; // valor final de a = 1

pra concluir entao, sem testar, qual é o resultado dos sysouts?

[code]int x, y = 0;

y = y++;
y = y++;
x = y;
System.out.println(x);
System.out.println(y);[/code]

0 e 0

como assim o seria se fizesse:

int y = 0;

y = y++;
y = y++;
y = y++;
y = y++;
y = y++;
y = y++;
/…
y = y++;
y = y++;
y = y++;
y = y++;
y = y++;
y = y++;

sysout(y); // exibe 0

e agora?

[code]int x, y = 0;

y = y++;
x = y;
x = y++;
System.out.println(x);
System.out.println(y);[/code]

agora x eh 0 e y eh 1, ja que o valor de y na segunda operacao nao foi atribuido a y.

agora faz esse aqui, sem testar tb:

int x, y = 0;

y = y++;
x = x++;
x = y;

sysout(x);
sysout(y);

0,0 em java.
então, eu li que cada compilador trata do pos incremento de uma maneira diferente, ou seja, o resultado varia de compilador pra compilador.
testei em g++ o resultado foi outro.

[quote=formigaotts]0,0 em java.
então, eu li que cada compilador trata do pos incremento de uma maneira diferente, ou seja, o resultado varia de compilador pra compilador.
testei em g++ o resultado foi outro.[/quote]

Errado…

em Java isso vai dar erro de compilação, pois a variável x está tentando ser acessada sem antes ter sido inicializada:

int x, y=0;

hehehhehehe (é esse tipo de pegadinha que lasca o cara na prova da certificação)