以下问题已在 GATE CS 考试中提出。
1. 考虑以下 C 程序段:
char p[20];
char *s = "string";
int length = strlen(s);
int i;
for (i = 0; i < length; i++)
p[i] = s[length — i];
printf("%s",p);
程序的输出是 (GATE CS 2004)
a) 点火
b) 点火
c)字符串
d) 不打印输出
答案(d)
让我们考虑 for 循环内的以下行
p[i] = s[长度 — i];
对于 i = 0,p[i] 将是 s[6 — 0] 并且 s[6] 是 ‘\0’
所以 p[0] 变成了 ‘\0’。 p[1]、p[2]….. 中的内容无关紧要,因为当 i > 0 时 P[0] 不会改变。如果我们打印第一个字符’\0’ 的字符串,则不会打印任何内容
2. 考虑下面的 C函数
void swap (int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
为了交换两个变量x和y的值。 (GATE CS 2004)
a) 调用交换 (x, y)
b) 调用交换(&x, &y)
c) 不能使用 swap (x,y) 因为它不返回任何值
d) 不能使用swap(x,y),因为参数是按值传递的
答案(d)
为什么 a、b 和 c 不正确?
a) 调用 swap(x, y) 不会对 x 和 y 造成任何影响,因为参数是按值传递的。
b) 调用 swap (&x, &y) 将不起作用,因为函数swap() 期望值而不是地址(或指针)。
c) 不能使用 swap (x, y) 但给出的原因不正确。
3. 考虑以下 C函数:
int f(int n)
{
static int i = 1;
if (n >= 5)
return n;
n = n+i;
i++;
return f(n);
}
f(1) 返回的值是 (GATE CS 2004)
一)5
b) 6
c) 7
d) 8
答案 (c)
因为 i 是静态的,所以 f() 的第一行只执行一次。
Execution of f(1)
i = 1
n = 2
i = 2
Call f(2)
i = 2
n = 4
i = 3
Call f(4)
i = 3
n = 7
i = 4
Call f(7)
since n >= 5 return n(7)
4. 考虑以下用于反转给定整数中的数字以获得新整数的程序片段。令 n = D1D2…Dm
int n, rev;
rev = 0;
while (n > 0)
{
rev = rev*10 + n%10;
n = n/10;
}
第 i 次迭代结束时的循环不变条件为:(GATE CS 2004)
a) n = D1D2….Dm-i 和 rev = DmDm-1…Dm-i+1
b) n = Dm-i+1…Dm-1Dm 和 rev = Dm-1….D2D1
c) n≠rev
d) n = D1D2….Dm 和 rev = DmDm-1…D2D1
答案(一)
5. 考虑下面的 C 程序
main()
{
int x, y, m, n;
scanf ("%d %d", &x, &y);
/* x > 0 and y > 0 */
m = x; n = y;
while (m != n)
{
if(m>n)
m = m - n;
else
n = n - m;
}
printf("%d", n);
}
程序计算 (GATE CS 2004)
a) x + y 使用重复减法
b) x mod y 使用重复减法
c) x 和 y 的最大公约数
d) x 和 y 的最小公倍数
答案(c)
这是找到 GCD 的欧几里德算法的实现