LINUX.ORG.RU

Использование переменное при выходе из функции.

 


0

1

Что-то забыл совсем и найти не могу.

Есть три функции:

int booleanfunc()
{
int a = 1;
blablabla;
return a;
}

int mynicefunc()
{
int i = booleanfunc();
return 0;
}

int main()
{
mynicefunc();
blablabla;
return 0;
}

Как без глобальных переменных в функции mynicefunc запомнить переменную i, чтобы лишний раз не запускать booleanfunc?

★★★★★

Последнее исправление: beastie (всего исправлений: 3)
Ответ на: комментарий от beastie

После этого даже проверку не надо выполнять?

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

Btw, если у тебя там несколько тредов, то имеет смысл _Thread_local.

mix_mix ★★★★★
()
Ответ на: комментарий от steemandlinux
static int i = -1;
if (i < 0) {
    i = booleanfunc();
}

Нужно понимать, что static это, по сути, сахар над глобальными переменными, только что с локальным скоупом.

mix_mix ★★★★★
()
Ответ на: комментарий от Pythagoras

Не в компиляторе дело, а в стандарте. Да и как ты себе представляешь, что i сама определит, что она непроинициализирована?

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Я думаю, он сделает примерно то же, что ты выше описал. Написал про компилятор, потому что я так писал и оно компилировалось и работало.

Pythagoras ★★
()
Ответ на: комментарий от steemandlinux

Ну, тот же g++ это понимает.

// ладно, не хочу разводить компиляторосрач, это не толксы

Pythagoras ★★
()
Ответ на: комментарий от mix_mix

Может быть. Мой любимый пример использования static:

#include <stdio.h>
#include <unistd.h>

void
twiddle(void)
{
        static int pos;
        putchar("|/-\\"[pos++ & 3]);
        putchar('\b');
        fflush(stdout);
}

int
main()
{
        int i;
        for (i = 0; i < 10; i++) {
                twiddle();
                sleep(1);
        }
        return 0;
}

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

И будет оно вызываться только один раз.

Скажу по секрету, в C оно не вызовется ни разу. Более того, это даже не скомпилируется.

kawaii_neko ★★★★
()
Ответ на: комментарий от beastie

static int pos;

А там не может случится мусор вместо ожидаемого первичного значения?
А если мусор вдруг получился равным интмакс минус один?

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Если мне не изменяет склероз, для static те же правила, что и для global. Т.е. оно инициализируются по умолчанию.

beastie ★★★★★
()
Ответ на: комментарий от steemandlinux

В смысле «очистить»? В данном случае static — это такой сахар для global.

beastie ★★★★★
()

Как-то так:

static int i;
static int initialize = 1;
if (initialize) {
    i = booleanfunc();
    initialize = 0;
}
Или без лишней переменной, если выделить специально значение для i:
#define UNDEF_I -1
static int i = UNDEF_I;
if (i == UNDEF_I) i = booleanfunc();

omnomnomnus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.