C Language                
            Zachowanie zdefiniowane w implementacji
        
        
            
    Szukaj…
Uwagi
Przegląd
Standard C opisuje składnię języka, funkcje zapewniane przez bibliotekę standardową oraz zachowanie zgodnych procesorów C (z grubsza mówiąc, kompilatorów) i zgodnych programów C. W odniesieniu do zachowania standard w przeważającej części określa szczególne zachowania programów i procesorów. Z drugiej strony niektóre operacje mają jawne lub dorozumiane niezdefiniowane zachowanie - takich operacji zawsze należy unikać, ponieważ nie można na nich polegać. W międzyczasie istnieje wiele zachowań zdefiniowanych dla implementacji . Zachowania te mogą się różnić między procesorami C, środowiskami uruchomieniowymi i bibliotekami standardowymi (zbiorowo, implementacjami ), ale są spójne i niezawodne dla dowolnej implementacji, a zgodne implementacje dokumentują ich zachowanie w każdym z tych obszarów.
Czasami rozsądne jest, aby program polegał na zachowaniu zdefiniowanym przez implementację. Na przykład, jeśli program jest specyficzny dla konkretnego środowiska operacyjnego, wówczas prawdopodobnie nie będzie problemu poleganie na zachowaniach zdefiniowanych dla implementacji ogólnych dla typowych procesorów dla tego środowiska. Alternatywnie, można użyć dyrektyw kompilacji warunkowej, aby wybrać zachowania zdefiniowane w implementacji odpowiednie dla implementacji w użyciu. W każdym razie istotne jest, aby wiedzieć, które operacje mają zachowanie zdefiniowane w ramach implementacji, aby albo ich uniknąć, albo podjąć świadomą decyzję o tym, czy i jak z nich korzystać.
Zestawienie tych uwag stanowi listę wszystkich zachowań i cech zdefiniowanych w implementacji określonych w normie C2011, z odniesieniem do normy. Wiele z nich używa terminologii standardu . Niektóre inne opierają się bardziej ogólnie na kontekście standardu, na przykład osiem etapów tłumaczenia kodu źródłowego na program lub różnica między implementacjami hostowanymi i wolnostojącymi. Niektóre, które mogą być szczególnie zaskakujące lub godne uwagi, zostały przedstawione pogrubioną czcionką. Nie wszystkie opisane zachowania są obsługiwane przez wcześniejsze standardy C, ale ogólnie mówiąc, mają zachowanie zdefiniowane w implementacji we wszystkich wersjach standardu, które je obsługują.
Programy i procesory
Generał
- Liczba bitów w jednym bajcie ( 3,6 / 3 ). Przynajmniej - 8rzeczywista wartość może być- CHAR_BITza pomocą makra- CHAR_BIT.
- Które komunikaty wyjściowe są uważane za „komunikaty diagnostyczne” ( 3.10 / 1 ) 
Tłumaczenie źródłowe
- Sposób, w jaki znaki wielobajtowe fizycznego pliku źródłowego są mapowane na źródłowy zestaw znaków ( 5.1.1.2/1 ). 
- Określa, czy niepuste sekwencje białych znaków nowej linii są zastępowane pojedynczymi spacjami podczas fazy tłumaczenia 3 ( 5.1.1.2/1 ) 
- Znaki zestawu wykonawczego, na które konwertowane są literały znakowe i znaki w stałych łańcuchowych (podczas fazy tłumaczenia 5), gdy poza tym nie ma odpowiadającego znaku ( 5.1.1.2/1 ). 
Środowisko działania
- Sposób identyfikacji komunikatów diagnostycznych, które mają być emitowane ( 5.1.1.3/1 ). 
- Nazwa i typ funkcji wywoływanej podczas uruchamiania w implementacji wolnostojącej ( 5.1.2.1/1 ). 
- Które biblioteki są dostępne w implementacji wolnostojącej, poza określonym zestawem minimalnym ( 5.1.2.1/1 ). 
- Wpływ zakończenia programu w środowisku wolnostojącym ( 5.1.2.1/2 ). 
- W środowisku hostowanym wszelkie dozwolone podpisy funkcji - main()inne niż- int main(int argc, char *arg[])i- int main(void)( 5.1.2.2.1 / 1 ).
- Sposób, w jaki hostowana implementacja definiuje ciągi wskazane przez drugi argument - main()( 5.1.2.2.1 / 2 ).
- Co stanowi „urządzenie interaktywne” do celów sekcji 5.1.2.3 (Wykonanie programu) i 7.21.3 (Pliki) ( 5.1.2.3/7 ). 
- Wszelkie ograniczenia dotyczące obiektów, do których odwołują się procedury obsługi przerwań w implementacji optymalizującej ( 5.1.2.3/10 ). 
- W implementacji wolnostojącej, czy obsługiwanych jest wiele wątków wykonania ( 5.1.2.4/1 ). 
- Wartości członków zestawu znaków wykonawczych ( 5.2.1 / 1 ). 
- Wartości - charodpowiadające zdefiniowanym alfabetycznym sekwencjom ucieczki ( 5.2.2 / 3 ).
- Graniczne liczby całkowite i zmiennoprzecinkowe oraz charakterystyki ( 5.2.4.2/1 ). 
- Dokładność operacji arytmetycznych zmiennoprzecinkowych i konwersji standardowej biblioteki z wewnętrznych reprezentacji zmiennoprzecinkowych na reprezentacje łańcuchowe ( 5.2.4.2.2 / 6 ). 
- Wartość makra - FLT_ROUNDS, która koduje domyślny tryb zaokrąglania zmiennoprzecinkowego ( 5.2.4.2.2 / 8 ).
- Zachowania zaokrąglania charakteryzujące się obsługiwanymi wartościami - FLT_ROUNDSwiększymi niż 3 lub mniejszymi niż -1 ( 5.2.4.2.2 / 8 ).
- Wartość makra - FLT_EVAL_METHOD, która charakteryzuje zachowanie zmiennoprzecinkowe ( 5.2.4.2.2 / 9 ).
- Zachowanie charakteryzujące się dowolnymi obsługiwanymi wartościami - FLT_EVAL_METHODmniejszymi niż -1 ( 5.2.4.2.2 / 9 ).
- Wartości makr - FLT_HAS_SUBNORM,- DBL_HAS_SUBNORMi- LDBL_HAS_SUBNORM, charakteryzujące, czy standardowe formaty zmiennoprzecinkowe obsługują liczby nienormalne ( 5.2.4.2.2 / 10 )
Rodzaje
- Wynik próby (pośredniego) dostępu do obiektu z czasem przechowywania wątku z wątku innego niż ten, z którym obiekt jest powiązany ( 6.2.4 / 4 ) 
- Wartość - chardo którego przypisano znak spoza podstawowego zestawu wykonawczego ( 6.2.5 / 3 ).
- Obsługiwane rozszerzone typy liczb całkowitych ze znakiem, jeśli istnieją, ( 6.2.5 / 4 ) oraz wszelkie słowa kluczowe używane do ich identyfikacji. 
- Czy - charma taką samą reprezentację i zachowanie jak- signed charlub- unsigned char( 6.2.5 / 15 ). Można zapytać o- CHAR_MIN, który jest albo- 0albo- SCHAR_MINjeśli- charjest odpowiednio niepodpisany lub podpisany.
- Liczba, kolejność i kodowanie bajtów w reprezentacjach obiektów , z wyjątkiem przypadków wyraźnie określonych przez standard ( 6.2.6.1/2 ). 
- Która z trzech rozpoznawanych form reprezentacji liczb całkowitych ma zastosowanie w danej sytuacji i czy pewne wzorce bitowe obiektów liczb całkowitych są reprezentacjami pułapek ( 6.2.6.2/2 ). 
- Wymóg dostosowania dla każdego typu ( 6.2.8 / 1 ). 
- Czy i w jakich kontekstach obsługiwane są jakiekolwiek rozszerzone dopasowania ( 6.2.8 / 3 ). 
- Zestaw obsługiwanych rozszerzonych dopasowań ( 6.2.8 / 4 ). 
- Konwersja liczb całkowitych obejmuje dowolne rozszerzone typy liczb całkowitych ze znakiem względem siebie ( 6.3.1.1/1 ). 
- Efekt przypisania wartości spoza zakresu do liczby całkowitej ze znakiem ( 6.3.1.3/3 ). 
- W przypadku gdy w zasięgu, ale wartość nieprzedstawialne jest przypisany do obiektów zmiennoprzecinkowej, jak wartość reprezentacja jest przechowywany w obiekcie jest wybrany z pomiędzy dwoma najbliższymi do zakodowania wartości ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ). 
- Wynik konwersji liczby całkowitej na typ wskaźnika , z wyjątkiem wyrażeń stałych całkowitoliczbowych o wartości - 0( 6.3.2.3/5 ).
Formularz źródłowy
- Lokalizacje w dyrektywach - #pragmaktórych rozpoznawane są tokeny nazw nagłówków ( 6.4 / 4 ).
- Znaki, w tym znaki wielobajtowe, inne niż podkreślenie, nieakcentowane litery łacińskie, nazwy znaków uniwersalnych i cyfry dziesiętne, które mogą pojawiać się w identyfikatorach ( 6.4.2.1/1 ). 
- Liczba znaczących znaków w identyfikatorze ( 6.4.2.1/5 ). 
- Z pewnymi wyjątkami sposób, w jaki znaki źródłowe w stałej liczb całkowitych są odwzorowywane na znaki zestawu wykonawczego ( 6.4.4.4/2 ; 6.4.4.4/10 ). 
- Bieżące ustawienia narodowe używane do obliczania wartości szerokiej stałej znakowej oraz większość innych aspektów konwersji dla wielu takich stałych ( 6.4.4.4/11 ). 
- Określa, czy znaczniki literału o różnym przedrostku mogą być konkatenowane, a jeśli tak, traktowanie wynikowej sekwencji znaków wielobajtowych ( 6.4.5 / 5 ) 
- Ustawienia narodowe używane podczas fazy tłumaczenia 7 do konwersji literałów szerokiego łańcucha na wielobajtowe sekwencje znaków oraz ich wartość, gdy wynik nie jest reprezentatywny w zestawie znaków wykonania ( 6.4.5 / 6 ). 
- Sposób mapowania nazw nagłówków na nazwy plików ( 6.4.7 / 2 ). 
Ocena
- Określa, czy i jak wyrażenia zmiennoprzecinkowe są - FP_CONTRACTgdy nie jest używany- FP_CONTRACT( 6.5 / 8 ).
- Wartości wyników - sizeofi- _Alignof( 6.5.3.4/5 ).
- Wielkość typu wyniku odejmowania wskaźnika ( 6.5.6 / 9 ). 
- Wynik przesunięcia w prawo liczby całkowitej ze znakiem o wartości ujemnej ( 6.5.7 / 5 ). 
Zachowanie w czasie wykonywania
- Stopień skuteczności słowa kluczowego - register( 6.7.1 / 6 ).
- Określa, czy typ pola bitowego zadeklarowanego jako - intjest tego samego typu, co- unsigned intczy jako- signed int( 6.7.2 / 5 ).
- Jakie typy pól bitowych mogą przyjmować, inne niż opcjonalnie kwalifikowane - _Bool,- signed inti- unsigned int; czy pola bitowe mogą mieć typy atomowe ( 6.7.2.1/5 ).
- Aspekty tego, jak implementacje rozkładają pamięć dla pól bitowych ( 6.7.2.1/11 ). 
- Wyrównanie członków struktur i związków niebędących bitfieldami ( 6.7.2.1/14 ). 
- Typ podstawowy dla każdego wyliczonego typu ( 6.7.2.2/4 ). 
- Co stanowi „dostęp” do obiektu typu - volatile( 6.7.3 / 7 ).
- Skuteczność deklaracji funkcji - inline( 6.7.4 / 6 ).
Preprocesor
- Czy stałe znaków są konwertowane na wartości całkowite w taki sam sposób w warunkach wstępnych procesora jak w wyrażeniach zwykłych i czy stała jednoznakowa może mieć wartość ujemną ( 6.10.1 / 4 ). 
- Lokalizacje szukały plików wskazanych w dyrektywie - #include( 6.10.2 / 2-3 ).
- Sposób, w jaki nazwa nagłówka jest tworzona na podstawie tokenów dyrektywy - #includezawierającej wiele tokenów ( 6.10.2 / 4 ).
- Limit - #includenesting ( 6.10.2 / 6 ).
- Czy znak - \jest wstawiany przed- \wprowadzeniem uniwersalnej nazwy znaku w wyniku operatora- #preprocesora ( 6.10.3.2/2 ).
- Zachowanie dyrektywy - #pragmaprzetwarzania wstępnego dla pragmatów innych niż- STDC( 6.10.6 / 1 ).
- Wartość makr - __DATE__i- __TIME__jeśli odpowiednio nie jest dostępna data ani godzina tłumaczenia ( 6.10.8.1/1 ).
- Wewnętrzne kodowanie znaków używane dla - wchar_tjeśli makro- __STDC_ISO_10646__nie jest zdefiniowane ( 6.10.8.2/1 ).
- Wewnętrzne kodowanie znaków używane dla - char32_tjeśli makro- __STDC_UTF_32__nie jest zdefiniowane ( 6.10.8.2/1 ).
Biblioteka standardowa
Generał
- Format komunikatów emitowanych w przypadku niepowodzenia asercji ( 7.2.1.1/2 ).
Funkcje środowiska zmiennoprzecinkowego
- Wszelkie dodatkowe wyjątki zmiennoprzecinkowe poza tymi zdefiniowanymi w normie ( 7.6 / 6 ). 
- Wszelkie dodatkowe tryby zaokrąglania zmiennoprzecinkowego poza tymi zdefiniowanymi w normie ( 7.6 / 8 ). 
- Wszelkie dodatkowe środowiska zmiennoprzecinkowe poza zdefiniowanymi w normie ( 7.6 / 10 ). 
- Domyślna wartość zmiennoprzecinkowego przełącznika dostępu do środowiska ( 7.6.1 / 2 ). 
- Reprezentacja zmiennych stanu zmiennoprzecinkowego zarejestrowanych przez - fegetexceptflag()( 7.6.2.2/1 ).
- Czy funkcja - feraiseexcept()dodatkowo podnosi wyjątek zmiennoprzecinkowy „niedokładny”, ilekroć podnosi wyjątek zmiennoprzecinkowy „przepełnienie” lub „niedomiar” ( 7.6.2.3/2 ).
Funkcje związane z ustawieniami regionalnymi
-  Ciągi ustawień narodowych inne niż "C"obsługiwane przezsetlocale()( 7.11.1.1/3 ).
Funkcje matematyczne
- Typy reprezentowane przez - float_ti- double_tgdy makro- FLT_EVAL_METHODma wartość inną niż- 0,- 1i- 2( 7.12 / 2 ).
- Wszelkie obsługiwane klasyfikacje zmiennoprzecinkowe poza tymi zdefiniowanymi w normie ( 7.12 / 6 ). 
- Wartość zwrócona przez - math.hdziała w przypadku błędu domeny ( 7.12.1 / 2 ).
- Wartość zwrócona przez - math.hdziała w przypadku błędu bieguna ( 7.12.1 / 3 ).
- Wartość zwracana przez - math.hdziała, gdy wynik jest poniżej wartości, oraz aspekty określające, czy- errnojest ustawione na- ERANGEi czy w takich okolicznościach powstaje wyjątek zmiennoprzecinkowy ( 7.12.1 / 6 ).
- Domyślna wartość przełącznika skurczu FP ( 7.12.2 / 2 ). 
- Określa, czy funkcje - fmod()zwracają 0, czy- fmod()błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.1/3 ).
- Określa, czy - remainder()funkcje- remainder()zwracają 0, czy zgłaszają błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.2/3 ).
- Liczba znaczących bitów w - remquo()ilorazowych obliczonych przez funkcje- remquo()( 7.12.10.3/2 ).
- Określa, czy funkcje - remquo()zwracają 0, czy- remquo()błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.3/3 ).
Sygnały
- Pełny zestaw obsługiwanych sygnałów, ich semantyka i ich domyślna obsługa ( 7.14 / 4 ). 
- Gdy sygnał zostanie podniesiony, a do tego sygnału przypisana jest niestandardowa procedura obsługi, która ewentualne sygnały są blokowane na czas wykonywania procedury obsługi ( 7.14.1.1/3 ). 
- Które sygnały inne niż - SIGFPE,- SIGILLi- SIGSEGVpowodują, że zachowanie po powrocie z niestandardowej procedury obsługi sygnału jest niezdefiniowane ( 7.14.1.1/3 ).
- Które sygnały są początkowo skonfigurowane do ignorowania (niezależnie od ich domyślnej obsługi; 7.14.1.1/6 ). 
Różne
-  Określona stała wskaźnika zerowego, do którego rozwija się makro NULL( 7,19 / 3 ).
Funkcje obsługi plików
- Czy ostatni wiersz strumienia tekstowego wymaga kończącego znaku nowej linii ( 7.21.2 / 2 ). 
- Liczba znaków pustych automatycznie dołączanych do strumienia binarnego ( 7.21.2 / 3 ). 
- Początkowa pozycja pliku otwartego w trybie dołączania ( 7.21.3 / 1 ). 
- Czy zapis w strumieniu tekstu powoduje obcinanie strumienia ( 7.21.3 / 2 ). 
- Obsługa buforowania strumienia ( 7.21.3 / 3 ). 
- Czy faktycznie istnieją pliki o zerowej długości ( 7.21.3 / 4 ). 
- Zasady tworzenia poprawnych nazw plików ( 7.21.3 / 8 ). 
- Czy ten sam plik może być jednocześnie otwierany wiele razy ( 7.21.3 / 8 ). 
- Charakter i wybór kodowania znaków wielobajtowych ( 7.21.3 / 10 ). 
- Zachowanie funkcji - remove()gdy plik docelowy jest otwarty ( 7.21.4.1/2 ).
- Zachowanie funkcji - rename()gdy plik docelowy już istnieje ( 7.21.4.2/2 ).
- Czy pliki utworzone za pomocą funkcji - tmpfile()są usuwane w przypadku nieprawidłowego zakończenia pracy programu ( 7.21.4.3/2 ).
- Który tryb zmienia się, w jakich okolicznościach dozwolone są przez - freopen()( 7.21.5.4/3 ).
Funkcje we / wy
- Które z dozwolonych reprezentacji nieskończonych i nie-liczbowych wartości FP są generowane przez funkcje rodziny printf () - ( 7.21.6.1/8 ). 
- Sposób, w jaki wskaźniki są formatowane przez - printf()rodziny- printf()( 7.21.6.1/8 ).
- Zachowanie rodziny - scanf()funkcjonuje, gdy znak- -pojawia się na wewnętrznej pozycji listy skanowania w polu- [7.21.6.2/12 ).
- Większość aspektów obsługi pól - pfunkcje- scanf()( 7.21.6.2/12 ).
- Wartość - errnoustawiona przez- fgetpos()w przypadku niepowodzenia ( 7.21.9.1/2 ).
- Wartość - errnoustawiona przez- fsetpos()w przypadku niepowodzenia ( 7.21.9.3/2 ).
- Wartość - errnoustawiona przez- ftell()w przypadku niepowodzenia ( 7.21.9.4/3 ).
- Znaczenie funkcji - strtod()niektórych obsługiwanych aspektów formatowania NaN ( 7.22.1.3p4 ).
- Określa, czy funkcje - strtod()ustawiają- errnona- ERANGEgdy wynik jest niedostateczny ( 7.22.1.3/10 ).
Funkcje alokacji pamięci
- Zachowanie funkcji alokacji pamięci, gdy żądana liczba bajtów wynosi 0 ( 7.22.3 / 1 ).
Funkcje środowiska systemowego
- Jakie ewentualne czyszczenia są wykonywane i jaki status jest zwracany do systemu operacyjnego hosta po wywołaniu funkcji - abort()( 7.22.4.1/2 ).
- Jaki status jest zwracany do środowiska hosta po wywołaniu metody - exit()( 7.22.4.4/5 ).
- Obsługa otwartych strumieni i jaki status jest zwracany do środowiska hosta, gdy - _Exit()jest- _Exit()( 7.22.4.5/2 ).
- Zbiór nazw środowiska dostępnych za pośrednictwem - getenv()i metoda zmiany środowiska ( 7.22.4.6/2 ).
- Zwracana wartość funkcji - system()( 7.22.4.8/3 ).
Funkcje daty i godziny
- Lokalna strefa czasowa i czas letni ( 7.27.1 / 1 ). 
- Zakres i precyzja czasów reprezentowanych przez typy - clock_ti- time_t( 7.27.1 / 4 ).
- Początek ery, która służy jako odniesienie dla czasów zwracanych przez funkcję - clock()( 7.27.2.1/3 ).
- Początek epoki, która służy jako odniesienie dla czasów zwracanych przez funkcję - timespec_get()(gdy podstawą czasu jest- TIME_UTC; 7.27.2.5/3 ).
- Zastąpienie - strftime()dla specyfikatora konwersji- %Zw ustawieniach regionalnych „C” ( 7.27.3.5/7 ).
Szeroko znakowe funkcje we / wy
- Które z dozwolonych reprezentacji nieskończonych i nie-liczbowych wartości FP są generowane przez funkcje rodziny - wprintf()( 7.29.2.1/8 ).
- Sposób, w jaki wskaźniki są formatowane przez funkcje rodziny - wprintf()( 7.29.2.1/8 ).
- Zachowanie - wscanf()-funkcji działa, gdy znak- -pojawia się na wewnętrznej pozycji listy skanowania- [pola ( 7.29.2.2/12 ).
- Większość aspektów - wscanf()pól- pfunkcje- wscanf()( 7.29.2.2/12 ).
- Znaczenie funkcji rodziny - wstrtod()niektórych obsługiwanych aspektów formatowania NaN ( 7.29.4.1.1 / 4 ).
- Określa, czy funkcje - wstrtod()ustawiają- errnona- ERANGEgdy wynik jest niedostateczny ( 7.29.4.1.1 / 10 ).
Prawe przesunięcie ujemnej liczby całkowitej
int signed_integer = -1;
// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;
Przypisywanie wartości spoza zakresu do liczby całkowitej
// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;
Przydział zero bajtów
// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);
Reprezentacja podpisanych liczb całkowitych
 Każdy podpisany typ liczb całkowitych może być reprezentowany w jednym z trzech formatów; który jest zdefiniowany w implementacji, który jest używany. Implementacja używana dla dowolnego określonego typu liczby całkowitej co najmniej tak szerokiej jak int może być określona w czasie wykonywania na podstawie dwóch bitów najniższego rzędu reprezentacji wartości -1 w tym typie, tak jak: 
enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)
switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}
 Ten sam wzorzec dotyczy reprezentacji węższych typów, ale nie można ich przetestować za pomocą tej techniki, ponieważ argumenty & podlegają „zwykłej konwersji arytmetycznej” przed obliczeniem wyniku.