Dúvida em trecho

Dúvida em trecho

by Thiago Tarraf Varella -
Number of replies: 2

Alguém poderia me explicar por favor o que exatamente isso significa/faz:

"
int f(x) {
    static int i = 0;
    return ++i+x;
}
"

?

Obrigado.

In reply to Thiago Tarraf Varella

Re: Dúvida em trecho

by Renato Geh -

Em C, o keyword static tem duas funções:

  1. Quando dentro de funções (como no seu caso):
  • Válida para variáveis.
  • Indica que a variável é estática. Quer dizer que ela será inicializada uma única vez com o valor de inicialização. Então se a variável for modificada, na próxima chamada de função a variável terá um valor possivelmente diferente da de inicialização. É como se ela não tivesse sido inicializada com o valor dado. 
  • Exemplo:
int som (int a, int b) {
static int x = 0;
x += a + b; return x;
}

int main () {
printf("%d\n%d\n%d\n", som(1, 2), som (3, 4),
som(5, 6));
return 0;
}

No exemplo, a saída será:

3
10
21

A variável x será inicializada uma vez e depois guardará o valor que lhe foi dado nas subsequentes chamadas. 

  2. Quando no ambiente global:

  • Válida para funções e variáveis. 
  • Indica que o componente estático só pode ser acessado pelo módulo no qual ele se encontra. Módulos são outros arquivos fontes que são compilados juntos pra criar um programa maior sem acabar num único arquivo fonte gigante. Um exemplo de módulo é o próprio stdio.h.
  • Exemplo:
static int a = 0;
static void woo (int f) {
...
}

Nem a nem woo serão acessíveis de outros módulos. Então se eles estivessem dentro de stdio.h, não seria possível acessa-los. Se printf fosse static, não poderíamos usar printf.

Espero ter ajudado, 

Renato

 

In reply to Thiago Tarraf Varella

Re: Dúvida em trecho

by Marcio T. I. Oshiro -

Só para completar.

A última linha pode ser reescrita como return (++i)+x. O ++i soma 1 ao valor atual de i antes de executar a linha, então na primeira chamada de f(x) será somado 1 a i, que agora terá valor 1, e depois a função devolverá o valor i+x. Como explicado pelo Renato, na segunda chamada de f(x) o i terá valor 1 e o ++i acrescentará mais a seu valor que passará a ser 2. Resumindo, na primeira vez que f(x) é chamado será devolvido o valor 1+x, na segunda o valor 2+x, na terceira o valor 3+x e assim por diante.

Se o ++ vem depois da variável, por exemplo i++, só é somado 1 ao valor de i depois de executar a linha.