Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
1

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

16.05.2016, 10:47. Просмотров 1843. Ответов 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
Ответы с готовыми решениями:

Инициализация строки - задачка
Сама задачка от Kastaneda: #include <string> #include <iostream> using...

Инициализация массива. Длина строки
Ребят, добрый день. Ломаю голову и не могу сообразить, как в массив занести...

Инициализация длинной константной строки
Нужно офомить строку в несколько строк с переводом на новую строку. char...

Инициализация строки и запись ее в файл
нужно написать программу, которая инициализирует какую-либо строку и...

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

35
Programmist5
Заблокирован
16.05.2016, 20:03 21
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
const char str3[] = str2;
- может к константе нельзя переменную присваивать?
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
16.05.2016, 20:05 22
Цитата Сообщение от Programmist5 Посмотреть сообщение
- может к константе нельзя переменную присваивать?
В объявлении - можно. Если, конечно, это не сишные строки, где даже "1234"=="1234" дает непредсказуемый результат.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:08 23
Ferrari F1, какая разница на какой колокольне ты сидишь, если это - термин/понятие/определение
есть понятие переменной, а есть понятие литерала. это разные термины для орпеделения конкретных вещей
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
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
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:16 25
кто в лес, кто по дрова...
я говорю о терминологии, другой про правила языка, третий про представление...
0
thebat_ua
3 / 3 / 1
Регистрация: 04.04.2016
Сообщений: 23
16.05.2016, 20:16 26
так вродеж писал это масивы, а масив масиву присвоить нельзя.

и так можно
C++
1
2
const char str1='1';
const char str2=str1;
0
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 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
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
16.05.2016, 20:20 28
Цитата Сообщение от thebat_ua Посмотреть сообщение
так вродеж писал это масивы, а масив масиву присвоить нельзя.
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
0
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 20:26  [ТС] 29
Renji, у меня родилась такая мысль, что строковый литерал может располагаться не в сегменте данных, а в сегменте кода.
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
16.05.2016, 20:28 30
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Renji, у меня родилась такая мысль, что строковый литерал находится не в сегменте данных, а в сегменте кода.
Он находится в R/O памяти, на которую и берется ссылка в конструкциях типа const char*str="1234";. А сегментов кода давно уже нет, плоская модель памяти съела.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:41 31
Renji, то ли я вас не понимаю, то ли вы перемудрили
Цитата Сообщение от retmas Посмотреть сообщение
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
Цитата Сообщение от Renji Посмотреть сообщение
Нет, не нужно их различать.
Цитата Сообщение от Renji Посмотреть сообщение
А теперь ответьте почему
...
А вот так нельзя:
C++
1
2
const char str1[]="1234";
const char str2[]=str1;
как то непоследовательно.
если горим, что массив char можно инициализировать строковым литералом,но нельзя массивом(переменной), то нужно ли эти термины различать?
0
thebat_ua
3 / 3 / 1
Регистрация: 04.04.2016
Сообщений: 23
16.05.2016, 20:45 32
Renji
Почему тогда не задают вопрос о не работоспосбности такого кода
C++
1
2
const int  str1[] = {1,0};
const int str2[] = str1;
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:50 33
Цитата Сообщение от Renji Посмотреть сообщение
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
ясно почему у нас нет взаимопонимания. раз нет понимания терминологии. что такое массив-литерал?
я вижу список инициализации, который состоит из литералов.
вроде придираюсь, кто-то скажет... может и так. но вот такое отношение к терминам может повредить пониманию вас собеседником. будет неприятно, если это произойдет, например, на собеседовании.
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
16.05.2016, 20:55 34
Цитата Сообщение от retmas Посмотреть сообщение
если горим, что массив char можно инициализировать строковым литералом,но нельзя массивом(переменной), то нужно ли эти термины различать?
По хорошему нужно выкидывать подобные рудименты и разрешать нормальное копирование массивов. А про нынешнюю ситуацию надо просто запомнить что это очередное наследие Си, здравому смыслу не поддающееся. Ну, разве что в топик придет аксакал лично программировавший еще на Би и расскажет на кой черт вся эта ерунда была нужна этак полвека тому назад.
Цитата Сообщение от thebat_ua Посмотреть сообщение
Почему тогда не задают вопрос о не работоспосбности такого кода
Потому что такой код реже используется.
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
17.05.2016, 10:59 35
Цитата Сообщение от Renji Посмотреть сообщение
По хорошему нужно выкидывать подобные рудименты и разрешать нормальное копирование массивов
и как вы себе это представляете? как это копировать массив?
C
1
2
3
for (int i=0; i < i.size(); i++){
a[i] = b[i]
}
или есть другие механизмы?
Цитата Сообщение от Renji Посмотреть сообщение
что это очередное наследие Си, здравому смыслу не поддающееся
надо понимать просто что в Си "нет массивов", а есть указатели
и arr есть не что иное как &arr[0]
можно ведь к элементам массива обратиться *(arr+n)
или char **argv и char *argv[]
как вы хотите присвоить? чтобы было arr1 = arr2?
и что получалось бы? arr1 и arr2 два указателя на один массив
и вопрос не темного прошлого. как вы имея 3 ячейки {14, 4, 59} продублируете их (те скопируете?) как по-вашему вы организуете тип массив, чтобы так, на раз копировалось? причем без потери общности операции присваивания - ведь в Си нельзя перегружать оператор присваивания.
в Java тоже не нашлись как это решить... Да, в контейнерах типа массивы, векторы и тп перегружают оператор присваивания, но(!) в итоге за этим оператором все равно стоит цикл for() и чего добились спрашивается?
имхо как-то так...
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
17.05.2016, 11:06 36
Цитата Сообщение от SergioO Посмотреть сообщение
надо понимать просто что в Си "нет массивов", а есть указатели
В Си есть переменные с типом typedef int(array)[10];, которые Си неизвестно за каким хреном пытается преобразовать к указателям. Тем не менее, sizeof(array)!=sizeof(void*).
Цитата Сообщение от SergioO Посмотреть сообщение
и как вы себе это представляете? как это копировать массив?
C++
1
2
3
int src[10];
int dst[10];
memcpy(dst,src,sizeof(src));
Чрезвычайно сложно было реализовать на уровне синтаксиса, а не memcpy костыля, да.
0
17.05.2016, 11:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2016, 11:06

Инициализация
1. Создать класс Solid 2. Его наследует Planet 3. В функции Gravitation...

Инициализация ссылок
Непонятно почему такой синтаксис инициализации ссылок ошибочен: int *...

Инициализация класса
Ругается : C2143, C4430, C2371 class SpaceShip { public: Tria2*...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

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