【发布时间】:2016-02-11 23:17:14
【问题描述】:
我的老师提供了下面的伪代码,说静态作用域的输出是1 2 3,而动态作用域的输出是2 3 4。
挑战在于静态作用域我们使用a=1, b=2, c=3 不注意main or no,使用a=1, b=2, c=4?仅在静态范围内,不包括 C 规则。
void fun1(void);
void fun2(void);
int a=1, b=2, c=3;
int main() {
c=4;
fun1();
return 0;
}
void fun1() {
int a=2, b=3;
fun2();
}
void fun2(){
printf("%d%d%d", a,b,c);
}
【问题讨论】:
-
您可能误解了老师所说的内容。在 C 中,这段代码只能给出一个输出:
124。 -
您需要解释(演示)范围在“静态”和“动态”之间是如何变化的。正如所写,代码只能产生一个答案——那就是
124。请注意,打印操作通常也应该以换行符结束——这是一种马虎的风格。如果main()中对c的引用以int为前缀,则您可以获得123;如果fun1()中对a和b的引用没有以int为前缀,则您可以获得234。 -
对不起,该声明在显示的代码和您提出的问题的上下文中没有意义。您如何理解 C 中的动态和静态范围?这怎么可能影响代码的输出如图所示?或者您是在问如何更改代码以产生不同的建议输出?
-
@MaryamPanahi:动态和静态范围有何不同?两者之间的代码有何变化?它不是标准的 C 术语,这是造成混淆的原因之一。 “动态”、“静态”和“范围”这三个词单独使用,但通常不用作“动态范围”或“静态范围”。
-
你需要回答,或者问老师,这里的“动态范围”到底是什么意思。在这段代码的上下文中,这对我来说毫无意义,我既是编译器作者,也是 30 多年的 C 用户。你或他都在滥用标准术语。此处显示的所有范围都是静态的。
a,b,c的第一个声明具有静态链接,其他声明具有自动分配。
标签: scope lexical-scope dynamic-scope