Jump to content
    

Указатели на строку в С

Любой выполняющий требования стандарта.

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

Edited by GetSmart

Share this post


Link to post
Share on other sites

То есть по стандарту индекс можно применять к rvalue?

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

 

foo2( "ABCD" );

 

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

 

char str[] = "ABCD";

foo2( str );

 

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

 

Строковый литерал неявно приводится к указателю на char const

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

Edited by GetSmart

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Классификация lvalue/rvalue (ака переменная/значение) не позволяет такие вольности.

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Edited by GetSmart

Share this post


Link to post
Share on other sites

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

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

нет.

Share this post


Link to post
Share on other sites

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

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

разницы не вижу.

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

Это как?

foo2( "ABCD" + "XYZ" );

 

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

Edited by GetSmart

Share this post


Link to post
Share on other sites

foo2( "ABCD" + "XYZ" );

 

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

C дуба рухнули?

Здесь Вам не Паскаль. Здесь, если хочется, то

foo2( "ABCD" "XYZ" );

И это из другой оперы.

 

 

Share this post


Link to post
Share on other sites

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";
                       ^

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

 

 

 

Share this post


Link to post
Share on other sites

Если строки складываются без плюса, то я не сильно ошибся.

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

 

Паскалем балуюсь, немножко :)

Edited by GetSmart

Share this post


Link to post
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...