C99:Posso declarar as variáveis no início de um bloco em um 'para'?
Pergunta
É o seguinte código legal de acordo com a C99?
...
for(....) {
int x = 4;
...
}
...
Você pode supor que, antes de a linha 3, a variável x nunca foi declarado.
Até agora eu só encontrei a seguinte, mas eu não acho que isso é o suficiente:
Um bloco permite que um conjunto de declarações e instruções para ser agrupados em uma unidade sintática.Os inicializadores de objetos que têm automático de armazenamento de duração, e o comprimento variável matriz declarators o comum dos identificadores com o escopo de bloco, são avaliados e os valores são armazenados em objetos (incluindo o armazenamento de um valor indeterminado em objetos sem um inicializador) cada vez que a declaração for atingido no ordem de execução, como se fosse um instrução, e dentro de cada declaração na ordem em que declarators aparecer.
A partir da página 145 de que o PDF.
Solução
Sim, você pode definir ou declarar uma variável em qualquer lugar que você quiser em C99 (no início de um bloco de C89).
Você disse:
"Você pode assumir que antes da linha 3 do variável x nunca foi declarado."
Mesmo se ele foi declarado anteriormente, você poderia declarar uma novo variável com o mesmo nome.Fazer o que impede você de acessar o velho variável dentro do bloco.
int x = 0; /* old x */
printf("%d\n", x); /* old x, prints 0 */
do {
int x = 42; /* new x */
printf("%d\n", x); /* new x, prints 42 */
} while (0);
printf("%d\n", x); /* old x, prints 0 */
Eu nunca tentei o seguinte na C99.Eu realmente não sei o que acontece :)
Vou tentar mais tarde, quando eu ter acesso a um (quase) C99 compilador
int x = 0;
do {
printf("%d\n", x); /* old x? new x? crash? Undefined Behaviour? */
int x = 42;
} while (0);
O C99 recurso de declarar/definição de variáveis onde quer que se quer não é uma característica que me faz querer mudar :)
Outras dicas
Isso é legal em C99 e C89. Olhe para 6.8.2, que define a instrução composta
Sim, você pode criar uma variável no início de qualquer bloco. A variável é inicializada sempre que o bloco é inserido em C ++, você pode criá -los em qualquer lugar dentro do bloco.
for(....)
{
int x=4;
/*More code*/
}
Sim, isso é legal no C99, mas você não tem permissão para acessar 'x' após o bloco. Será um comportamento indefinido tentando acessar 'x' além do seu escopo.