O código se parece com o seguinte:
classe pública Testplusplus {public static void main (string [] args) {int k = addAfterReturn (10); System.out.println (k); // saída 10 int k1 = addBeforereTurn (10); System.out.println (K1); // saída 11} public static int addBeforereTurn (int i) {return ++ i; } public static int addafterReturn (int i) {return i ++; }}Do nível de bytecode,
O bytecode de AddafterReturn é o seguinte:
0: ILOAD_01: Iinc 0, 14: IreTurn
É simples, ILOAD_0 significa colocar o valor do elemento indexado para 0 na tabela de variáveis local na parte superior da pilha. Portanto, o valor de que eu passou é colocado no topo da pilha, e o iinc 0,1 significa colocar a tabela de variável local
Os elementos com o índice 0 são adicionados a 1 e, finalmente, o IreTurn coloca o valor int na parte superior da pilha no quadro da pilha do chamador. (As pilhas aqui são pilhas de operando)
Portanto, o iinc 0 e 1 não afetam o valor retornado, portanto o retorno ainda é 10.
Da mesma forma, AddBeforereTurn Bytecode é o seguinte:
0: Iinc 0, 13: ILOAD_04: IreTurn
Vou deixar a todos por sua própria análise. De fato, é óbvio que isso está incrementando primeiro e depois colocá -lo na pilha. Portanto, o valor retornado é realmente incrementado.
Agora, vamos fazer uma pergunta de entrevista que eu me corrigi.
classe pública Testplusplus2 {static {x = 5; int y = 10; } estático int x, y; public static void main (string args []) {x--; myMethod (); System.out.println (x+y+++ x); } public static void myMethod () {y = x +++++ x; }}Você sabe a resposta? Execute, a resposta correta é 23.
Se você realmente entende o exposto, essa pergunta também é muito simples. Primeiro de tudo, você conhece os valores de X e Y antes de executar o Main. Isso envolve o mecanismo de carregamento de classe. O estágio de preparação do carregamento de classe atribuirá a variável estática ao valor zero desse tipo. Se int é int, ele corresponde a 0. No estágio de inicialização da classe, os blocos estáticos e os comportamentos de atribuição de variáveis estáticos na classe são coletados de acordo com a ordem do código para gerar o método. Portanto, neste teste, x = 5, y = 0;
Continue analisando, x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++ não adicionará 1 antes de executar a operação de adição subsequente, assim como o retorno I ++ somente após o retorno (você pode entender o retorno como a operação de pilha ILOAD acima, não a instrução IRETRUN), então o primeiro ADD é 4, mas deve ser o que deve ser o que é o que mais é 5, o que é mais necessário.
Em seguida, é muito simples x+y +++ x é 6+10+7 é 23. Felizmente, se você pode entender o bytecode, poderá traduzir o código bytecode do código e usar o bytecode para verificá -lo, e você também pode encontrar esses resultados.
Vamos dar uma olhada em outro exemplo, que foi fornecido pelos grandes caras do grupo. Eu acho que também é muito básico.
public static int plus (int i) {tente {++ i; System.out.println ("Try"); retornar i ++; } finalmente {System.out.println ("finalmente"); i ++; // retorna i; }} public static void main (string [] args) {System.out.println (test1.plus (5));}Você consegue pensar em quanto é a saída final? Se você remover os comentários, é por isso que você não retorna no bloco finalmente. Porque não importa se está certo ou errado, um determinado valor pode sempre ser retornado.
Resumir
O exposto acima é uma explicação detalhada de I ++ e ++ I nas perguntas da entrevista em Java, apresentadas pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!