|
|
  |
Указатели на строку в С |
|
|
|
Jan 25 2016, 15:39
|

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

|
QUOTE (gerber @ Jan 25 2016, 17:02)  Как по мне - malloc/free - это принципиально другой подход к хранению и обработке данных, чем статический массив. Абсолютно такой-же. Все различие в том, что в одном случае указатель есть обязательно, а во втором его может и не быть в явном виде. Все. Ну и free() не сделаешь  . В обшем один вариант частный случай другого и не более того. Общий вариант просто и БЕЗ ВСЯКИХ ПОБОЧНЫХ ЭФФЕКТОВ (кроме расхода памяти на MCB, если в хипе выделяется память) приводистся к частному. Более того, динамическое выделение памяти оно сплошь и рядом - все локальные пеерменные на то они и локальные, что на них выделяется память НЕ статически. И ничего страшного.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 25 2016, 22:19
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Jan 25 2016, 16:46)  И реализация для обоих вариантов Array[index] и index[Array] исходя из определения получается идентичная с точностью до порядка слагаемых. Пишите тогда уж "исходя из данного определения". Второй вариант навязан, бесполезен и вреден. Оснований таких его последствий как ухудшение читабельности и ослабления безопасности не обозначено. Вред должен искореняться. Цитата В объявлении массива квадратные скобки являются частью определения, а не оператором индексного доступа, поэтому ваши попытки приплести сюда объявление массива бессмысленны. Осмысленно, осмысленно. Есть такое понятие как читабельность. Которое обязано быть всегда в приоритете у разработчиков. И она ни с чем в данном вопросе не конфликтует. Цитата(zltigo @ Jan 25 2016, 18:33)  Разумеется нет. Порядок "разборки" вообще никакого значения не имеет к языку. Важен порядок вычисления выражений, который идет в соответствии с приоритетом операций и формами записей. Я написал компилятор разбирает выражения, а не код/таргет исполняет. Это значит компилятор просматривает текст слева направо и согласно этому определена терминология.
Сообщение отредактировал GetSmart - Jan 25 2016, 22:21
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 25 2016, 23:46
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Jan 26 2016, 03:06)  Определение дано в стандарте языка. Не нравится - "обратитесь во всемирную в Лигу сексуальных реформ". С какой формулировкой обратиться? Версий стандартов много. Я спрашивал какого, вы не ответили. В стандарте могут быть нюансы, "задевающие" это определение. Уже указывал. В Америке в последнее время всякую неестественность разрешают. Чудаки.
Сообщение отредактировал GetSmart - Jan 26 2016, 00:33
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 26 2016, 00:31
|

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

|
Цитата(GetSmart @ Jan 26 2016, 01:46)  С какой формулировкой обратиться? Вам виднее. Цитата(GetSmart @ Jan 26 2016, 01:46)  Версий стандартов много. Я спрашивал какого, вы не ответили. Во всех трех (C89/90, C99 и C11) формулировка идентична. Выбирайте любой.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 26 2016, 00:39
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Jan 26 2016, 04:31)  Вам виднее. Напомнило контекст фразы "если ты не знаешь, я тебе не скажу". Цитата(Сергей Борщ @ Jan 26 2016, 04:31)  Во всех трех (C89/90, C99 и C11) формулировка идентична. Выбирайте любой. Остановлюсь на найденной мной. В преамбуле источника есть "fundamentals of C".
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 26 2016, 08:41
|

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

