Compartilhar via


Inicializando tipos escalares

Quando você inicializa tipos escalares, o valor da assignment-expression variável é atribuído. As regras de conversão para atribuição se aplicam. (Consulte conversões de tipo para obter informações sobre regras de conversão.)

Sintaxe

declaration:
declaration-specifiers init-declarator-list optar;

declaration-specifiers:
storage-class-specifier declaration-specifiers optar
type-specifier declaration-specifiers optar
type-qualifier declaration-specifiers optar

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer /* Para inicialização escalar */

initializer:
assignment-expression

Você pode inicializar variáveis de qualquer tipo, desde que obedeça às seguintes regras:

  • Variáveis declaradas no nível do escopo do arquivo podem ser inicializadas. Se você não inicializar explicitamente uma variável no nível externo, ela será inicializada como 0 por padrão.

  • Uma expressão constante pode ser usada para inicializar qualquer variável global declarada com o staticstorage-class-specifier. As variáveis declaradas para serem static inicializadas quando a execução do programa começa. Se você não inicializar explicitamente uma variável global static , ela será inicializada como 0 por padrão e cada membro que tiver o tipo de ponteiro será atribuído a um ponteiro nulo.

  • As variáveis declaradas com o auto especificador da classe de armazenamento ou register de armazenamento são inicializadas sempre que o controle de execução passa para o bloco no qual são declaradas. Se você omitir um inicializador da declaração de uma auto ou register variável, o valor inicial da variável será indefinido. Para valores automáticos e de registro, o inicializador não está restrito a ser uma constante; pode ser qualquer expressão que envolva valores definidos anteriormente, até mesmo chamadas de função.

  • Os valores iniciais para declarações de variáveis externas e para todas as static variáveis, sejam externas ou internas, devem ser expressões constantes. Para obter mais informações, consulte Expressões Constantes. Como o endereço de qualquer variável estática ou declarada externamente é constante, ele pode ser usado para inicializar uma variável de ponteiro declarada static internamente. No entanto, o endereço de uma auto variável não pode ser usado como um inicializador estático porque pode ser diferente para cada execução do bloco. Você pode usar valores constantes ou variáveis para inicializar auto e register variáveis.

  • Se a declaração de um identificador tiver escopo de bloco e o identificador tiver vinculação externa, a declaração não poderá ter uma inicialização.

Exemplos

Os exemplos a seguir ilustram as inicializações:

int x = 10;

A variável x inteiro é inicializada para a expressão 10constante.

register int *px = 0;

O ponteiro px é inicializado como 0, produzindo um ponteiro "nulo".

const int c = (3 * 1024);

Este exemplo usa uma expressão (3 * 1024) constante para inicializar c para um valor constante que não pode ser modificado devido à const palavra-chave.

int *b = &x;

Essa instrução inicializa o ponteiro b com o endereço de outra variável. x

int *const a = &z;

O ponteiro a é inicializado com o endereço de uma variável chamada z. No entanto, como ela é especificada para ser uma const, a variável a só pode ser inicializada, nunca modificada. Ele sempre aponta para o mesmo local.

int GLOBAL ;

int function( void )
{
    int LOCAL ;
    static int *lp = &LOCAL;   /* Illegal initialization */
    static int *gp = &GLOBAL;  /* Legal initialization   */
    register int *rp = &LOCAL; /* Legal initialization   */
}

A variável GLOBAL global é declarada no nível externo, portanto, tem tempo de vida global. A variável LOCAL local tem auto classe de armazenamento e tem apenas um endereço durante a execução da função na qual é declarada. Portanto, a tentativa de inicializar a variável static de lp ponteiro com o endereço não LOCAL é permitida. A static variável de ponteiro gp pode ser inicializada para o endereço porque GLOBAL esse endereço é sempre o mesmo. Da mesma forma, *rp pode ser inicializado porque rp é uma variável local e pode ter um inicializador não constante. Cada vez que o bloco é inserido, LOCAL tem um novo endereço, que é atribuído a rp.

Consulte também

Inicialização