在以下代码中,打印2
。
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
如果我们在C中使用静态作用域,会发生什么?为什么不打印1
?
在这种情况下打印2
不是动态范围,是吗?
我认为在静态作用域中,它应该将最接近的x带到函数定义中。
答案 0 :(得分:7)
它确实需要最接近的x
,但由于您只有一个x
,所以它并不重要。
如果您将代码更改为
int x = 1;
int f(int y)
{
return x ;
}
int main() {
int x=2;
printf("%d", f(0));
}
所以你有2 x
,全局的main
和1
中的本地版本,你会看到div.polaroid {
position:relative;
width: 80%;
background-color: white;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
margin-bottom: 25px;
z-index:1;
}
div.container {
position:relative;
background-color: rgba(255,0,0,0.7);
text-align: center;
margin-top: -37px;
z-index:5;
color:white;
}
被打印出来。
答案 1 :(得分:2)
由于不在本地宣布x
本来会阴影全局2
,因此范围界定没有实际意义。
x
已打印。
main
在使用参数2
调用f
之前0
至int x = 1;
内分配。
(从概念上main
在输入{{1}}之前运行。)
答案 2 :(得分:1)
这是编译器生成程序集/机器代码的方式。
因此,如果你想在主函数范围内使用不同的X,你应该创建一个新对象,就像在nwp的答案中一样。
答案 3 :(得分:1)
这些通常被称为动态和词汇范围。
词法范围确定完全在编译时确定,在运行时动态范围确定。
您只有一个名为“x”的变量,因此范围与您的程序无关。
根据范围规则,这是一个不同的程序:
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%d\n", f(x));
}
在词汇作用域下,f
返回词法“最近”的x
的值 - 全局值。
所以它会打印0
;
在动态范围设定下,f
会返回最新x
的值,这是main
中的值。
所以它会打印1
。