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

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

Нашёл такую формулировку

A postfix expression (operand followed by the operator) followed by an expression in square brackets [ ] is a subscripted designation of the array element .The definition of the array subscript operator [ ] is that if a is an array and i is an integer then a =*(a+i).

В контексте которой есть определение postfix operator. Это индексирование [], передача параметров в функцию, ++ и другие. Соответственно postfix expression означает этот оператор без аргументов, с одним или списком аргументов. Естественно, postfix expression может быть только в комбинации с postfix operator, который применим только к допускающему его объекту слева от postfix-выражения.

 

В этом определении нет разрешения "индекса наизнанку" (в конце определения). Но понять смысл первого предложения невозможно. expression in square brackets [ ] и есть частный случай постфикс-выражения. В определении отсутствует главный объект.

 

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

 

... Это вам не про монадические типы рассуждать... :)

Ключевое слово (return и прочие) не являются именем.

 

В Си имена совпадающие с ключевыми словами запрещены.

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

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


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

А вот что скажут теоретики программирования
Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

 

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


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

Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

Постфиксное выражение, за которым следует выражение в квадратных скобках, является индексным обращением к элементу массива. "Обращением к элементу", а не "взятием элемента".

x = array[index];

 

Что здесь постфиксное выражение? И какое слово в том определении переводится как обращение? "Указание" на элемент, возможно есть.

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


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

В этом определении нет разрешения "индекса наизнанку" (в конце определения).
А никто и не говорит, что можно писать [index]Array.

Но понять смысл первого предложения невозможно. expression in square brackets [ ] и есть частный случай постфикс-выражения. В определении отсутствует главный объект.
Что-то вас конкретно клинит. Возьмем для простоты Array[index]. Здесь "Array" - postfix expression, (выражение, к которому может быть применен постфиксный оператор). "[]" - это postfix operator. index - expression in square brackets.

 

"Постфиксое выражение (Array) (операнд, за которым следует посфиксный оператор ([])), за которым следует выражение в квадратных скобках ([index]), является индексным обращением к элементу массива. Определение оператора индексного доступа [] таково, что если "a" есть массив и "i" есть целое число, то a тождественно *(a+i)". Вот полный дословный перевод вашей цитаты.

Я не знаю, откуда вы ее взяли, я приводил цитату из стандарта ("Это документ между прочим!" голосом Мягкова из "Иронии судьбы"). В стандарте сказано "определение оператора индексного доступа таково, что E1[E2] идентично (*((E1)+(E2)))". Исходя из этого определения в операторе индексного доступа можно перед скобками указывать индекс, а в скобках указывать выражение, неявно приводимое к указателю. Можно, потому что правила языка такое допускают - целое число является постфиксным выражением, а для указателя определена операция сложения с первым аргументом и результат этого сложения имеет тип указателя. И реализация для обоих вариантов Array[index] и index[Array] исходя из определения получается идентичная с точностью до порядка слагаемых.

 

И какое слово в том определении переводится как обращение? "Указание" на элемент, возможно есть.
designation - указание, цель. Хорошо, пусть будет указание, что, по сути, и есть обращение.

 

В объявлении массива квадратные скобки являются частью определения, а не оператором индексного доступа, поэтому ваши попытки приплести сюда объявление массива бессмысленны.

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


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

Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

Общими усилиями удивляемся стандарту. То, что кривыми определениями там разрешена абракатабра. На счёт индексации строки я ошибся, т.к. строка в кавычках это особый тип выражения, а остальные замечания вполне законны.

 

Что-то вас конкретно клинит. Возьмем для простоты Array[index]. Здесь "Array" - postfix expression, (выражение, к которому может быть применен постфиксный оператор). "[]" - это postfix operator. index - expression in square brackets.

Чтобы называть Array постфиксным выражением нужно ещё дав определение префиксному выражению и основному (точке отсчёта). Постфиксное выражение вообще-то всегда идёт за главным. Где здесь главное?

 

При такой фривольной интерпретации понятий, явно конфликтующей с общеупотребляемой терминологией должны быть обозначены причины.

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

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


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

Стандарт стандартом, но за работу с элементами массивов в стиле Index["abcd"] 99% заказчиков, заглядывающих в исходники при приемке работы, голову оторвут. :biggrin:

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


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

Ключевое слово (return и прочие) не являются именем.

Это функция :) :)

Посему:

return();

return( value );

 

Стандарт стандартом, но за работу с элементами массивов в стиле Index["abcd"] 99% заказчиков, заглядывающих в исходники при приемке работы, голову оторвут. :biggrin:

1) Я бы вообще за работу массивами не по указателям в языке Си голову отрывал :)

2) Все зависит от читабельности. В угоду ей можно поступится и привычностью.

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


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

1) Я бы вообще за массив в языке Си голову отрывал :)

И как же работать с линейными наборами однотипных данных?

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


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

Это функция :) :)

Изначально был допустим вариант без скобок. Так что не функция.

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


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

И как же работать с линейными наборами однотипных данных?

Как и любыми другими - по указателю :)

 

 

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


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

Хм ... malloc() - наше всё?

Я имел ввиду работу с массивами, а не их статическое обьявление. Но вообще динамическое выделение памяти это СОВСЕМ неплохо, да и malloc() совсем не мешает "массивной" работе.

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


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

Ах! Поэзия! Посильнее "Фауста" Гете будет !

Писал вспешке под тот контекст. Уточняю. Обсуждаемый язык разбирает выражения слева направо.

 

Постфиксным выражением не может быть первое левое lvalue. Если встречается непостфиксный оператор, то за ним (справо) первое lvalue снова считается главным объектом, который не входит в постфиксное выражение. Т.к. выражения не обязаны быть в виде присваивания, то допустимы оба варианта

 

x = Array[index];

Array[index];

 

И классификация субэлементов выражения Array[index] в этих двух вариантах не должна отличаться.

 

Упд

Правило написано для области (места, позиции в тексте) исполняемого кода. В т.ч. в области деклараций при задании начального значения lvalue. В первой части объявления lvalue в декларациях, до задания значения, могут быть нюансы и. какие там основы в принятой терминологии не ясно.

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

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


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

Обсуждаемый язык разбирает выражения слева направо.

Разумеется нет. Порядок "разборки" вообще никакого значения не имеет к языку. Важен порядок вычисления выражений, который идет в соответствии с приоритетом операций и формами записей.

 

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


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

Но вообще динамическое выделение памяти это СОВСЕМ неплохо, да и malloc() совсем не мешает "массивной" работе.

Как по мне - malloc/free - это принципиально другой подход к хранению и обработке данных, чем статический массив. При грамотном подходе даёт, безусловно, бОльшую свободу действий, но имеет и свои минусы, особенно в embedded и real-time проектах: тут и излишний перерасход памяти, и недетерминированное время выделения/освобождения памяти из "кучи" при её фрагментации и т. п.

Но это уже оффтопик.

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


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

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