📜  门|门 IT 2006 |第 50 题

📅  最后修改于: 2021-09-25 04:10:42             🧑  作者: Mango

执行以下程序时,将打印以下给出的选项中的哪一项?

#include
void swap (int *x, int *y)
{
    static int *temp;
    temp = x;
    x = y;
    y = temp;
}
void printab ()
{
    static int i, a = -3, b = -6;
    i = 0;
    while (i <= 4)
    {
        if ((i++)%2 == 1) continue;
        a = a + i;
        b = b + i;
    }
    swap (&a, &b);
    printf("a =  %d, b = %d\n", a, b);
}
main()
{
    printab();
    printab();
} 

(A) a = 0, b = 3
a = 0, b = 3
(B) a = 3, b = 0
a = 12, b = 9
(C) a = 3, b = 6
a = 3, b = 6
(D) a = 6, b = 3
a = 15, b = 12答案: (D)
解释:

需要思考的事情:

swap函数实际上并不交换两个变量,而只是交换它们在局部变量x 和y 中的地址——一旦swap函数返回,实际上什么都没有。

printab函数将静态变量a 和b 加9。数字 9 来自这样一个事实,即 while 循环仅在 i = 1, 3, 5 时才执行这些算术语句。

因此,当第一次调用 printab 时,这些是局部变量值:a = -3 + 9 和 b = -6 + 9。第二次,a = -3 + 9 + 9 和 b = -6 + 9 + 9 是所需的值。
因此,正确答案是 (D) a = 6, b = 3; a = 15,b = 12。

该解决方案由vineet purswani 提供
这个问题的测验