реклама на сайте
подробности

 
 
6 страниц V  « < 2 3 4 5 6 >  
Closed TopicStart new topic
> Указатели на строку в С
GetSmart
сообщение Jan 25 2016, 12:19
Сообщение #46


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Нашёл такую формулировку
Цитата
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[i] =*(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


Цитата(CrimsonPig @ Jan 25 2016, 15:47) *
... Это вам не про монадические типы рассуждать... sm.gif

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

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

Сообщение отредактировал GetSmart - Jan 25 2016, 13:43


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2016, 12:21
Сообщение #47


Гуру
******

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



Цитата(CrimsonPig @ Jan 25 2016, 13:47) *
А вот что скажут теоретики программирования
Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2016, 12:40
Сообщение #48


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 25 2016, 16:21) *
Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

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

x = array[index];

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2016, 12:46
Сообщение #49


Гуру
******

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



Цитата(GetSmart @ Jan 25 2016, 14:19) *
В этом определении нет разрешения "индекса наизнанку" (в конце определения).
А никто и не говорит, что можно писать [index]Array.
Цитата(GetSmart @ Jan 25 2016, 14:19) *
Но понять смысл первого предложения невозможно. expression in square brackets [ ] и есть частный случай постфикс-выражения. В определении отсутствует главный объект.
Что-то вас конкретно клинит. Возьмем для простоты Array[index]. Здесь "Array" - postfix expression, (выражение, к которому может быть применен постфиксный оператор). "[]" - это postfix operator. index - expression in square brackets.

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

Цитата(GetSmart @ Jan 25 2016, 14:40) *
И какое слово в том определении переводится как обращение? "Указание" на элемент, возможно есть.
designation - указание, цель. Хорошо, пусть будет указание, что, по сути, и есть обращение.

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2016, 13:08
Сообщение #50


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 25 2016, 16:21) *
Если бы некоторые писатели еще и читали предыдущие сообщения, они бы увидели, что именно эти примеры мы и пытались обсуждать.

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

Цитата(Сергей Борщ @ Jan 25 2016, 16:46) *
Что-то вас конкретно клинит. Возьмем для простоты Array[index]. Здесь "Array" - postfix expression, (выражение, к которому может быть применен постфиксный оператор). "[]" - это postfix operator. index - expression in square brackets.

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

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

Сообщение отредактировал GetSmart - Jan 25 2016, 13:17


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 25 2016, 13:12
Сообщение #51


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2016, 13:15
Сообщение #52


Гуру
******

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



QUOTE (GetSmart @ Jan 25 2016, 14:19) *
Ключевое слово (return и прочие) не являются именем.

Это функция sm.gif sm.gif
Посему:
return();
return( value );

QUOTE (gerber @ Jan 25 2016, 15:12) *
Стандарт стандартом, но за работу с элементами массивов в стиле Index["abcd"] 99% заказчиков, заглядывающих в исходники при приемке работы, голову оторвут. biggrin.gif

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 25 2016, 13:19
Сообщение #53


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(zltigo @ Jan 25 2016, 16:15) *
1) Я бы вообще за массив в языке Си голову отрывал sm.gif

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2016, 13:19
Сообщение #54


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jan 25 2016, 17:15) *
Это функция sm.gif sm.gif

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2016, 13:20
Сообщение #55


Гуру
******

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



QUOTE (gerber @ Jan 25 2016, 15:19) *
И как же работать с линейными наборами однотипных данных?

Как и любыми другими - по указателю sm.gif



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 25 2016, 13:23
Сообщение #56


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(zltigo @ Jan 25 2016, 16:20) *
Как и любыми другими - по указателю sm.gif

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2016, 13:27
Сообщение #57


Гуру
******

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



QUOTE (gerber @ Jan 25 2016, 15:23) *
Хм ... malloc() - наше всё?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2016, 13:53
Сообщение #58


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(CrimsonPig @ Jan 25 2016, 15:47) *
Ах! Поэзия! Посильнее "Фауста" Гете будет !

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

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

x = Array[index];
Array[index];

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

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

Сообщение отредактировал GetSmart - Jan 25 2016, 23:49


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2016, 14:33
Сообщение #59


Гуру
******

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



QUOTE (GetSmart @ Jan 25 2016, 15:53) *
Обсуждаемый язык разбирает выражения слева направо.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 25 2016, 15:02
Сообщение #60


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(zltigo @ Jan 25 2016, 16:27) *
Но вообще динамическое выделение памяти это СОВСЕМ неплохо, да и malloc() совсем не мешает "массивной" работе.

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th August 2025 - 09:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016