例如我们有这样的代码:
#include <stdio.h>
int main(void)
{
int n = 4;
{
n++;
}
printf("%d\n",n);
return 0;
}
内部代码块如何看待变量 n?C 语言标准对此是如何解释的?我一直在寻找这个问题的答案。在我看来,答案如下:在 C17 中,我们有(6.8 #3):
块允许将一组声明和语句组合成一个语法单元。具有自动存储期的对象的初始化器,以及具有块作用域的普通标识符的变长数组声明器,在每次按声明顺序到达时都会被求值,并将值存储在对象中(包括在没有初始化器的对象中存储不确定的值),就像它是一个语句一样,并且在每个声明中,都按照声明器出现的顺序进行。
如果不考虑初始化器,那么块实际上只是几个语句。我们只是使用一个块将所有这些运算符作为一个语法单元进行评估。换句话说,如果删除块中的 {} 字符,这些将是相同的运算符,结果将完全相同,但这些运算符不会在一个语法单元中进行评估:
#include <stdio.h>
int main(void)
{
int n = 4;
n++; // same effect but without {}
printf("%d\n",n);
return 0;
}
我们还有(6.2.1#4):
如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则该标识符具有块作用域,该作用域在关联块的末尾终止。
由此我们了解到 n 具有块作用域。
如果我们将以上所有内容结合起来,就会发现 n 会增加,就好像增量运算符从未出现在内部块中一样。
这个答案正确吗?如果不正确,请解释原因。并请引用一段 C 语言标准中的文字。