/ / Dlaczego C nie obsługuje inicjowania zmiennych stałych za pomocą instrukcji if-else? - c, const

Dlaczego C nie obsługuje inicjowania zmiennych stałych za pomocą instrukcji if-else? - c, const

Chcę zainicjować const zmienna za pomocą Jeśli inaczej.
Na przykład:

const int foo;
if (bar) {
foo = 1;
} else {
foo = 2;
}

W języku Java jest to legalny kod (przy użyciu final zamiast const). Powodem jest to, że we wszystkich możliwych wynikach zmienna jest przypisywana raz i nigdy nie jest ponownie przypisywana. W C nie jest to prawny kod. Z jakiego powodu nie może być legalnym kodem w C?

Odpowiedzi:

6 dla odpowiedzi № 1

Można użyć operatora potrójnego, ale należy pamiętać, że dla obiektów ze statyczną lub lokalną klasą pamięci wątku wyrażenie inicjalizacyjne musi być stałą czasu kompilacji:

const int bar =  42;
#define BAR 42

#if 0
const int foo = bar ? 1 : 2; /*ERROR -- bar is not an integer constant */
#else
const int foo = BAR ? 1 : 2;
#endif

void fn(void)
{
const int foo = bar ? 1 : 2;
#if 0
static const int stc_foo = bar ? 1 : 2; /*ERROR*/
#else
static const int stc_foo = BAR ? 1 : 2;
#endif
}

Przyczyna, dla której nie można użyć instrukcji if-elseInicjalizacja polega na tym, że zezwolenie na to wymagałoby pewnych dość rozległych zmian w gramatyce C, i prawdopodobnie uczyniłoby gramatykę C i semantykę bardziej skomplikowanymi.

Zasadniczo zamiast po prostu sprawdzać, czy po nim następuje deklarator = i initializer wyrażenie i to wyrażenie inicjalizującejest stałą, kompilator musiałby zapamiętać każdą zmienną statyczną / wątkową-lokalną, która nie została zainicjalizowana, a następnie szukać bezwarunkowo wykonanych gałęzi podlegających ocenie w czasie kompilacji, które po nim są przypisane i wykorzystywać je do inicjalizacji.

Ponadto należy zezwolić na oświadczeniaw zakresie pliku (instrukcje nie są dozwolone w zakresie plików w aktualnej gramatyce języka C) i zweryfikowane pod kątem dostępu do pamięci i ograniczenia, ograniczone do zapisywania zmiennych globalnych jednostek tłumaczeniowych. Ewentualnie mogą one zostać niejawnie przekształcone w konstruktory globalne, ale wprowadziłoby to dodatkowe problemy, takie jak porządkowanie konstruktorów między jednostkami kompilacji (które byłyby trudne do rozwiązania, gdyby generowanie konstruktora było niejawne), potrzeba implementacji do obsługi globalnego konstruktora w pierwszej kolejności. miejsce lub rozmycie aktualnie dość prostych cech wydajności przypisań zmiennych statycznych.


16 dla odpowiedzi nr 2

Możesz zainicjować foo zmienne warunkowo za pomocą operator trójskładnikowy:

const int foo = bar ? 1 : 2;

Zauważ, że jeśli foo nie jest zmienną automatyczną, wówczas wyrażenie inicjujące musi być oceniane podczas kompilacji, w przeciwnym razie nie zostanie skompilowane.


3 dla odpowiedzi nr 3

W C, const tworzy zmienną tylko czytać.

Możesz zainicjować const zmienna tylko w momencie deklaracji, a nie później, ponieważ staje się tylko do odczytu.

To dlatego twój kod nie jest legalny w C, tak jak ty aktualizowanie tylko do odczytu zmienna.

Mam nadzieję, że to pomoże !!