Por exemplo, temos o seguinte código:
#include <stdio.h>
int main(void)
{
int n = 4;
{
n++;
}
printf("%d\n",n);
return 0;
}
Como o bloco interno vê a variável n? Como o padrão da linguagem C explica isso? Há algum tempo venho procurando uma resposta para essa pergunta. Na minha opinião, a resposta é a seguinte: em C17, temos (6.8 #3):
Um bloco permite que um conjunto de declarações e instruções seja agrupado em uma unidade sintática. Os inicializadores de objetos com duração de armazenamento automática e os declaradores de array de comprimento variável de identificadores comuns com escopo de bloco são avaliados e os valores são armazenados nos objetos (incluindo o armazenamento de um valor indeterminado em objetos sem um inicializador) cada vez que a declaração é alcançada, na ordem de execução, como se fosse uma instrução, e dentro de cada declaração na ordem em que os declaradores aparecem.
Se você não considerar os inicializadores, descobrirá que um bloco é composto apenas de algumas instruções. Usamos um bloco para avaliar todos esses operadores como uma unidade sintática. Em outras palavras, se você remover os caracteres {} do bloco, esses serão os mesmos operadores e o resultado será exatamente o mesmo, mas esses operadores não serão avaliados em uma unidade sintática:
#include <stdio.h>
int main(void)
{
int n = 4;
n++; // same effect but without {}
printf("%d\n",n);
return 0;
}
Também temos (6.2.1 # 4):
Se o declarador ou especificador de tipo que declara o identificador aparecer dentro de um bloco ou dentro da lista de declarações de parâmetros em uma definição de função, o identificador terá escopo de bloco, que termina no final do bloco associado.
A partir disso entendemos que n tem um escopo de bloco.
Se combinarmos tudo isso, descobrimos que n é incrementado como se o operador de incremento nunca tivesse aparecido no bloco interno.
Esta resposta está correta? Se não, explique o porquê. E cite um parágrafo do padrão da linguagem C.