Loading...
Jovanna avatar Jovanna 186 Точки

тест - въпрос 10 - char arr и недефинирано поведение

Здравейте, 

принципно, щом не е посочен размера на масива, (за многомерни имахме право да пропуснем само първото измерение май),

предвид че е char arr, защо не си слага '\0' на края, или го прави само ако е char * към char arr?  

char arr[]{'a', 'b', 'c'}; char* ptr = arr;

What will the code    cout << ptr;  print on the console? 

= behavior is undefined

Поздрави!

 

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Първо, добре си се ориентирала, че причината за недефинираното поведение е липсата на null-terminator ('\0'), далеч не е очевидно.

Сега към въпроса ти: един от принципите на C++ е, че не прави нищо, което не си го помолил да направи - по същата причина, примерно, не занулява променливи, освен ако не му кажеш.

Масивите са си масиви, имат толкова елементи, колкото им подадеш, освен ако изрично не им дадеш размер. Няма значение дали са char, int, Person или нещо друго.

Няма специално правило, което казва, че трябва char масивите да се държат различно от останалите масиви при инициализация. Има и добра причина да няма такова правило - C++ откъде да знае, че ти имаш намерение да ползваш масива, като C-String, а не просто като масив от байтове да речем (char е винаги 1 байт), в който случай ти трябват само толкова елементи, колкото си казала. Реално повечето случаи, в които правиш char масив, просто искаш масив от char-ове (примерно искаш да прочетеш байтовете на един файл), не string - ако искаше string щеше да ползваш string класа, така че най-вероятно не искаш един излишен '\0' накрая.

Единствената ситуация, в която има специално поведение с поставяне на '\0' накрая, е когато ползваш C-String литерал, който цялата му идея е да дефинира конкретно string, тоест "hello" компилатора го прави на char[]{'h', 'e', 'l', 'l', 'o', '\0'}, но не и обратното. Ако беше обратното, всеки един char масив който създадеш, щеше да има 1 излишен елемент накрая - например ако беше автоматично поставянето на елемент накрая, то тогава char[] {'a', 'b', 'c', '\0'} щеше да получи още един излишен '\0' накрая (и да стане char[] {'a', 'b', 'c', '\0', '\0'}).

Поздрави,

Жоро

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.