|
|
  |
Указатели на строку в С |
|
|
|
Jan 24 2016, 13:51
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 24 2016, 14:05
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 24 2016, 14: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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 24 2016, 14:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
Цитата(GetSmart @ Jan 24 2016, 17:22)  Цитата покажите каким образом "ABCD" по-вашему является rvalue, со ссылкой-цитатой на стандарт. Вообще-то очевидно, что оно есть rvalue. нет.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
Jan 24 2016, 14:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 24 2016, 15:02
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата Это как? foo2( "ABCD" + "XYZ" ); Неявное преобразование происходит строго после полного завершения выражения - первого аргумента функции.
Сообщение отредактировал GetSmart - Jan 24 2016, 15:32
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 24 2016, 15:24
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 24 2016, 15:28
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|