Pergunta

Esta foi uma pergunta da entrevista. Eu disse que eles eram os mesmos, mas esta foi julgado uma resposta incorreta. Do ponto montador de vista, há alguma diferença que se possa imaginar? Eu compilei dois programas de curta C usando técnicas de otimização gcc padrão e -S para ver a saída assembler, e eles são o mesmo.

Foi útil?

Solução

O entrevistador pode ter queria uma resposta algo como isto:

i=i+1 terá que carregar o valor de i, adicionar um para ele, e então armazenar a volta resultado para i. Em contraste, ++i pode simplesmente incrementar o valor usando uma única instrução de montagem, de modo que, em teoria, pode ser mais eficiente. No entanto, a maioria dos compiladores irá otimizar afastado a diferença, e o código gerado será exatamente o mesmo.

FWIW, o fato de que você sabe como olhar para a montagem faz de você um programador melhor do que 90% das pessoas que eu tive a entrevista longo dos anos. Se consolar com o fato de que você não terá que trabalhar com o perdedor sem noção que o entrevistou.

Outras dicas

Parece que você estava certo e eles estavam errados. Eu tive um problema semelhante em uma entrevista de emprego, onde eu dei a resposta correta que foi considerado incorreto.

I confiança argumentou o ponto com o meu entrevistador, que obviamente se ofendeu ao meu atrevimento. Eu não conseguir o emprego, mas, novamente, trabalhando sob alguém que "sabe tudo" que não seria desejável também.

Você provavelmente está certo. Um compilador ingênuo pode fazer:

++i to inc [ax]

e

i = i + 1 to add [ax], 1

mas qualquer compilador sensata metade só vai otimizar a adição de 1 à primeira versão.

Isso tudo pressupõe a arquitetura relevante tem inc e adicionar instruções (como x86 faz).

Para defender o entrevistador, o contexto é tudo. Qual é o tipo de i? Estamos falando C ou C ++ (ou algum outro C como a linguagem)? que lhe foi dada:

++i;
i = i + 1;

ou havia mais contexto?

Se eu tivesse sido perguntado isso, minha primeira resposta teria sido "é i volátil?" Se a resposta for sim, então a diferença é enorme. Se não, a diferença é pequena e semântica, mas pragmaticamente nenhum. A prova disso é a diferença na árvore de análise, e o sentido último das subárvores gerados.

Assim, parece que você tem o direito lado pragmático, mas o lado errado pensamento semântica / crítica.

Para atacar o entrevistador (sem contexto), eu tenho que saber o que a finalidade era a pergunta. Se eu fiz a pergunta, eu gostaria de usá-lo para descobrir se o candidato sabia diferenças semânticas sutis, como gerar uma árvore de análise, como pensar criticamente e assim por diante e assim por diante. Eu normalmente fazer uma pergunta C dos meus entrevistados que quase todos os candidatos obtiver errado - e isso é por design. Eu realmente não se preocupam com a resposta à pergunta: eu me preocupo com a viagem que eu vou tomar com o candidato para alcançar a compreensão, o que me diz muito mais sobre do que / errado direito sobre uma questão trivial.

C ++, depende se i é um int ou um objeto. Se for um objeto, ele provavelmente iria gerar uma instância temporária.

o contexto é a principal coisa aqui, porque em uma compilação de lançamento otimizado o compilador irá otimizar afastado o i ++, se a sua disposição a um simples [inc eax]. enquanto algo como some_int int = i ++ seria necessário para armazenar o valor i em some_int primeiro e só depois incrementar i.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top