以下问题已在 GATE CS 考试中提出。
1.以下配对最合适
X: Indirect addressing 1: Loops
Y: Immediate addressing 2: Pointers
Z: Auto decrement addressing 3. Constants
是 (GATE CS 2000)
(a) X—3 Y—2 Z—1
(b) X—1 Y—3 Z—2
(c) X—2 Y—3 Z—1
(d) X—3 Y—1 Z—2
答案 (c)
参考:
http://en.wikipedia.org/wiki/Addressing_mode
http://www.cs.nmsu.edu/~pfeiffer/classes/273/notes/immdirext.html
2. 编程语言上下文中的别名是指(GATE CS 2000)
(a) 多个变量具有相同的内存位置
(b) 具有相同值的多个变量
(c) 具有相同标识符的多个变量
(d) 同一变量的多次使用
答案(一)
别名描述了一种情况,在这种情况下,可以通过程序中的不同符号名称访问内存中的数据位置。
参考
http://en.wikipedia.org/wiki/Aliasing_%28computing%29
3. 假设通过引用参数传递调用,程序 P1 中的打印语句打印什么? (GATE CS 2001)
Program Pl()
{
x=10;
y=3;
func1(y, x, x);
print x;
print y;
}
func1 (x, y, z)
{
y = y + 4;
z = x + y + z;
}
a) 10, 3
b) 31, 3
c) 27, 7
d) 以上都不是
答案(二)
注意参数传递的顺序。在 func1() 中,x 实际上会引用 main() 的 y; y 和 z 将引用 main() 的 x。声明 y = y + 4;将导致 14 并且语句 z = x + y + z 将使 z = 3 + 14 + 14 = 31(因为 y 和 z 指向 main 的相同变量 x)。由于 z 指的是 main() 的 x,因此 main 将打印 31。
4. 考虑以下程序
Program P2
var n: int:
procedure W(var x: int)
begin
x=x+1;
print x;
end
procedure D
begin
var n: int;
n=3;
W(n);
end
begin //beginP2
n=10;
D;
end
如果语言有动态作用域并且参数是通过引用传递的,程序会打印什么? (GATE CS 2001)
一)10
b) 11
c) 3
d) 以上都不是
答案(d)
程序将打印 4。
5. 在值结果和引用参数传递约定下函数返回的结果 (GATE CS 2002)
a) 没有区别
b) 存在循环时不同
c) 在所有情况下都不同
d) 存在异常时可能会有所不同
答案(d)
在按引用调用评估中,函数接收对参数的隐式引用,而不是其值的副本。这通常意味着函数可以修改参数——它的调用者可以看到的东西。请注意,C 不支持按引用调用,但可以使用指针实现按引用调用。
Call-by-value-result 使用了 call-by-value 和 call-by-reference 的组合。 Call-by-value-result 通过创建传入参数的本地版本来工作。但是,这些本地版本中的值在过程结束后被复制回原始参数。
如有例外,结果可能会有所不同。让我们用任意语言看下面的例子
int addTwo(a, b)
{
a = a + b;
b = a + b;
return b;
}
如果使用 call-by-value-result,则调用 addTwo(x, x) 将返回 3x(有关解释,请参见下文)。
a = a + b; will result in a = x + x
b = a + b; will result in b = 2x + x
如果使用 call-by-reference,则 addTwo(x, x) 将返回 4x(有关解释,请参见下文)。
a = a + b; will result in a = x + x
b = a + b; will result in b = 2x + 2x
参考:
http://c2.com/cgi/wiki?CallByValueResult
http://en.wikipedia.org/wiki/Evaluation_strategy
请参阅 GATE Corner 了解所有往年论文/解决方案/解释、教学大纲、重要日期、笔记等。