我有这个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为增量增加吗?谢谢!!
答案 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;
}