Перейти к содержанию
    

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

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

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

foo2( "ABCD" );

 

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

 

char str[] = "ABCD";

foo2( str );

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это как?

foo2( "ABCD" + "XYZ" );

 

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

foo2( "ABCD" + "XYZ" );

 

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

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

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

foo2( "ABCD" "XYZ" );

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...