Приветствую,в процессе изучения ANSI C наткнулся на следующий эффект. Пусть есть такой код:
#include <stdio.h>
void f1(int j)
{
static int i;
i += j;
}int main(void)
{
f1(1);
f1(2);return 0;
}Согласно K&R (а значит и стандарту), статический объект (в моем случае переменная 'i' в функции f1()) будет сохранять свое значение после выхода из блока или функции. Так оно и есть, но если убрать спецификатор 'static', то и в этом случае ничего не меняется и значение сохраняется до следующего вызова. Почему так происходит?
Заранее спасибо!
>Почему так происходит?Если переменная static - то определено стандартом, что переменная сохраняет свое значение, если не static - то поведение "не определено", т.е. может быть, а может не быть.
P.S. Память, отведенную под i между вызовами f1 никто не трогает.
>>Почему так происходит?
>
>Если переменная static - то определено стандартом, что переменная сохраняет свое значение,
>если не static - то поведение "не определено", т.е. может быть,
>а может не быть.
>
>P.S. Память, отведенную под i между вызовами f1 никто не трогает.#include <stdio.h>
int f1(int j)
{
static int i;
i += j;
return i;
}int main(void)
{
printf("%d\n",f1(1));
printf("%d\n",f1(2));
return 0;
}Тогда, все, вроде бы, правильно:
$> 1
$> 3Если убрать static, - почемуто:
$> 2
$> 4Если убрать static и инициализировать нулем:
$> 1
$> 2
просто у вас автоматическая переменная попадает на одно и то-же место в стеке, куда в предыдущий вызов вы поместили какие-то данные.Если же например вызовите f1() из другой функции - то и автоматические переменные лягут по другим адресам и мусор в них будет уже другой.
>Приветствую,
>
>в процессе изучения ANSI C наткнулся на следующий эффект. Пусть есть такой
>код:
>
>#include <stdio.h>
>void f1(int j)
>{
> static int i;static int i = 0;
инициализация будет произведена единожды.