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

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

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
Форумчанин
474 / 370 / 86
Регистрация: 27.01.2015
Сообщений: 2,182
Записей в блоге: 1
Завершенные тесты: 1
#1

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

16.05.2016, 10:47. Просмотров 652. Ответов 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]
но происходит ошибка компиляции.

Можете объяснить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
16.05.2016, 20:03     Инициализация строки #21
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
const char str3[] = str2;
- может к константе нельзя переменную присваивать?
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
16.05.2016, 20:05     Инициализация строки #22
Цитата Сообщение от Programmist5 Посмотреть сообщение
- может к константе нельзя переменную присваивать?
В объявлении - можно. Если, конечно, это не сишные строки, где даже "1234"=="1234" дает непредсказуемый результат.
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:08     Инициализация строки #23
Ferrari F1, какая разница на какой колокольне ты сидишь, если это - термин/понятие/определение
есть понятие переменной, а есть понятие литерала. это разные термины для орпеделения конкретных вещей
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
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;
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:16     Инициализация строки #25
кто в лес, кто по дрова...
я говорю о терминологии, другой про правила языка, третий про представление...
thebat_ua
1 / 1 / 0
Регистрация: 04.04.2016
Сообщений: 22
16.05.2016, 20:16     Инициализация строки #26
так вродеж писал это масивы, а масив масиву присвоить нельзя.

и так можно
C++
1
2
const char str1='1';
const char str2=str1;
Ferrari F1
Форумчанин
474 / 370 / 86
Регистрация: 27.01.2015
Сообщений: 2,182
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 20:19  [ТС]     Инициализация строки #27
thebat_ua, можно
C++
1
const char str2[] = "y"; // lvalue - const char[], rvalue = const char[2]
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
16.05.2016, 20:20     Инициализация строки #28
Цитата Сообщение от thebat_ua Посмотреть сообщение
так вродеж писал это масивы, а масив масиву присвоить нельзя.
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
Ferrari F1
Форумчанин
474 / 370 / 86
Регистрация: 27.01.2015
Сообщений: 2,182
Записей в блоге: 1
Завершенные тесты: 1
16.05.2016, 20:26  [ТС]     Инициализация строки #29
Renji, у меня родилась такая мысль, что строковый литерал может располагаться не в сегменте данных, а в сегменте кода.
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
16.05.2016, 20:28     Инициализация строки #30
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Renji, у меня родилась такая мысль, что строковый литерал находится не в сегменте данных, а в сегменте кода.
Он находится в R/O памяти, на которую и берется ссылка в конструкциях типа const char*str="1234";. А сегментов кода давно уже нет, плоская модель памяти съела.
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:41     Инициализация строки #31
Renji, то ли я вас не понимаю, то ли вы перемудрили
Цитата Сообщение от retmas Посмотреть сообщение
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
Цитата Сообщение от Renji Посмотреть сообщение
Нет, не нужно их различать.
Цитата Сообщение от Renji Посмотреть сообщение
А теперь ответьте почему
...
А вот так нельзя:
C++
1
2
const char str1[]="1234";
const char str2[]=str1;
как то непоследовательно.
если горим, что массив char можно инициализировать строковым литералом,но нельзя массивом(переменной), то нужно ли эти термины различать?
thebat_ua
1 / 1 / 0
Регистрация: 04.04.2016
Сообщений: 22
16.05.2016, 20:45     Инициализация строки #32
Renji
Почему тогда не задают вопрос о не работоспосбности такого кода
C++
1
2
const int  str1[] = {1,0};
const int str2[] = str1;
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.05.2016, 20:50     Инициализация строки #33
Цитата Сообщение от Renji Посмотреть сообщение
А это что по вашему, если не присвоение массива-литерала?
C++
1
const char str[]={'1','2','3','4',0};
ясно почему у нас нет взаимопонимания. раз нет понимания терминологии. что такое массив-литерал?
я вижу список инициализации, который состоит из литералов.
вроде придираюсь, кто-то скажет... может и так. но вот такое отношение к терминам может повредить пониманию вас собеседником. будет неприятно, если это произойдет, например, на собеседовании.
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
16.05.2016, 20:55     Инициализация строки #34
Цитата Сообщение от retmas Посмотреть сообщение
если горим, что массив char можно инициализировать строковым литералом,но нельзя массивом(переменной), то нужно ли эти термины различать?
По хорошему нужно выкидывать подобные рудименты и разрешать нормальное копирование массивов. А про нынешнюю ситуацию надо просто запомнить что это очередное наследие Си, здравому смыслу не поддающееся. Ну, разве что в топик придет аксакал лично программировавший еще на Би и расскажет на кой черт вся эта ерунда была нужна этак полвека тому назад.
Цитата Сообщение от thebat_ua Посмотреть сообщение
Почему тогда не задают вопрос о не работоспосбности такого кода
Потому что такой код реже используется.
SergioO
93 / 182 / 63
Регистрация: 13.12.2015
Сообщений: 986
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() и чего добились спрашивается?
имхо как-то так...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2016, 11:06     Инициализация строки
Еще ссылки по теме:

Инициализация C++
Инициализация в структуре C++
Инициализация даты C++
C++ Инициализация строки - задачка
Инициализация в блоке if C++

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

Или воспользуйтесь поиском по форуму:
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
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 костыля, да.
Yandex
Объявления
17.05.2016, 11:06     Инициализация строки
Ответ Создать тему
Опции темы

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