Udostępnij za pośrednictwem


Inicjowanie typów skalarnych

Podczas inicjowania typów skalarnych wartość atrybutu assignment-expression jest przypisywana do zmiennej. Obowiązują reguły konwersji dla przypisania. (Zobacz Konwersje typów w celu uzyskania informacji o regułach konwersji).

Składnia

declaration:
declaration-specifiersinit-declarator-listZdecydować ;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersZdecydować
type-specifierdeclaration-specifiersZdecydować
type-qualifierdeclaration-specifiersZdecydować

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

init-declarator:
declarator
declarator= initializer /* W przypadku inicjowania skalarnych */

initializer:
assignment-expression

Można zainicjować zmienne dowolnego typu, o ile przestrzegasz następujących reguł:

  • Zmienne zadeklarowane na poziomie zakresu plików można zainicjować. Jeśli jawnie nie zainicjujesz zmiennej na poziomie zewnętrznym, domyślnie zostanie zainicjowana wartość 0.

  • Wyrażenie stałe może służyć do inicjowania dowolnej zmiennej globalnej zadeklarowanej za pomocą .static storage-class-specifier Zmienne zadeklarowane jako static są inicjowane po rozpoczęciu wykonywania programu. Jeśli jawnie nie zainicjujesz zmiennej globalnej static , domyślnie zostanie zainicjowana wartość 0, a każdy element członkowski, który ma typ wskaźnika, ma przypisany wskaźnik o wartości null.

  • Zmienne zadeklarowane za pomocą specyfikatora auto klasy magazynu lub register są inicjowane za każdym razem, gdy kontrolka wykonywania przechodzi do bloku, w którym są deklarowane. Jeśli pominięto inicjatora z deklaracji auto zmiennej lub register , początkowa wartość zmiennej jest niezdefiniowana. W przypadku wartości automatycznych i rejestru inicjator nie jest ograniczony do bycia stałą; może to być dowolne wyrażenie obejmujące wcześniej zdefiniowane wartości, nawet wywołania funkcji.

  • Początkowe wartości deklaracji zmiennych zewnętrznych i dla wszystkich static zmiennych, zarówno zewnętrznych, jak i wewnętrznych, muszą być wyrażeniami stałymi. (Aby uzyskać więcej informacji, zobacz Wyrażenia stałe.) Ponieważ adres dowolnej zadeklarowanej zewnętrznie lub statycznej zmiennej jest stały, można go użyć do zainicjowania wewnętrznie zadeklarowanej static zmiennej wskaźnika. Jednak adres zmiennej auto nie może być używany jako statyczny inicjator, ponieważ może być inny dla każdego wykonania bloku. Do inicjowania auto i register zmiennych można użyć wartości stałych lub zmiennych.

  • Jeśli deklaracja identyfikatora ma zakres blokowy, a identyfikator ma powiązania zewnętrzne, deklaracja nie może mieć inicjalizacji.

Przykłady

W poniższych przykładach przedstawiono inicjalizacja:

int x = 10;

Zmienna x całkowita jest inicjowana do wyrażenia 10stałej .

register int *px = 0;

Wskaźnik px jest inicjowany do wartości 0, tworząc wskaźnik "null".

const int c = (3 * 1024);

W tym przykładzie użyto wyrażenia (3 * 1024) stałego, aby zainicjować c wartość stałą, która nie może zostać zmodyfikowana ze względu na const słowo kluczowe.

int *b = &x;

Ta instrukcja inicjuje wskaźnik b adresem innej zmiennej . x

int *const a = &z;

Wskaźnik a jest inicjowany przy użyciu adresu zmiennej o nazwie z. Jednak ponieważ jest określona jako zmienna , zmienną consta można zainicjować tylko, nigdy nie modyfikować. Zawsze wskazuje tę samą lokalizację.

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   */
}

Zmienna GLOBAL globalna jest zadeklarowana na poziomie zewnętrznym, więc ma globalny okres istnienia. Zmienna LOCAL lokalna ma auto klasę magazynu i ma tylko adres podczas wykonywania funkcji, w której jest zadeklarowana. W związku z tym próba zainicjowania zmiennej static lp wskaźnika o adresie LOCAL nie jest dozwolona. Zmienna static gp wskaźnika może zostać zainicjowana pod adresem, GLOBAL ponieważ ten adres jest zawsze taki sam. Podobnie można zainicjować, *rp ponieważ rp jest zmienną lokalną i może mieć inicjator niestałych. Za każdym razem, gdy blok zostanie wprowadzony, LOCAL ma nowy adres, który jest następnie przypisywany do rpelementu .

Zobacz też

Inicjowanie