Założę się, że dobre pieniądze falseto to samo co 0(w przeciwnym if(false)razie nie oceniłoby to na fałsz), więc to, co masz, prawdopodobnie zadziała na 99% kompilatorów. Nie mogę być pewien pozostałego 1%, dopóki nie zacytujemy normy.
Chris Lutz,
Wiem, że w C int a[10] = { 1, 2, 3 };ustawię a[3]..a[9]na 0(„zainicjowane niejawnie to samo, co obiekty o statycznym czasie trwania”). Czy to dotyczy C ++?
Alok Singhal,
5
Tak. Gdyby nie było to prawdą w przypadku C ++, to C ++ nie byłby nawet zdalnie kompatybilny wstecz z C.
Chris Lutz,
2
falsenie jest tym samym co 0, ale w {0}0 jest konwertowane na false, aw (dla C ++) {}nie musisz nawet przejmować się konwersjami: jest zainicjowany falselub 0lub null-pointer lub jakimkolwiek innym domyślnym z uwzględnieniem typu.
Johannes Schaub - litb
Odpowiedzi:
139
Tak, ta forma inicjalizacji jest obsługiwana przez wszystkie kompilatory C ++. Jest częścią języka C ++. W rzeczywistości jest to idiom, który przyszedł do C ++ z języka C. W języku C = { 0 }jest idiomatycznym uniwersalnym inicjatorem zera . Dotyczy to również prawie C ++.
Ponieważ ten inicjalizator jest uniwersalny, w przypadku booltablic nie potrzebujesz innej „składni”. 0działa również jako inicjator dla booltypu, więc
bool myBoolArray[ARRAY_SIZE] = { 0 };
gwarantuje zainicjowanie całej tablicy za pomocą false. Jak również
char* myPtrArray[ARRAY_SIZE] = { 0 };
gwarantuje zainicjowanie całej tablicy z zerowymi wskaźnikami typu char *.
Jeśli uważasz, że poprawia czytelność, z pewnością możesz użyć
ale chodzi o to, że = { 0 }wariant daje dokładnie ten sam wynik.
Jednak w C ++ = { 0 }może nie działać dla wszystkich typów, takich jak na przykład typy wyliczeniowe, których nie można zainicjować za pomocą wartości integralnej 0. Ale C ++ obsługuje krótszą formę
T myArray[ARRAY_SIZE] = {};
czyli tylko pusta para {}. Spowoduje to domyślną inicjalizację tablicy dowolnego typu (zakładając, że elementy pozwalają na domyślną inicjalizację), co oznacza, że w przypadku typów podstawowych (skalarnych) cała tablica zostanie poprawnie zainicjalizowana zerem.
aw c ++ 0x będziesz mógł zainicjalizować coś takiego
jk.
4
Na moim kompilatorze (twórca qt 2.4.1 - qt wersja 4.8.0), jeśli piszę, bool myBoolArray[ARRAY_SIZE] = { false };tablica jest inicjalizowana na false, ale jeśli piszę, bool myBoolArray[ARRAY_SIZE] = { true };tylko pierwszy element jest ustawiony na true, podczas gdy wszystko inne jest fałszywe. Jakieś wyjaśnienie?
początkujący koder
@rookie coder: Wyjaśnienie, czego dokładnie? Czego oczekujesz, że się wydarzy? W C ++, jeśli częściowo zainicjujesz booltablicę, reszta zostanie zainicjalizowana przez zero. Tak już jest.
AnT
1
@AndreyT Dobrze, ale uważam to zachowanie za co najmniej sprzeczne z intuicją. Jeśli nie zainicjuję, na przykład bool myBoolArray[ARRAY_SIZE];, tablica słusznie zawiera losowe wartości, dlatego nie spodziewałbym się, że inicjalizacja może zwrócić tablicę z różnymi wartościami. To wszystko.
początkujący koder
1
@AndreyT: jasne, ale nigdy bym nie pomyślał, że lawina będzie inna niż pierwszy element ;-) W każdym razie dzięki za informacje!
początkujący koder,
18
Zauważ, że '=' jest opcjonalne w uniwersalnej składni inicjalizacji C ++ 11 i ogólnie uważa się, że lepszy styl pisania:
Tak, uważam, że powinno działać i można je również zastosować do innych typów danych.
Jednak w przypadku tablic klas, jeśli na liście inicjalizacyjnej jest mniej elementów niż elementów w tablicy, dla pozostałych elementów zostanie użyty domyślny konstruktor. Jeśli dla klasy nie zdefiniowano domyślnego konstruktora, lista inicjatorów musi być kompletna - to znaczy musi istnieć jeden inicjator dla każdego elementu w tablicy.
Możesz zadeklarować tablicę w C ++ w ten sposób. Jeśli znasz rozmiar tablicy, powinieneś zadeklarować tablicę dla: integer: int myArray[array_size];
Double: double myArray[array_size];
Char i string: char myStringArray[array_size];
Różnica między char i string jest następująca
false
to to samo co0
(w przeciwnymif(false)
razie nie oceniłoby to na fałsz), więc to, co masz, prawdopodobnie zadziała na 99% kompilatorów. Nie mogę być pewien pozostałego 1%, dopóki nie zacytujemy normy.int a[10] = { 1, 2, 3 };
ustawięa[3]..a[9]
na0
(„zainicjowane niejawnie to samo, co obiekty o statycznym czasie trwania”). Czy to dotyczy C ++?false
nie jest tym samym co0
, ale w{0}
0 jest konwertowane nafalse
, aw (dla C ++){}
nie musisz nawet przejmować się konwersjami: jest zainicjowanyfalse
lub0
lub null-pointer lub jakimkolwiek innym domyślnym z uwzględnieniem typu.Odpowiedzi:
Tak, ta forma inicjalizacji jest obsługiwana przez wszystkie kompilatory C ++. Jest częścią języka C ++. W rzeczywistości jest to idiom, który przyszedł do C ++ z języka C. W języku C
= { 0 }
jest idiomatycznym uniwersalnym inicjatorem zera . Dotyczy to również prawie C ++.Ponieważ ten inicjalizator jest uniwersalny, w przypadku
bool
tablic nie potrzebujesz innej „składni”.0
działa również jako inicjator dlabool
typu, więcbool myBoolArray[ARRAY_SIZE] = { 0 };
gwarantuje zainicjowanie całej tablicy za pomocą
false
. Jak równieżchar* myPtrArray[ARRAY_SIZE] = { 0 };
gwarantuje zainicjowanie całej tablicy z zerowymi wskaźnikami typu
char *
.Jeśli uważasz, że poprawia czytelność, z pewnością możesz użyć
bool myBoolArray[ARRAY_SIZE] = { false }; char* myPtrArray[ARRAY_SIZE] = { nullptr };
ale chodzi o to, że
= { 0 }
wariant daje dokładnie ten sam wynik.Jednak w C ++
= { 0 }
może nie działać dla wszystkich typów, takich jak na przykład typy wyliczeniowe, których nie można zainicjować za pomocą wartości integralnej0
. Ale C ++ obsługuje krótszą formęczyli tylko pusta para
{}
. Spowoduje to domyślną inicjalizację tablicy dowolnego typu (zakładając, że elementy pozwalają na domyślną inicjalizację), co oznacza, że w przypadku typów podstawowych (skalarnych) cała tablica zostanie poprawnie zainicjalizowana zerem.źródło
bool myBoolArray[ARRAY_SIZE] = { false };
tablica jest inicjalizowana na false, ale jeśli piszę,bool myBoolArray[ARRAY_SIZE] = { true };
tylko pierwszy element jest ustawiony na true, podczas gdy wszystko inne jest fałszywe. Jakieś wyjaśnienie?bool
tablicę, reszta zostanie zainicjalizowana przez zero. Tak już jest.bool myBoolArray[ARRAY_SIZE];
, tablica słusznie zawiera losowe wartości, dlatego nie spodziewałbym się, że inicjalizacja może zwrócić tablicę z różnymi wartościami. To wszystko.Zauważ, że '=' jest opcjonalne w uniwersalnej składni inicjalizacji C ++ 11 i ogólnie uważa się, że lepszy styl pisania:
char myarray[ARRAY_SIZE] {0}
źródło
Tak, uważam, że powinno działać i można je również zastosować do innych typów danych.
Jednak w przypadku tablic klas, jeśli na liście inicjalizacyjnej jest mniej elementów niż elementów w tablicy, dla pozostałych elementów zostanie użyty domyślny konstruktor. Jeśli dla klasy nie zdefiniowano domyślnego konstruktora, lista inicjatorów musi być kompletna - to znaczy musi istnieć jeden inicjator dla każdego elementu w tablicy.
źródło
Możesz zadeklarować tablicę w C ++ w ten sposób. Jeśli znasz rozmiar tablicy, powinieneś zadeklarować tablicę dla: integer:
int myArray[array_size];
Double:double myArray[array_size];
Char i string:char myStringArray[array_size];
Różnica między char i string jest następującachar myCharArray[6]={'a','b','c','d','e','f'}; char myStringArray[6]="abcdef";
Jeśli nie znasz rozmiaru tablicy, powinieneś pozostawić ją pustą, jak poniżej.
liczba całkowita:
int myArray[array_size];
Podwójnie:
double myArray[array_size];
źródło