2015-01-03 4 views
4

У меня есть вопрос в интервью, для которого мне пришлось выяснить результат следующего кода. Я попытался, но это было неправильно. Пожалуйста, объясните следующий код.Почему цикл while выполняется более одного раза?

#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; 
} 

Выход:

a = 1 
x = 3 
a = 2 
x = 5 
a = 3 
x = 7 
a = 4 
x = 9 
a = 5 
x = 11 

Может кто-нибудь, пожалуйста, объясните, что происходит здесь?

+2

Если вы переименовали статическую внутреннюю переменную 'x' в последние три строки вашего тела цикла, вы должны увидеть, что происходит более четко. –

ответ

2

Условное выражение цикла x++ < 5 использует объявленный вне цикла цикл x. Заявление x += 2; не влияет на x, объявленный вне цикла, потому что static int x=3; скрывает предыдущее объявление x.

Другими словами, все изменения в x после утверждения static int x=3; не влияют на выражение x, используемое в выражении, управляющем циклом.

+0

Я удалил статику, даже тогда цикл выполняется 5 раз. [link] (http://ideone.com/x1U3Ph) –

+1

@SatishPatel, 'static' или нет,' x' в цикле тени внешнего 'x' –

+0

@SatishPatel; Это не имеет никакого отношения к 'static'. Обновление цикла 'x' будет скрывать все предыдущие объявления. – haccks

1

Это эквивалентно:

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

Второй x скрывался первый x.

+0

«Это эквивалентно ...» - за исключением случаев, когда функция выполняется дважды (когда статический объект не будет инициализирован второй раз). Скорее всего, с 'main'. –

+0

@NikolaiRuhe да, но мы могли бы просто квалифицировать 'y' как' static' здесь, но поскольку в этом конкретном случае я ничего не добавлял, я предпочел удалить его. – ouah

2

Это потому, что x++ возвращает текущее значение x и затем увеличивается.

В первой итерации,

while(x++ < 5) 

такой же, как

while(0 < 5) 

Затем, после того, как условие было проверено, x будет увеличиваться. Таким образом, значение a является приращенным значением x. В static x, тени (шкура) x объявленные вне цикла и, следовательно,

x+=2; 

влияет на static x, а не внешний один. Переменная x объявлена ​​в цикле, так как она равна static, если программа выполняет и не будет потеряна, как только она выйдет из области видимости. Он будет инициализирован 3 и 2 будет добавлен в каждую итерацию цикла к нему.

Смежные вопросы