Partilhar via


Inicializando tipos escalares

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

Sintaxe

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

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

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:

  • As 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 são inicializadas quando a static 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 um tipo de ponteiro receberá um ponteiro nulo.

  • As variáveis declaradas com o especificador de classe de armazenamento ou auto são inicializadas cada vez que o register 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 se restringe a ser uma constante; Pode ser qualquer expressão que envolva valores previamente definidos, até mesmo chamadas de função.

  • Os valores iniciais para declarações de variáveis externas e para todas as static variáveis, sejam elas 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, ela pode ser usada 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 inteira é 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 à palavra-chave const .

int *b = &x;

Esta 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 é especificado para ser um const, a variável a só pode ser inicializada, nunca modificada. Aponta sempre 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 a nível externo, pelo que tem um tempo de vida global. A variável LOCAL local tem auto classe de armazenamento e só tem um endereço durante a execução da função na qual é declarada. Portanto, tentar inicializar a static variável lp de ponteiro com o endereço de LOCAL não é permitido. A static variável gp de ponteiro pode ser inicializada para o endereço de GLOBAL porque 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 é então atribuído a rp.

Ver também

Inicialização