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-specifiers
init-declarator-list
Zdecydować ;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
Zdecydować
type-specifier
declaration-specifiers
Zdecydować
type-qualifier
declaration-specifiers
Zdecydować
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 jakostatic
są inicjowane po rozpoczęciu wykonywania programu. Jeśli jawnie nie zainicjujesz zmiennej globalnejstatic
, 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 lubregister
są inicjowane za każdym razem, gdy kontrolka wykonywania przechodzi do bloku, w którym są deklarowane. Jeśli pominięto inicjatora z deklaracjiauto
zmiennej lubregister
, 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 zadeklarowanejstatic
zmiennej wskaźnika. Jednak adres zmiennejauto
nie może być używany jako statyczny inicjator, ponieważ może być inny dla każdego wykonania bloku. Do inicjowaniaauto
iregister
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 10
stał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ą const
a
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 rp
elementu .