реклама на сайте
подробности

 
 
6 страниц V  < 1 2 3 4 > »   
Closed TopicStart new topic
> Указатели на строку в С
GetSmart
сообщение Jan 24 2016, 13:17
Сообщение #16


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ)
Любой выполняющий требования стандарта.

То есть по стандарту индекс можно применять к rvalue? Уточняю. Или по-другому заявлено? Это с чистого как слеза Си так задумано?

Сообщение отредактировал GetSmart - Jan 24 2016, 13:19


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 24 2016, 13:51
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jan 24 2016, 15:17) *
То есть по стандарту индекс можно применять к rvalue?

Причем тут все это? Просто

foo2( "ABCD"[i] );

это, естественным образом, абсолютно тоже самое, что

char str[] = "ABCD";
foo2( str[i] );

Смотрится, конечно, страновато, но законно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2016, 13:55
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 24 2016, 15:17) *
То есть по стандарту индекс можно применять к rvalue? Уточняю. Или по-другому заявлено? Это с чистого как слеза Си так задумано?
Если речь идет о записи "строковый литерал"[индекс], то да - это чистый, как слеза Си. Строковый литерал неявно приводится к указателю на char const, а для указателя определены индексные операции, которые есть адресная арифметика. Отсюда в чистом как слеза Си возможно и такая запись: i["abcdef"].


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 14:05
Сообщение #19


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jan 24 2016, 17:51) *
Смотрится, конечно, страновато, но законно.

Незаконно. Классификация lvalue/rvalue (ака переменная/значение) не позволяет такие вольности. По логике, это как взять адрес от значения. Бред. Компилятор должен ругаться на этапе компиляции.

Цитата(Сергей Борщ @ Jan 24 2016, 17:55) *
Строковый литерал неявно приводится к указателю на char const

В стандарте чёрным по белому написано, что прямо внутри разбора выражения? Логично когда оно преобразуется после завершения выражения. Как и с приведением имени массива. Применение амперсанда к массиву естественно, по аналогии со всеми остальными переменными.

Сообщение отредактировал GetSmart - Jan 24 2016, 14:08


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 24 2016, 14:16
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



"ABCD" не является rvalue, строго говоря. Это константа, для которой отведено место в памяти, значит и адрес можно брать, и индекс. А rvalue не видны за пределами выражения, в котором они используются.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
krux
сообщение Jan 24 2016, 14:20
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



Цитата(GetSmart @ Jan 24 2016, 17:05) *
Классификация lvalue/rvalue (ака переменная/значение) не позволяет такие вольности.

покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 14:22
Сообщение #22


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(gerber @ Jan 24 2016, 18:16) *
"ABCD" не является rvalue, строго говоря. Это константа, для которой отведено место в памяти, значит и адрес можно брать, и индекс. А rvalue не видны за пределами выражения, в котором они используются.

И сложение rvalue-строк на этапе компиляции отменили?

Цитата(krux @ Jan 24 2016, 18:20) *
покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт.

Вообще-то очевидно, что оно есть rvalue. А вот когда происходят неявные преобразования это другой вопрос. Оно не может происходить сразу по завершающим кавычкам. По аналогии с массивом, применение индекса к имени массива не вызывает неявное преобразование. Не видно оснований почему к строке оно должно вызывать.

Сообщение отредактировал GetSmart - Jan 24 2016, 14:26


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
krux
сообщение Jan 24 2016, 14:23
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



Цитата(GetSmart @ Jan 24 2016, 17:22) *
Цитата
покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт.

Вообще-то очевидно, что оно есть rvalue.

нет.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 14:27
Сообщение #24


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Дополнил конец пред поста.

Сообщение отредактировал GetSmart - Jan 24 2016, 14:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
krux
сообщение Jan 24 2016, 14:38
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



Цитата(GetSmart @ Jan 24 2016, 17:22) *
Вообще-то очевидно, что оно есть rvalue. А вот когда происходят неявные преобразования это другой вопрос. Оно не может происходить сразу по завершающим кавычкам. По аналогии с массивом, применение индекса к имени массива не вызывает неявное преобразование. Не видно оснований почему к строке оно должно вызывать.

Цитата(GetSmart @ Jan 24 2016, 17:27) *
Дополнил конец пред поста.

разницы не вижу.
ни ссылок, ни цитат, зато бушует подмена стандарта вашими "понятиями", "аналогиями" и якобы "очевидностями".


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2016, 14:43
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 24 2016, 16:05) *
В стандарте чёрным по белому написано, что прямо внутри разбора выражения?
Да, как и все остальные неявные приведения типов.
Цитата(GetSmart @ Jan 24 2016, 16:22) *
И сложение rvalue-строк на этапе компиляции отменили?
Это как?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 15:02
Сообщение #27


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
Это как?

foo2( "ABCD" + "XYZ" );

Неявное преобразование происходит строго после полного завершения выражения - первого аргумента функции.

Сообщение отредактировал GetSmart - Jan 24 2016, 15:32


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 24 2016, 15:24
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jan 24 2016, 17:02) *
foo2( "ABCD" + "XYZ" );

Неявное преобразование происходит строго после полного завершения выражения - первого аргумента функции.

C дуба рухнули?
Здесь Вам не Паскаль. Здесь, если хочется, то
foo2( "ABCD" "XYZ" );
И это из другой оперы.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2016, 15:28
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 24 2016, 17:02) *
foo2( "ABCD" + "XYZ" );
Я даже скомпилил от неожиданности. Не, все нормально:
Код
char const * a = "ab" + "cd";

Compiling: test.c
test.c:2:23: error: invalid operands to binary + (have 'char *' and 'char *')
char const * a = "ab" + "cd";
                       ^

Вы в следующий раз проверяйте перед тем как писать.




--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 15:30
Сообщение #30


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Если строки складываются без плюса, то я не сильно ошибся.
Загвоздка собственно в приоритете неявного преобразования при разборе выражения. Но я упустил аналогию с применением индекса к lvalue-указателю, который вызывает неявное преобразование раньше индексирования. Против такого козыря у меня ничего нет. Недоглядел.

Паскалем балуюсь, немножко sm.gif

Сообщение отредактировал GetSmart - Jan 24 2016, 15:39


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 > » 
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th August 2025 - 08:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016