'' a "" (char a wchar_t) C++

0

Witam
Chciałem się dokładnie dowiedzieć czy miedzy nimi jest różnica tylko w tym ze jedno jest zapisywane jako tablica char a drugie jako tablica wchar_t.

Czy istnieje więcej różnic ?
Czy są jakieś specyficzne sytuacje gdzie jednego można użyć a drugiego nie bardzo?

1

wchar_t jest wide czyli przechowuje większe znaki, a mianowicie (o ile dobrze pamiętam) UTF-16

1

wchar_t nie mówi o żadnym kodowaniu, równie dobrze można napisy UTF-32 trzymać w char* i tak to się najczęściej robi ze względu na różnice w implementacjach (na Windows ma on 16 bitów, a w Linuksach 32).

W 'a' ubierasz pojedyncze znaki, to czy będzie to char czy wchar_t kompilator sam wykryje. Za to "aaa" jest typu const char[], a L"aaa" to const wchar_t[]. Jednak ustawienia kompilatora mogą zmienić te znaczenia.

W rzeczywistości - jeżeli nie musisz korzystać z wchar_t to lepiej tego nie robić. Sposób kodowania znaków w C/C++ (dotychczas, bo powoli się to zmienia w nowym standardzie) nie liczył się, bo wszystko było traktowane jako zwykły ciąg bajtów. Reprezentacja znaków ma znaczenie dopiero wtedy, gdy musimy je wyświetlić albo przeprowadzać na nich tekstowe operacje. Wszędzie indziej lepiej będzie użyć bezpiecznego char.

0

Czyli wychodzi ze 'aaa' i "aaa" to to samo(const char []). A jak z tym 'a' i "a" bo w stosunku do 'a' napisałeś ze kompilator sam wybiera czy ma być char czy wchar_t. Jak to będzie z "a".

Pisząc sizeof("a") pokazało mi 2 bajty. Czyli to jest wchar_t (nie trzeba było pisać L)
sizeof('a') 1 bajt (czyli char)
sizeof("aaa") 4 bajty i własnie nie wiem dlaczego aż tyle.
sizeof('aaa') tez 4 bajty. Przy czym mam warning: multi-character character constant

Mam Code::Blocks i GCC na Win 7.

Wdzięczny bym był jak byś mi to wytłumaczył.

1
Bumcykowy napisał(a)

Pisząc sizeof("a") pokazało mi 2 bajty. Czyli to jest wchar_t (nie trzeba było pisać L)
sizeof('a') 1 bajt (czyli char)
sizeof("aaa") 4 bajty i własnie nie wiem dlaczego aż tyle.
sizeof('aaa') tez 4 bajty. Przy czym mam warning: multi-character character constant

Sprawa wygląda tak:
'a' ma jeden bajt bo jest pojedynczym znakiem char
"aaa" ma 4 bajty bo jest traktowane jako ciąg znaków - a ciąg znaków kończy się zawsze znakiem "\0", więc kompilator Ci go "dokleił" do twoich 3 znaków - dlatego masz 4
'aaa' nie jest poprawnym ciągiem tekstowym - stąd masz warning kompilatora.

Także wszystko się zgadza - nie masz tutaj żadnego wchar_t.

Jeżeli chcesz zadeklarować ciąg znaków to używasz cudzysłowów, jeżeli pojedynczy znak to apostrofów.

PS. A i zapomniałem:
"a" ma dwa bajty bo jest traktowane jako ciąg tekstowy, który zawsze kończy się "\0", więc masz 2 znaki (twój i znacznik końca ciągu tekstowego "\0")

0

Ale jestem tępa strzała. Zapomniałem ze to jest tablica elementów char. Wiec każda następna litera będzie +1.

'AAA' co jest dokładnie powodem tego błędu? Czym dokładnie się rożni od "AAA".

0

'aaa' jest intem, którego wartość jest równa (97*256+97)*256+97, gdzie 97 to kod ASCII litery a.

edit: Ogólnie stosowanie wieloznakowych stałych jako stringów może być naprawdę ciekawym pomysłem na zrobienie kodu nieprzenośnego na architektury o innym endiness.

edit2: Tak w ogóle to wartość takiej stałej może być dowolna, zależy od kompilatora (jest to implementation defined)

0

No dobra mówisz ze jest intem, ale w jaki sposób jak rozmiar nie jest taki sam. Jeżeli chodzi o rozmiar to tu tylko char pasuje.

Wiesz dokładnie czemu występuje ten warning ?

Edit: Teraz wiem o co ci chodzi, mogłeś napisać ze char przechowuje jedna z całkowitych liczb, a nie ze jest intem.

Metodą dedukcji doszedłem choć nie wiem czy dobrze ze '' to jest obiekt char, a "" tablica obiektów char. Dobrze rozumuje?

0

Ten warning występuje, ponieważ bardzo rzadko zamierzoną sytuacją jest wprowadzenie stałej liczbowej w tej postaci, szczególnie że jest to implementation defined. Najczęściej jest to pomyłką gdy się chciało wprowadzić stałą znakową. Dodatkowo wypisanie w gcc na architekturze littleendian liczby 'abc' (rzutując adres zmiennej w której jest ona przechowywana na char *) wypisze "cba", na bigendian nie wypisze nic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1