Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,693
Записей в блоге: 1
Завершенные тесты: 1
#1

Инициализация строки - C++

16.05.2016, 10:47. Просмотров 917. Ответов 35
Метки нет (Все метки)

Добрый день, такое дело: имеется инициализация
C++
1
char* str1 = "x"; // lvalue - char*, rvalue = const char[2]
такая инициализация есть темное наследие чистого Си, но вместе с этим rvalue приводится к char*

C++
1
const char str2[] = "y"; // lvalue - const char[], rvalue = const char[2]
таким образом, тип const char[] инициализируется типом char[2]

В силу последнего, можно полагать, что:
C++
1
const char str3[] = str2; // lvalue - const char[], rvalue = const char[2]
но происходит ошибка компиляции.

Можете объяснить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2016, 10:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инициализация строки (C++):

Инициализация строки - задачка - C++
Сама задачка от Kastaneda: #include <string> #include <iostream> using namespace std; #define DEBUG( str ) do{ cout << #str...

Инициализация массива. Длина строки - C++
Ребят, добрый день. Ломаю голову и не могу сообразить, как в массив занести не констант. строчку? Ну т.е не константой, например: mas...

Инициализация длинной константной строки - C++
Нужно офомить строку в несколько строк с переводом на новую строку. char string = "nznznznznznznz r\n\\ znznnznzznznznznzn...

Инициализация поля класса (строки в стиле Си): найти причину возникновения ошибки и исправить эту ошибку - C++
Начинаю учить C++ и хочу сделать что-то типо "игры" в текстовом варианте. Вот столкнулся с проблемой - хранение бонусов при ответе,...

Инициализация - C++
1. Создать класс Solid 2. Его наследует Planet 3. В функции Gravitation используются объекты Solid Это все .h и .cpp библиотеки 4....

Инициализация родителя - C++
Добрый день. Есть шаблонный класс:template<class Widget> class Tab : public InterfaceTools<Widget> { public: explicit Tab(const...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 19:50 #16
какие предшественники, какое наследие... вы о чем?
строковый литерал - это термин, которым обзывают последовательность символов, заключенных в двойные кавычки. все. в выражении
C++
1
char* str1 = "x";
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
0
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,693
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 19:55  [ТС] #17
Цитата Сообщение от retmas Посмотреть сообщение
последовательность символов
эта последовательность символов представляет из себя символьный массив с нулем терминатором. таким образом, тип указатель на char инициализируется типом константный массив типа char.

Следовательно, всякий константый массив типа char по идее должен являться инициализатором
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:00 #18
исчо раз читаем выше, что такое строковой литерал

Добавлено через 1 минуту
подумайте, что есть литерал:
C
1
#define STR "str"
Добавлено через 2 минуты
исчо более доходчиво:
строковой литерал - набор буковок в тексте, заключенных в двойные кавычки
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
16.05.2016, 20:01 #19
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
скорее всего, копируются байты одной структурной переменной в другую, безразлично от внутреннего содержания. Механическое копирование байтов, короче говоря.
Копируется то, что указано в конструкторе копирования. Хотя да, при программировании в стиле Си, конструктор копирования в большинстве случаев сводится к побайтовому копированию.
Цитата Сообщение от retmas Посмотреть сообщение
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
const int N=10 - константа.
10 - числовой литерал.
Эти понятия надо различать - int array[10] внутри структуры разрешим, а int array [N] нельзя. А если нельзя, но очень хочется, то впилим #define N 10. Он, правда, нагадит во все неймспейсы, но это мелочи. Здравствуй простой и элегантный Си, давно не виделись.

Нет, не нужно их различать. По возможности литерал, константа и переменная должны быть взаимозаменяемы.
0
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,693
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 20:02  [ТС] #20
Цитата Сообщение от retmas Посмотреть сообщение
последовательность символов, заключенных в двойные кавычки
это для человека очевидно, что строковый литерал - это тупо закавыченный текст, т.е. мы определяем лишь визуально.
А с колокольни компилятора этот заковыченный текст - символьный массив.
0
Programmist5
Заблокирован
16.05.2016, 20:03 #21
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
const char str3[] = str2;
- может к константе нельзя переменную присваивать?
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
16.05.2016, 20:05 #22
Цитата Сообщение от Programmist5 Посмотреть сообщение
- может к константе нельзя переменную присваивать?
В объявлении - можно. Если, конечно, это не сишные строки, где даже "1234"=="1234" дает непредсказуемый результат.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:08 #23
Ferrari F1, какая разница на какой колокольне ты сидишь, если это - термин/понятие/определение
есть понятие переменной, а есть понятие литерала. это разные термины для орпеделения конкретных вещей
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
16.05.2016, 20:11 #24
Цитата Сообщение от retmas Посмотреть сообщение
Ferrari F1, какая разница на какой колокольне ты сидишь, если это - термин/понятие/определение
есть понятие переменной, а есть понятие литерала. это разные термины для орпеделения конкретных вещей
А теперь ответьте почему вот так можно:
C++
1
2
const int str1=1234;
const int str2=str1;
А вот так нельзя:
C++
1
2
const char str1[]="1234";
const char str2[]=str1;
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:16 #25
кто в лес, кто по дрова...
я говорю о терминологии, другой про правила языка, третий про представление...
0
thebat_ua
3 / 3 / 0
Регистрация: 04.04.2016
Сообщений: 23
16.05.2016, 20:16 #26
так вродеж писал это масивы, а масив масиву присвоить нельзя.

и так можно
C++
1
2
const char str1='1';
const char str2=str1;
0
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,693
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 20:19  [ТС] #27
thebat_ua, можно
C++
1
const char str2[] = "y"; // lvalue - const char[], rvalue = const char[2]
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
16.05.2016, 20:20 #28
Цитата Сообщение от thebat_ua Посмотреть сообщение
так вродеж писал это масивы, а масив масиву присвоить нельзя.
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
0
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,693
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 20:26  [ТС] #29
Renji, у меня родилась такая мысль, что строковый литерал может располагаться не в сегменте данных, а в сегменте кода.
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
16.05.2016, 20:28 #30
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Renji, у меня родилась такая мысль, что строковый литерал находится не в сегменте данных, а в сегменте кода.
Он находится в R/O памяти, на которую и берется ссылка в конструкциях типа const char*str="1234";. А сегментов кода давно уже нет, плоская модель памяти съела.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2016, 20:28
Привет! Вот еще темы с ответами:

Инициализация вектора - C++
Как создать и сразу инициализировать вектор числами 5 3 1 3 5 2 5?

Инициализация vector - C++
При создание вектора, пытаюсь сразу задать начальные значения: std::vector<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; но компилятор (MinGW...

Инициализация матрицы - C++
Здравствуйте. В 9 строчке где только }; написано выдается ошибка: variable-sized object 'matr' may not be initialized. Что может быть не...

Инициализация вектора - C++
Почему вектор не хочет инициализироваться при обьявлении? vector<int> vec = {1,2,3}; Имеем Error (active) E0289 no instance...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.05.2016, 20:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru