Existe uma diferença dentro ++i
e i++
dentro de um for
loop? É simplesmente uma coisa de sintaxe?
303
Existe uma diferença dentro ++i
e i++
dentro de um for
loop? É simplesmente uma coisa de sintaxe?
Respostas:
um ++ é conhecido como postfix.
adicione 1 a a, retorna o valor antigo.
++ a é conhecido como prefixo.
adicione 1 a a, retorna o novo valor.
C #:
Resultado:
foreach
ewhile
loops dependem de qual tipo de incremento você usa. Com loops for como abaixo, não faz diferença, pois você não está usando o valor de retorno de i:Se o valor avaliado for usado, o tipo de incremento se tornará significativo:
fonte
O pré-incremento ++ i incrementa o valor de i e é avaliado para o novo valor incrementado.
O i ++ pós-incremento incrementa o valor de i e é avaliado como o valor não incrementado original.
Em C ++, o pré-incremento é geralmente preferido onde você pode usar qualquer um.
Isso ocorre porque, se você usar o pós-incremento, pode ser necessário que o compilador gere um código que crie uma variável temporária extra. Isso ocorre porque os valores anteriores e novos da variável que está sendo incrementada precisam ser mantidos em algum lugar, pois podem ser necessários em outro lugar na expressão que está sendo avaliada.
Portanto, pelo menos em C ++, pode haver uma diferença de desempenho que orienta sua escolha de qual usar.
Isso é principalmente apenas um problema quando a variável que está sendo incrementada é um tipo definido pelo usuário com um operador ++ substituído. Para tipos primitivos (int, etc), não há diferença de desempenho. Mas vale a pena aderir ao operador de pré-incremento como uma diretriz, a menos que o operador pós-incremento seja definitivamente o que é necessário.
Há mais discussões aqui:
https://web.archive.org/web/20170405054235/http://en.allexperts.com/q/C-1040/Increment-operators.htm
No C ++, se você estiver usando STL, poderá usar loops para iteradores. Eles têm principalmente operadores ++ substituídos, portanto, é recomendável seguir o pré-incremento. Porém, os compiladores ficam mais inteligentes o tempo todo, e os mais novos podem executar otimizações que significam que não há diferença de desempenho - especialmente se o tipo que está sendo incrementado for definido em linha no arquivo de cabeçalho (como as implementações STL geralmente são) para que o compilador possa ver como o método é implementado e pode saber quais otimizações são seguras para executar. Mesmo assim, provavelmente ainda vale a pena aderir ao pré-incremento, porque os loops são executados várias vezes e isso significa que uma pequena penalidade de desempenho poderá em breve ser ampliada.
Em outras linguagens como C #, onde o operador ++ não pode ser sobrecarregado, não há diferença de desempenho. Utilizados em um loop para avançar a variável do loop, os operadores de pré e pós incremento são equivalentes.
Correção: sobrecarregar ++ em C # é permitido. Parece, porém, que em comparação com o C ++, no c #, você não pode sobrecarregar as versões pré e pós independentemente. Portanto, suponho que, se o resultado da chamada de ++ em C # não for atribuído a uma variável ou usado como parte de uma expressão complexa, o compilador reduzirá as versões pré e pós do ++ para um código que tenha desempenho equivalente.
fonte
Em C # não há diferença quando usado em um loop for .
produz a mesma coisa que
Como outros já apontaram, quando usado em geral i ++ e ++, tenho uma diferença sutil, mas significativa:
i ++ lê o valor de i e depois o incrementa.
++ i incrementa o valor de i e o lê.
fonte
++i
ei++
executam as mesmas operações na mesma ordem: crie uma cópia temporária dei
; aumente o valor do temp para produzir um novo valor (para não substituir o temp); armazene o novo valor emi
; agora se é++i
o resultado retornado é o novo valor; sei++
o resultado retornado for a cópia temporária. Resposta mais detalhada aqui: stackoverflow.com/a/3346729/3330348A questão é:
A resposta é: não .
Por que todas as outras respostas têm que entrar em explicações detalhadas sobre pré e pós incremento, quando isso nem sequer é solicitado?
Este loop for:
Seria traduzir para este código sem usar loops:
Agora importa se você colocar
i++
ou++i
como incremento aqui? Não, pois o valor de retorno da operação de incremento é insignificante.i
será incrementado APÓS a execução do código que está dentro do corpo do loop for.fonte
Desde que você pergunta sobre a diferença em um loop, eu acho que você quer dizer
Nesse caso, você não tem diferença na maioria dos idiomas: o loop se comporta da mesma maneira, independentemente de você escrever
i++
ou++i
. No C ++, você pode escrever suas próprias versões dos operadores ++ e definir significados separados para eles, se oi
for de um tipo definido pelo usuário (sua própria classe, por exemplo).A razão pela qual isso não importa acima é porque você não usa o valor de
i++
. Outra coisa é quando você fazAgora, não é uma diferença, porque, como outros apontam,
i++
meios incrementar, mas avaliar ao valor anterior , mas++i
meios de incremento, mas avaliar ai
(assim seria avaliar para o novo valor). No caso acima,a
é atribuído o valor anterior de i, enquanto i é incrementado.fonte
Como esse código mostra (consulte o MSIL desmembrado nos comentários), o compilador C # 3 não faz distinção entre i ++ e ++ i em um loop for. Se o valor de i ++ ou ++ i estivesse sendo obtido, definitivamente haveria uma diferença (isso foi compilado no Visutal Studio 2008 / Release Build):
fonte
Um (++ i) é pré-incremento, um (i ++) é pós-incremento. A diferença está em qual valor é retornado imediatamente da expressão.
Edit: Woops, ignorou completamente o lado do loop das coisas. Não há diferença real nos loops for quando é a parte 'step' (para (...; ...;)), mas pode entrar em jogo em outros casos.
fonte
Não há diferença se você não estiver usando o valor após o incremento no loop.
Ambos os loops imprimirão 0123.
Mas a diferença ocorre quando você usa o valor após incremento / decremento no seu loop, conforme abaixo:
Loop de pré-incremento:
Saída: 0 0 1 1 2 2 3 3
Pós-incremento do loop:
Saída: 0 0 1 0 2 1 3 2
Espero que a diferença seja clara ao comparar a saída. O ponto a ser observado aqui é que o incremento / decremento é sempre executado no final do loop for e, portanto, os resultados podem ser explicados.
fonte
Aqui está uma amostra de Java e o código de bytes, pós e pré-incremento não mostram diferença no Bytecode:
E agora para o código de bytes (javap -private -c PreOrPostIncrement):
fonte
Sim existe. A diferença está no valor de retorno. O valor de retorno de "++ i" será o valor após o incremento de i. O retorno de "i ++" será o valor antes do incremento. Isso significa que o código se parece com o seguinte:
Portanto, a seria 2 e bec seriam, cada um, 1.
Eu poderia reescrever o código assim:
fonte
Não há diferença real nos dois casos '
i
' será incrementado em 1.Mas há uma diferença quando você o usa em uma expressão, por exemplo:
fonte
Há mais em ++ ie i ++ que loops e diferenças de desempenho. ++ i retorna um valor l e i ++ retorna um valor r. Com base nisso, há muitas coisas que você pode fazer para (++ i), mas não para (i ++).
fonte
Surpreende-me porque é que as pessoas podem escrever a expressão de incremento no loop for como i ++.
Em um loop for, quando o terceiro componente for uma instrução de incremento simples, como em
ou
não há diferença nas execuções resultantes.
fonte
Como @ Jon B diz, não há diferença em um loop for.
Mas em um loop
while
oudo...while
, você pode encontrar algumas diferenças se estiver fazendo uma comparação com o++i
oui++
fonte
Em javascript, devido ao seguinte i ++ pode ser melhor usar:
Enquanto matrizes (acho que todas) e algumas outras funções e chamadas usam 0 como ponto de partida, você teria que definir i como -1 para fazer o loop funcionar com a matriz ao usar ++ i .
Ao usar o i ++, o seguinte valor usará o valor aumentado. Você poderia dizer que o i ++ é o modo como os humanos contam, porque você pode começar com um 0 .
fonte
é igual à versão WHILE
fonte
Pode haver uma diferença para loops. Esta é a aplicação prática de pós / pré-incremento.
Enquanto o primeiro conta até 11 e dá um loop 11 vezes, o segundo não.
Principalmente isso é usado em pouco tempo (x--> 0); - - Faça loop para iterar, por exemplo, todos os elementos de uma matriz (excluindo aqui todas as construções).
fonte
Ambos incrementam o número.
++i
é equivalente ai = i + 1
.i++
e++i
são muito parecidos, mas não exatamente iguais. Ambos incrementam o número, mas++i
incrementam o número antes que a expressão atual seja avaliada, enquanto quei++
incrementam o número após a expressão ser avaliada.Verifique este link .
fonte
Sim, há uma diferença entre
++i
ei++
em umfor
loop, embora em casos de uso incomuns; quando uma variável de loop com operador de incremento / decremento é usada no bloco for ou dentro da expressão de teste de loop ou com uma das variáveis de loop . Não, não é simplesmente uma coisa de sintaxe.Como
i
em um código, significa avaliar a expressãoi
e o operador não significa uma avaliação, mas apenas uma operação;++i
significa valor de incremento dei
1 e depois avaliai
,i++
significa avaliari
e posteriormente incrementar o valor dei
1.Portanto, o que é obtido de cada duas expressões difere porque o que é avaliado difere em cada uma. Tudo igual para
--i
ei--
Por exemplo;
Em casos de uso incomuns, no entanto, o próximo exemplo parece útil ou não, não importa, mostra uma diferença
fonte
Para
i
tipos definidos pelo usuário, esses operadores podem (mas não devem ) terática semântica significativamente diferente no contexto de um índice de loop, e isso pode (mas não deve) afetar o comportamento do loop descrito.Além disso,
c++
geralmente é mais seguro usar o formulário de pré-incremento (++i
) porque é mais facilmente otimizado. (Scott Langham me venceu neste boato . Maldito seja, Scott)fonte
Eu não sei para as outras linguagens, mas em Java ++ i é um incremento de prefixo, o que significa: aumente i em 1 e, em seguida, use o novo valor de i na expressão em que eu reside, e i ++ é um incremento postfix que significa o seguinte : use o valor atual de i na expressão e aumente-o em 1. Exemplo:
} e a saída é:
fonte
i ++; ++ i; ambos são semelhantes, pois não são usados em uma expressão.
fonte