Ao sombrear i
dentro do loop for, o seguinte código
#include <stdio.h>
int main()
{
for (int i = 1; i < 5; i++) {
printf("%d", i);
int i = i;
printf("%d ", i);
}
}
saídas:
10 20 30 40
Pelo meu entendimento de shadowing, deveria ter sido i
criado um novo com o valor igual ao anterior i
. Isso significa que a saída que eu esperava seria:
11 22 33 44
Além disso, o código parece armazenar o novo i
valor se você incrementá-lo.
#include <stdio.h>
int main()
{
for (int i = 1; i < 5; i++) {
printf("%d", i);
int i = i + 2;
printf("%d ", i);
}
}
isso produz:
12 24 36 48
Aparentemente, i
não está sendo redeclarado a cada iteração - funciona como uma variável que foi inicialmente 0
e depois incrementada a cada iteração.
O que está realmente acontecendo aqui? Como você prevê o comportamento?
Uma declaração como:
Geralmente é legal, mas diferente do que você espera, tentará atribuir
i
a si mesmo (e não aoi
dofor
loop).Isso ocorre porque o novo
i
já está no escopo (caso contrário, um bareint i=i;
sem um anteriori
não seria legal).Depois você acessa isso
i
, o que causa UB ( undefine-behavior ), o que significa que qualquer resultado que você vê é válido.O mesmo se aplica de forma semelhante ao caso de:
Mais informações sobre instruções como essa
int i = i;
podem ser encontradas aqui (essa postagem é para C++, mas também é relevante para C).Conforme mencionado em outro lugar,
int i = i;
tenta inicializari
a partir de si mesmo, mas o últimoi
se refere ao novoi
, não ao antigo, e tem um valor não especificado aqui e, sujeito a certas condições, isso faz com que o programa tenha um comportamento indefinido.Se você deseja inicializar uma nova
i
a partir da antiga, pode fazer isso com uma variável intermediária:Onde
t
é inicializado, o externoi
fica visível e então o novoi
é inicializado a partir det
.