具有静态int的函数

时间:2018-08-18 20:50:27

标签: c static

我有这个C代码:

void increase(int x)
{
    static int i=0;
    x = i + x;
    i++;
    printf("x=%d, i=%d\n", x, i);
}
int main(void)
{
    int i;
    for (i=0; i<4; i++)
        increase(i);
    printf("i=%d\n", i);
    return 0;
}

输出:

x=0, i=1
x=2, i=2
x=4, i=3
x=6, i=4
i=4
Program ended with exit code: 0

我不知道如何获得这些结果。当我自己尝试运行代码时,static int和函数使我感到困惑。因为以i作为参数调用了该函数。

在函数执行期间,int i是否被视为int x,因为该函数已初始化为increasing(int x)

另外,由于for循环中的第三个表达式是i++,并且函数中有一个i++,所以每个i值都不应以2为增量增加吗?谢谢!!

2 个答案:

答案 0 :(得分:3)

由于i被声明为静态,因此其值在每次函数调用时都会递增(increase(i))。 这两个i ++语句的作用域完全不同,并且彼此无关。您最好将它们视为两个单独的变量。 在主要功能中,最初i = 0。 i的这个值传递给inx(x)中的x。由于静态int i = 0,x现在为0且i为0。 x = x + i使x = 0。然后i ++使i = 1。这在输出的第一行中得到了证明。再次在主循环中,我现在是1。它被传递给inx(x)中的x。 x现在为1。in()中的i也为1,但这仅是因为它被称为static,而不是因为main中的i为1。x = x + i给出x = 2。 i ++使i = 2。等等

void increase(int x)
{
    static int i=0;
    x = i + x;
    i++;
    printf("x=%d, i=%d\n", x, i);
}

在这里我如输出所示增加1。

int main(void)
{
    int i;
    for (i=0; i<4; i++)
        increase(i);
    printf("i=%d\n", i);
    return 0;
}

此处x传递了一个递增值-> 0、1、2、3 然后每次增加i-> 0、1、2、3,则得出: 0,2,4,6。

答案 1 :(得分:2)

您需要跟踪在哪个函数中哪个i是可见的。

void increase(int x)
{static int i=0; /* the only i seen inside this question */
    x = i + x; /* using this functions i, reading it */
    i++;       /* using this functions i, read-writing it */
    printf("x=%d, i=%d\n", x, i); /* reading */
}

以上函数中的i仅受i++的影响(除了初始化为0的情况),否则不发生变化。但是,static确实会将值从函数的一次执行转移到下一次执行,即,初始化=0仅在第一次执行期间发生。 上方函数中的x携带下方函数中的i的值。

下面的i函数正在循环中计数,但在其他任何地方均不受影响。

int main(void)
{
    int i; /* the only i seen inside this question */
    for (i=0; i<4; i++) /* using this functions i, including to increment it */
        increase(i); /* handing it as parameter to function,
                        the value given is seen within the function as x */
    printf("i=%d\n", i); /* reading it for output */
    return 0;
}