考虑以下伪代码片段:
int c = 2;
int bar(int a)
{
c = c + 2;
return a * 2;
}
int foo(void)
{
return(bar(c + 1));
}
我要求确定foo()的返回值是什么;假设使用的语言按名称传递所有参数。
我的理由是,由于参数是按名称传递的,因此c+1
在调用bar(c+1)
时不会被评估,但只有在形式参数{{1}的第一个实例时才会被评估a
中遇到bar
行,return a*2
修改全局变量bar
之后,因为c
必须进行评估在呼叫者的环境中,即c+1
的环境中,foo
在其范围内只有全局foo
,它将被评估为c
},给出一个很好的返回值4+1
。
我怀疑这是否应该是10
,如果我盲目地应用语法替换规则,因为通过名称要求第五行应该被解释为6
,而不是return c+1*2
那么这里的正确方法是什么?
供参考我使用Gabbrielli和Martini编程语言:原则和范例7.1.2节中提供的名字传递定义