C:有范围问题

时间:2015-05-06 00:06:46

标签: c

所以我正在学习决赛,我们得到了这个代码块

#include <stdio.h>
int a;
void addOne(void) {
    a++;
    printf(“W. a = %d\n”, a);
}
int removeOne(int a) {
    int b = a – 1;
    printf(“R. b = %d\n”, b);
}
void swap(int a, int *b) {
    int temp = a;
    a = *b;
    *b = temp;
}
int main() {
    a = 5;
    int b = 20;
    if (b > 15) {
        int a = 53;
        removeOne(b);
        addOne(a);
        printf(“X. a = %d\n”, a);
    }
    printf(“Y. a = %d, b = %d\n”, a, b);
    swap(a, &b);
    printf(“Z. a = %d, b = %d\n”, a, b);
    return 0;
}

我们被要求提供该计划的输出。我遇到了addone(a)我遇到的问题54,正确答案是6.它是6因为当声明函数时它有void(不记得技术术语)但是它对函数的信息而不是int a之类的东西?

我更直接的问题是,为什么函数会在主函数中初始化a而不是a中的if

1 个答案:

答案 0 :(得分:0)

答案是6的原因:

请注意,a被声明为全局。稍后,在main中,代码块内部会调用addOne(a)。该代码块也定义了局部变量a。在该范围内传递的a是本地a(53)。它被传递给一个接受未命名的void变量的函数。但是,在该函数中,引用了a。由于范围界定,这将是全局a(5),因此a++将导致输出为6.

这是一个可怕的考试问题。