1 | ||||||||||||||||
Инициализация строки16.05.2016, 10:47. Показов 14447. Ответов 35
Метки нет (Все метки)
Добрый день, такое дело: имеется инициализация
В силу последнего, можно полагать, что:
Можете объяснить?
0
|
16.05.2016, 10:47 | |
Ответы с готовыми решениями:
35
Инициализация строки - задачка Инициализация строки и запись ее в файл Инициализация длинной константной строки Инициализация массива. Длина строки |
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
16.05.2016, 10:57 | 2 |
"y" - строковой литерал, str2 - просто строка. Первым массив символов инициализировать можно, вторым - нет.
0
|
16.05.2016, 18:23 [ТС] | 3 |
Renji, а что вобще есть строковый литерал по своей сути? Ведь "строковый литерал представляет последовательность символов, которые вместе образуют строку с завершающим нулем.".
Под это определение вполне может подпадать str3. И как вобще компилятор различает, производится ли инициализация "строковым литералом", ведь по сути просто сопоставляются типы (и там, и там - const char[]) и происходит инициализация. Ведь строковый литерал имеет тип const char[]
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
16.05.2016, 18:33 | 4 |
str2 - это указатель. разница между char *str и char arr[] - str можно "повернуть" на что угодно, те можно указывать на другое место в памяти или вообще в никуда str = 0, но менять содержимое нельзя. в случае char arr[] с точностью до наоборот указатель arr никуда кроме своего массива указывать не может, те присвоить ему что-либо нельзя, но зато можно менять содержимое области памяти.
0
|
4 / 4 / 1
Регистрация: 04.04.2016
Сообщений: 23
|
||||||||||||||||
16.05.2016, 18:43 | 5 | |||||||||||||||
На сколько я понимаю
На сколько я знаю в c++ array = array2 нельзя делать.(разве что это клас контейнера, где перегружен оператор ==) правильно (с точки зрения синтаксиса, а не логики) было бы наверное вот так
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
16.05.2016, 18:44 | 6 |
только светлое настоящее С++ близко не подпускают к написанию ядра Linux, например, и много еще чего ответственного
Торвальдс о С++ еще в догонку если почитать что говорили о С++ Столман, Кен Томпсон, Ритчи, то уверен сильно удивитесь. лично мне С++ не нравится, я изучаю Java, а где Java "очевидно проседает" или нужны системные функции типа, то встраиваю Си код в Java.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
16.05.2016, 18:54 | 7 |
Явно прописанная в коде константа. А str2 это уже область памяти в которую мы ее помещаем.
Добавлено через 10 минут Спросите Торвальдса почему его любимый Си до сих пор не позволяет безымянные аргументы функций и требует struct перед именем структуры даже вне декларации этой самой структуры. Спросите его какими веществами надо было упороться, чтобы void func() не было синонимом void func(void) (первое можно вызвать как func(1,2,3,4)). Он просто новый язык учить не хочет. Все остальное - рационализация позыва "нафиг это новое, посижу на старом с рудиментами пятидесятилетней давности".
0
|
16.05.2016, 18:58 [ТС] | 8 | |||||
но ведь в данном случае литерал тоже находится в области памяти, в которую этот литерал был помещен
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
16.05.2016, 19:03 | 9 |
Де-факто да, но синтаксически "x" и str2 отличаются. Я так полагаю, очередной привет из Си или его предшественников, оставшийся в целях обратной совместимости.
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||
16.05.2016, 19:16 | 10 | ||||||||||
Ferrari F1, если считаете Си темным наследием и склоняетесь к С++, то правильнее использовать string и string.c_str(), когда нужно преобразовать строку к char* с завершающим '\0'.
в С++
0
|
16.05.2016, 19:21 [ТС] | 11 |
темным наследием чего?
Написав имелось в виду инициализация с игнорированием квалификатора типа, что не является правильным, язык целиком я не затрагивал
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
16.05.2016, 19:26 | 12 |
Темным наследием C++. C++ сделан на основе C и некоторые странности получил по наследству. В частности, невозможность копирования массивов через str3=str2 (при том что если запихать массив в структуру, он прекрасно копируется).
0
|
Ferrari F1
|
16.05.2016, 19:31
[ТС]
#13
|
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
||||||
16.05.2016, 19:41 | 14 | |||||
например в java тоже с копированием массивов "батва" ))
надо циклом for () для копирования проходить, например, поэтому С++ не одинок. зато в С++ можно
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
||||||
16.05.2016, 19:50 | 16 | |||||
какие предшественники, какое наследие... вы о чем?
строковый литерал - это термин, которым обзывают последовательность символов, заключенных в двойные кавычки. все. в выражении
"x" - строковый литерал эти понятия нужно различать
0
|
16.05.2016, 19:55 [ТС] | 17 |
эта последовательность символов представляет из себя символьный массив с нулем терминатором. таким образом, тип указатель на char инициализируется типом константный массив типа char.
Следовательно, всякий константый массив типа char по идее должен являться инициализатором
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
||||||
16.05.2016, 20:00 | 18 | |||||
исчо раз читаем выше, что такое строковой литерал
Добавлено через 1 минуту подумайте, что есть литерал:
исчо более доходчиво: строковой литерал - набор буковок в тексте, заключенных в двойные кавычки
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
16.05.2016, 20:01 | 19 |
Копируется то, что указано в конструкторе копирования. Хотя да, при программировании в стиле Си, конструктор копирования в большинстве случаев сводится к побайтовому копированию.
const int N=10 - константа. 10 - числовой литерал. Эти понятия надо различать - int array[10] внутри структуры разрешим, а int array [N] нельзя. А если нельзя, но очень хочется, то впилим #define N 10. Он, правда, нагадит во все неймспейсы, но это мелочи. Здравствуй простой и элегантный Си, давно не виделись. Нет, не нужно их различать. По возможности литерал, константа и переменная должны быть взаимозаменяемы.
0
|
16.05.2016, 20:02 [ТС] | 20 |
это для человека очевидно, что строковый литерал - это тупо закавыченный текст, т.е. мы определяем лишь визуально.
А с колокольни компилятора этот заковыченный текст - символьный массив.
0
|
16.05.2016, 20:02 | |
16.05.2016, 20:02 | |
Помогаю со студенческими работами здесь
20
Инициализация поля класса (строки в стиле Си): найти причину возникновения ошибки и исправить эту ошибку Инициализация строки Инициализация строки Безопасная инициализация строки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |