DODATEK A PRZEWODNIK JĘZYKA C__________
rekurencyjnie, podskładowych nie może być kwalifikowana słowem const. Typem wyrażenia przypisania jest typ lewego argumentu, a wynikiem - wartość wstawiona do tego argumentu po wykonaniu przypisania.
Przy prostym przypisaniu z operatorem = wartość wyrażenia zastępuje poprzednią wartość obiektu wskazanego przez 1-wartość. Musi być spełniony jeden z poniższych warunków: oba argumenty są arytmetyczne i prawy jest przekształcany do typu lewego; oba są strukturami lub uniami tego samego typu; jeden z argumentów jest wskaźnikiem, a drugi wskaźnikiem do typu void; lewy argument jest wskaźnikiem, a drugi wyrażeniem stałym o wartości 0; oba argumenty są wskaźnikami do funkcji lub do obiektów tego samego typu (typy obu wskaźników mogą się różnić jedynie brakiem słów kluczowych const i volatile w deklaracji prawego argumentu).
Wyrażenie o postaci E1 op= E2 jest równoważne z wyrażeniem E1 = E1 op (E2), z tym tylko, że wyrażenie E1 jest obliczane raz.
wyrażenie:
wyraienie-przypisania wyrażenie , wyrażenie-przypisania
Parę wyrażeń oddzielonych przecinkami oblicza się od lewej strony do prawej, przy czym wartość lewego wyrażenia przepada. Typ i wartość wyniku są takie same, jak typ i wartość prawego argumentu. Zanim rozpocznie się obliczanie prawego argumentu, wszystkie efekty uboczne obliczenia lewego argumentu są już zakończone. W kontekście, w którym przecinek ma znaczenie specjalne, na przykład na liście argumentów funkcji (p. A7.3.2) lub liście inicjatorów (p. A8.7), wymaganą jednostką składniową jest wyrażenie przypisania, zatem operator przecinkowy może wystąpić wyłącznie w wyrażeniu ujętym w nawiasy. Na przykład w wywołaniu funkcji
f (a, (t=3, t+2), c)
występują trzy argumenty; drugi argument ma wartość 5.
Wyrażenie stałe jest składniowo równoważne z wyrażeniem o ograniczonym repertuarze operatorów.
wyrażenie-stałe:
wyrażenie-warunkowe
A8 DEKLARACJE
I powered by I
j Misio! |
Wyrażenia, które sprowadzają się do stałych, są wymagane w kilku słowie case, jako rozmiar tablicy, jako długość pola bitowego, jako wartość stałej wyliczenia, w inicjatorach i w niektórych wyrażeniach dła preprocesora.
Wyrażenia stałe nie mogą zawierać operatorów przypisania, zwiększania i zmniejszania, wywołań funkcji i operatorów przecinkowych, chyba że występują w argumencie operatora sizeof. Jeśli jest wymagane stałe wyrażenie całkowite, to jego argumenty muszą być stałymi: całkowitymi, wyliczeń, znakowymi lub zmiennopozycyjnymi; w rzutowaniach muszą wystąpić typy całkowite, a każdą stałą zmiennopozycyjną należy zrzutować do liczby całkowitej. Siłą rzeczy są wyeliminowane tablice, adresowanie pośrednie, pobieranie adresu i odwołania do składowych struktur. (Argumenty operatora sizeof mogą być jednak dowolne.)
Więcej swobody dopuszcza się w wyrażeniach stałych dla inicjatorów: argumenty mogą być stałymi dowolnego typu; jednoargumentowy operator adresu & może być stosowany do obiektów zewnętrznych lub statycznych, jak również do zewnętrznych lub statycznych tablic indeksowanych wyrażeniem stałym. Ten operator może być również stosowany niejawnie, przez użycie funkcji lub nieindeksowanych tablic. Inicjatory muszą się sprowadzać albo do wartości stałej, albo do adresu uprzednio zadeklarowanego obiektu zewnętrznego lub statycznego (plus/minus stała).
Mniej swobody jest w wyrażeniach stałych po #if: nie dopuszcza się wyrażeń z operatorem sizeof, stałych wyliczeń i rzutowania. Patrz p. A12.5.
Deklaracje określają sposób interpretacji identyfikatorów, nie zawsze jednak rezerwują pamięć związaną z identyfikatorami. Deklaracje, które rezerwują pamięć, nazywają się definicjami. Deklaracje mają postać:
deklaracja:
specyfikatory-deklaracji inicjowana-lista-deklaratorów0f)c ;
Deklarowane identyfikatory umieszcza się na inicjowanej liście deklaratorów; specy-fikatory deklaracji składają się z ciągu specyfikatorów typu i klasy pamięci:
specyfikatory-deklaracji:
specyfikator-klasy-pamięci specyfikatory-deklaracjiopc specyfikator-typu specyfikatory-deklaracjiopc kwalifikator-typu specyfikatory-deklaracjiątc
277