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 № 1Moż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 !!