2013-08-07 23 views
5

Właśnie okazało się, że wszystkie z wymienionych prac:mieszania szerokie i wąskie literały ciągów znaków w C

printf("%ls\n", "123" L"456"); 
printf("%ls\n", L"123" "456"); 
printf("%ls\n", L"123" L"456"); 

Wyjście jest

123456 
123456 
123456 

Dlaczego mogę dowolnie łączyć ze sobą szerokie i wąskie literały ciągów w rezultacie uzyskać szeroki ciąg literowy? Czy to udokumentowane zachowanie?

Odpowiedz

8

Czy to udokumentowane zachowanie?

Tak, to zachowanie jest obsługiwany przez normę, z sekcji 6.4.5literały łańcuchowe paragrph z C99 draft standard mówi (podkr):

W fazie translacji 6, wielobajtowe sekwencje znaków określone przez dowolną sekwencję sąsiednich znaków literowych i szerokich liter literowych są łączone w pojedynczą wielobajtową sekwencję znaków w postaci jednego wielobajtowego . Jeśli dowolny z tokenów jest szerokim tokenem literowym, uzyskana wielobajtowa sekwencja znaków jest traktowana jako szeroki ciąg literowy; w przeciwnym razie jest traktowane jako literał ciągu znaków.

5

6.4.5 łańcucha znaków

W etapie 6 translacji, sekwencje wielobajtowymi określone przez dowolna sekwencja sąsiedniego charakteru i szeroki w ciągach w żetony łączone w postaci sekwencji pojedynczego wielobajtowym . Jeśli którykolwiek z tokenów jest szerokim tokerem literowym, wynikowa sekwencja znaków wielobajtowych jest traktowana jako literał o szerokim łańcuchu; w przeciwnym razie numer jest traktowany jako literał znaków literowych.