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.

C99 (PDF)

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.

Foi útil?

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.

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