考虑这两个函数和关于它们的两个语句 S1 和 S2
int work1(int *a, int i, int j)
{
int x = a[i+2];
a[j] = x+1;
return a[i+2] – 3;
}
int work2(int *a, int i, int j)
{
int t1 = i+2;
int t2 = a[t1];
a[j] = t2+1;
return t2 – 3;
}
S1: work1 到 work2 的转换形式是有效的,即对于任何程序状态和输入参数,work2 将计算出与 work1 相同的输出并对程序状态产生相同的影响
S2:与 work1 相比,所有应用于 work1 以获得 work2 的转换将始终提高 work2 的性能(即减少 CPU 时间)
(A) S1 为假,S2 为假
(B) S1 为假,S2 为真
(C) S1 为真,S2 为假
(D) S1 为真,S2 为真答案:(一)
解释: (S1):以反例为例,Array = [1, 2, 3, 4, 5] and i = 0. 设j = (i+2), 所以j = (0+2) = 2。
对于此示例,work1 和 work2 将分别返回 1 和 0。所以,声明是错误的。
(S2):我们无法根据运行时间比较给定的程序。对于任何输入,我们不能说 work2 的性能总是优于 work1。所以,声明是错误的。
选项(A)是正确的。
这个问题的测验