C 为什么while循环会执行多次?

C 为什么while循环会执行多次?,c,C,我在面试中遇到了一个问题,我必须找出下面代码的输出。我试过了,但不正确。请解释以下代码 #include<stdio.h> int main() { int x=0,a; while(x++ < 5) { a=x; printf("a = %d \n",a); static int x=3; printf("x = %d \n",x); x+=2; } ret

我在面试中遇到了一个问题,我必须找出下面代码的输出。我试过了,但不正确。请解释以下代码

#include<stdio.h>
int main()
{
    int x=0,a;
    while(x++ < 5)
    {
        a=x;
        printf("a = %d \n",a);
        static int x=3;
        printf("x = %d \n",x);
        x+=2;
    }
    return 0;
}

有人能解释一下这里发生了什么吗?

循环条件表达式
x++<5
使用循环外声明的
x
。语句
x+=2不影响循环外声明的
x
,因为
静态int x=3隐藏先前的
x
声明

换句话说,在语句
static int x=3之后对
x
的所有修改不影响循环控制表达式中使用的
x

这相当于:

int x=0,a;
int y=3;
while(x++ < 5)
{
    a=x;
    printf("a = %d \n",a);
    printf("x = %d \n",y);
    y+=2;
}
intx=0,a;
int y=3;
而(x++<5)
{
a=x;
printf(“a=%d\n”,a);
printf(“x=%d\n”,y);
y+=2;
}

第二个
x
隐藏了第一个
x

,这是因为
x++
返回
x
的当前值,然后递增

在第一次迭代中

while(x++ < 5)

影响
静态x
,而不影响外部x。循环中声明的变量
x
,因为它是
静态的
,只要程序存在就存在,一旦超出范围就不会丢失。它将被初始化为3,并在循环的每次迭代中添加2。

如果在循环体的最后三行重命名静态内部变量
x
,您应该可以更清楚地看到发生了什么。我删除了静态变量,即使循环执行了5次,请参见@SatishPatel,
static
或not,
x
在循环中阴影外部
x
@SatishPatel;它与
静态
无关。循环中
x
的重新声明将隐藏其以前的所有声明。当两个x都在同一代码段中时,编译器如何将
静态int x
外部int x
区分开来?在C中,符号的范围从它的“声明器”(在“=”字符后面)开始。它以复合语句结尾(“}”字符)。因此,第二个
x
仅在循环体的最后三行中可见。所有其他
x
均指第一个变量。“这相当于…”-除非运行函数两次(静态对象不会再次初始化)。虽然
main
不太可能。@NikolaiRuhe是的,但我们可以在这里将
y
限定为
static
,但由于在这种特定情况下它没有添加任何内容,所以我宁愿将其删除。
while(x++ < 5)
while(0 < 5)
x+=2;