|
Цитата(GetSmart @ Jan 26 2016, 02:39)  Напомнило контекст фразы "если ты не знаешь, я тебе не скажу". Это же вам не нравится определение из стандарта. Ваше право жаловаться куда угодно на принявший его комитет. И вы спрашиваете у меня, как сформулировать вашу жалобу? Цитата(GetSmart @ Jan 26 2016, 02:39)  Остановлюсь на найденной мной. В преамбуле источника есть "fundamentals of C". -Слышал я вашего Карузо, полная фигня! -Великий Карузо выступал в Одессе? -Нет, мне Мойша напел. Вам осталось найти компилятор, который будет написан по вашему источнику, а не по стандарту. А я откланиваюсь.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 26 2016, 11:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jan 26 2016, 11:30)  Как разбирать выражения компилятору - вдоль, поперек, слева....это его интимное дело НИКАК не регламентируемое стандартами. Влияет на терминологию и определения. В определениях нет ни лева ни права, но используется "идёт за" и постфикс. Постфикс и постфиксное выражение тоже по-своему трактуется? Или строго правее основного в тексте? Где читал не увидел вообще определение постфиксного выражения. Мы с вами, те, которые стандартизаторы, и вообще большинство читают слева направо. В общеупотребляемой терминологии подобные умолчания подразумеваются. И в определениях их умалчивание считается вариантом нормы, если оно влияет. Удивляет вообще "их" терминология. Казнить нельзя помиловать в нагрузку к стандарту. Цитата(krux @ Jan 24 2016, 18:23)  Цитата(GetSmart) Вообще-то очевидно, что оно есть rvalue. нет. Вы не могли бы прояснить отличие от данной версии. Я признал, что к строке можно применить индекс и амперсанд. Хотя к обычным rvalue такое неприменимо. К строке это применимо, если считать что она rvalue с возможностью неявного преобразования , когда к ней применяется индекс, амперсанд и в некоторых других случаях. Можно назвать её rvalue-строка. Если за строкой без всяких операторов идёт ещё одна строка, то они состыковываются и образуют одно rvalue. Что для rvalue-строк пусть будет применимо. К rvalue склоняюсь потому, что это тоже тип "значение", пока оно в компиляторе обрабатывается в состоянии до неявного преобразования. А не объект с адресом. А уж если индексируется по rvalue-константе, то никакого lvalue там создавать не нужно. И в определении глобального lvalue она тоже не доходит до неявного преобразования (в котором компилятор для неё должен выделять место или найти аналогичное ранее созданное lvalue), а берётся её чистое значение (ака rvalue) и помещается в конкретно заданную область. Неявное преобразование rvalue-строки особенно тем, что есть два варианта. Можно сказать две стадии. Зависит от типа получателя или применённого оператора. Первая стадия: находится или создаётся lvalue в области памяти констант, а тип текущего выражения становится lvalue - char const. Применяя к строке амперсанд неявным будет этот вариант, т.о. вместе с амперсандом тип выражения будет rvalue - char const *. Передавая строку в качестве аргумента функции , в дополнение к первому будет вторая стадия: неявное взятие адреса данного lvalue - char const. После неё будет rvalue - char const *. Вторая стадия эквивалентна действию амперсанда. Cразу на этапе компиляции выражение *(&"abc") даст первый символ, а не исходное rvalue. Не знаю как стандарт применяет амперсанд к строке, если допускает. И как толкует предыдущее выражение. Выделение места в области памяти констант для содержимого строки будет не сразу. Компилируя выражение, если строка превращается в rvalue-char в описанных ранее случаях, то поиска/создания lvalue не происходит. Строки именно с кавычками, т.к. о них было несогласие. Допускает ли стандарт наличие скобок между строками при их соединении на этапе компиляции, тоже не знаю. rvalue и lvalue это классификация объектов при разборе выражений в процессе компиляции. В итоге: содержимое строки (массив символов) по сути одинаковое и в процессе разбора компилятором, и в области памяти констант, если считать с добавочным нулём. Данное содержимое логично называть rvalue (полностью: rvalue-строка). В процессе неявных преобразований тип rvalue-строка превращается в другой, а обратного преобразования не существует. Конфликта нет. Но если бы было обратное, то зависило бы от реализации. \0' должен так же выдаваться компилятором, если во время компиляции из строки берётся элемент с номером/индексом равном длине строки. Если номер больше, то ошибка компиляции. Применимость sizeof - по желанию.
Сообщение отредактировал GetSmart - Jan 27 2016, 07:48
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 5 2016, 20:41
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата An operator is called a Postfix Operator when the operator follows the operand. Postfix Operators may operate on either one or two operators. There are five postfix operators in C:
1. Array subscripts 2. Function Call 3. Structure and Union Members 4. Postfix Increment and Decrement Operators 5. Compound Literals Добавлю. Определение subscripts (по-русски индексации), зацитированное в этой ветке из стандарта, в сочетании с терминологией некорректна в обоих предложениях. Термин постфикс-оператор обязывает оператор следовать за операндом, к которому тот применим. Хоть вторая часть явно не указана, но она очевидна ещё из списка двухоперандных постфикс-операторов компилятора (не препроцессора). При иных требованиях к операндам оператор называется не постфикс-оператором, а оператором другого рода. Т.о. без вынесения оператора subscripts из списка постфикс-операторов получается некорректная ерунда. Если ерунда содержится в какой-то части стандарта, то наиболее адекватно её не учитывать. А если его вынести из постфикс-операторов, то явно нарушится общность с другими операторами обращения к члену/субэлементу. Которая есть в корректной части стандарта. По поводу строк. Если по сути вещей в кавычках находится значение, и называя его значением aka rvalue упрощается логика без каких-либо противоречий, то это вполне законно.
Сообщение отредактировал GetSmart - Feb 5 2016, 20:55
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|