Jump to content

    
Sign in to follow this  
psL

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

Recommended Posts

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

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 и прочие) не являются именем.

 

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

Edited by GetSmart

Share this post


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

 

Share this post


Link to post
Share on other sites
Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

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

x = array[index];

 

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

Share this post


Link to post
Share on other sites
В этом определении нет разрешения "индекса наизнанку" (в конце определения).
А никто и не говорит, что можно писать [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 - указание, цель. Хорошо, пусть будет указание, что, по сути, и есть обращение.

 

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

Share this post


Link to post
Share on other sites
Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

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

 

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

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

 

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

Edited by GetSmart

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Ключевое слово (return и прочие) не являются именем.

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

Посему:

return();

return( value );

 

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

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

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

Share this post


Link to post
Share on other sites
1) Я бы вообще за массив в языке Си голову отрывал :)

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

Share this post


Link to post
Share on other sites
Это функция :) :)

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

Share this post


Link to post
Share on other sites
И как же работать с линейными наборами однотипных данных?

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

 

 

Share this post


Link to post
Share on other sites
Как и любыми другими - по указателю :)

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

Share this post


Link to post
Share on other sites
Хм ... malloc() - наше всё?

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

Share this post


Link to post
Share on other sites
Ах! Поэзия! Посильнее "Фауста" Гете будет !

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

 

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

 

x = Array[index];

Array[index];

 

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

 

Упд

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

Edited by GetSmart

Share this post


Link to post
Share on other sites
Обсуждаемый язык разбирает выражения слева направо.

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

 

Share this post


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

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

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this