Posso usar a mesma variável de contador para um for
loop dentro de um for
loop?
Ou as variáveis afetarão umas às outras? O código a seguir deve usar uma variável diferente para o segundo loop, como j
, ou está i
bem?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
i
, com escopos diferentes. Use-Wshadow
com o GCC para obter esses problemas relatados automaticamente.-Wshadow
não esteja incluído em-Wall
.-Wshadow
avisa sobre o sombreamento de variáveis globais também, o que pode facilmente se tornar irritante em projetos maiores.-Wextra
não inclui-Wshadow
. Eu acho que é comum o suficiente em alguns projetos, ou algum desenvolvedor gcc adora sombreamento como estilo de codificação, para garantir ser deixado de fora assim.-Wshadow
tem uma taxa de falsos positivos horrenda, tornando-o completamente inútil. O escopo existe por uma razão, e o sombreamento não é problemático a priori . Agora-Wshadow-local
(nota: não-Wshadow=local
) é muito diferente. Mas, infelizmente, o GCC até agora se recusou a incluí-lo no tronco (embora pareça haver forks do GCC que o incluem).Respostas:
Você pode usar o mesmo nome (identificador). Será um objeto diferente. Eles não afetarão um ao outro. Dentro do loop interno, não há como se referir ao objeto usado no loop externo (a menos que você faça provisões especiais para isso, fornecendo um ponteiro para ele).
Este é geralmente um estilo ruim, é propenso a confusão e deve ser evitado.
Os objetos são diferentes apenas se o interno for definido separadamente, como com o que
int i
você mostrou. Se o mesmo nome for usado sem definir um novo objeto, os loops usarão o mesmo objeto e irão interferir uns nos outros.fonte
Em primeiro lugar, isso é absolutamente legal: o código será compilado e executado, repetindo o corpo do loop aninhado 10 × 10 = 100 vezes. O contador de loop
i
dentro do loop aninhado ocultará o contador do loop externo, de modo que os dois contadores seriam incrementados independentemente um do outro.Visto que o externo
i
está oculto, o código dentro do corpo do loop aninhado teria acesso apenas ao valor dei
do loop aninhado, nãoi
do loop externo. Em situações em que o loop aninhado não precisa de acesso aoi
código externo, esse código pode ser perfeitamente justificável. No entanto, isso provavelmente criará mais confusão em seus leitores, portanto, é uma boa ideia evitar escrever esse código para evitar "responsabilidades de manutenção".Nota: Mesmo que as variáveis de contador de ambos os loops tenham o mesmo identificador
i
, elas permanecem como duas variáveis independentes, ou seja, você não está usando a mesma variável em ambos os loops. Usar a mesma variável em ambos os loops também é possível, mas o código seria difícil de ler. Aqui está um exemplo:Agora, os dois loops usam a mesma variável. No entanto, leva um tempo para descobrir o que esse código faz sem compilá-lo ( demo );
fonte
int
loop for interno, ou seja, usar realmente a mesma variável de contador, fará com que o loop externo execute apenas uma vez, pois o loop interno sairái == 10
. Isso é trivial, masVocê pode. Mas você deve estar ciente do escopo dos
i
s. se chamarmos o externoi
comi_1
e o internoi
comi_2
, o escopo doi
s é o seguinte:Você deve notar que eles não afetam um ao outro, e apenas seu escopo de definição é diferente.
fonte
Isso é completamente possível, mas tenha em mente que você não será capaz de resolver o primeiro i declarado
no segundo loop dentro do segundo loop filho
se você precisar ajustar ou obter o valor do primeiro i, use j no segundo loop
e se for criativo o suficiente, você pode fazer os dois em um ciclo
fonte
Sim, você pode usar o mesmo nome de variável de contador para um
for
loop interno e para o externofor
.De loop for :
O escopo de loop_statement está aninhado dentro do escopo de init_clause .
Dos Padrões C # 6.8.5p5 Declarações de iteração [ênfase minha]
Dos padrões C # 6.2.1p4 Escopos de identificadores [ênfase minha]
fonte
Do ponto de vista do código / compilador, isso seria uma coisa perfeitamente válida e legal de se fazer. O
int i
declarado nofor(int i = 0; i < 10; i++)
loop interno está em um escopo novo e menor, de modo que a declaração obscurece a declaração deint i
no loop externo (ou, com outras palavras: No escopo interno todos os acessos à variáveli
vão para oint i
declarado no escopo interno, deixando oint i
no escopo externo intocado).Dito isso, da perspectiva da qualidade do código, isso é totalmente horrível. É difícil de ler, difícil de entender e fácil de interpretar mal. Não faça isso.
fonte
Sim, você pode usar, mas é muito confuso. O mais importante é o escopo da variável local dentro do loop. No que diz respeito a se uma variável for declarada dentro de uma função, o escopo dessa variável é essa função.
Da mesma forma, no caso dos loops, a variável declarada dentro do loop interno tem escopo diferente e a variável declarada no loop externo tem escopo diferente.
A melhor abordagem é usar variáveis diferentes para loops internos e externos.
fonte
Sim, definitivamente você pode usar a mesma variável de nome.
As variáveis de programação C podem ser declaradas em três lugares:
variáveis locais: -Dentro de uma função ou bloco.
Variáveis globais: - Fora de todas as funções.
Parâmetros formais: -Nos parâmetros da função.
Mas no seu caso
i scope
terá que se preocupar com as coisas abaixoObservação: seria uma prática recomendada usar variáveis diferentes para loops internos e externos
fonte
Sim - e ainda mais interessante, você pode reutilizar um nome de variável sempre que abrir um conjunto de colchetes. Isso geralmente é útil ao inserir o código de diagnóstico. Digite uma chave aberta '{' seguido pela declaração e uso de variáveis, então feche a chave e as variáveis vão embora. Isso garante que você não interferirá em nada no corpo principal, ao mesmo tempo em que retém a vantagem de quaisquer variáveis, classes e métodos declarados fora das chaves.
fonte
Regra de escopo: uma variável declarada em uma instrução for só pode ser usada nessa instrução e no corpo do loop.
Se em seu código você definiu múltiplas instâncias de i em loops internos, cada instância ocupará seu próprio espaço de memória. Portanto, não há nada para se preocupar com os resultados de qualquer maneira, seria o mesmo.
Mas não é recomendado usar o mesmo nome de variável, pois é difícil de entender e se torna um código insustentável posteriormente.
fonte
A parte importante é que o parâmetro do loop interno contém
int i
. Pori
ser redefinido dessa forma, as duas variáveis não se afetam; seus escopos são diferentes. Aqui estão dois exemplos para mostrar isso:Observe que o código acima inclui
int i
o parâmetro de loop interno e o código abaixo apenas incluii
.fonte
Bem, você pode fazer isso sem que seus scripts tenham problemas, mas você deve evitar essa estrutura. Geralmente leva a confusão
fonte