Являются . и -> в C и C ++ действительно операторы? - PullRequest
5 голосов
/ 28 ноября 2010

Вы, вероятно, были обучены, изучены сами, это. и -> являются операторами , которые получают члены структуры (C) или класса (C ++).

Однако я сомневаюсь, что они являются операторами - потому что, если они являются операторами, каковы их типы ввода? Кроме того, идентификаторы с обеих сторон взаимозависимы - функция, которой, например, оператор + не хватает.

Если это правильно - в каком смысле они все еще помечены как операторы на практике, и каково их формальное определение в отношении теории языка.

Ответы [ 8 ]

6 голосов
/ 28 ноября 2010

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

Я бы сказал, что любой тип, который может быть распознан компилятором, может быть переданв качестве аргумента, включая внутренние типы, такие как «идентификатор».Оператор будет иметь два аргумента в своем представлении AST, что достаточно, чтобы позволить вам определить семантику.

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

Например, оператор может быть человеком, который работает на машине.Это определение не имеет отношения к теории программирования, но оно не помешает мне использовать ключевые слова на предметно-ориентированном языке, выражающие что-то связанное с работой на машине.Точно так же термин «оператор» имеет более широкое определение в математике, чем то, которое является специфическим для теории программирования - и это определение не становится недействительным просто при работе с языком программирования.

Другими словами, есливы не называете это оператором, что будет вы бы назвали?

РЕДАКТИРОВАТЬ

Чтобы уточнить, мой первый аргумент относится ксинтаксис для использования оператора (вызов).Эти операторы имеют правильные аргументы, которые являются идентификаторами - именами членов - которые язык C ++ не может выразить с использованием типа данных.Язык C ++ имеет , имеет указатели на члены, но они не то же самое, что и члены - просто переменная не совпадает с указателем на эту переменную.

Полагаю,это то, к чему относится вопрос.Правильный параметр этих операторов имеет тип, который нельзя выразить или манипулировать обычным образом в языке.

То, что происходит, когда этот синтаксис сопоставляется с перегруженной функцией operator->, - это совсем другое.Эта функция не является оператором, она лишь реализует оператор.

5 голосов
/ 28 ноября 2010

Я думаю, что тот факт, что вы можете перегрузить оператор -> с помощью ключевого слова "operator", должен быть пустой раздачей.

Умные указатели делают это довольно часто:

template<class T>
struct myPtr {
    T *operator ->()    { return m_ptr; }

    private:
        T *m_ptr;
};

. не перегружается, но также является оператором по определению.

3 голосов
/ 28 ноября 2010

Хммм ... sizeof - это оператор, каков его тип ввода? Я не думаю, что этот вопрос полезен для различения операторов от неоператоров в этом контексте.

И означает, что означает, что "оператор" в контексте языка программирования означает точно , что автор языка говорит, это означает. Тени Льюиса Кэрролла здесь.

1 голос
/ 28 ноября 2010

Онлайновый стандарт C ( n1256 ):

6.5.2.3 Структура и члены объединения

Ограничения

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

2 Первый операнд *Оператор 1016 * должен иметь указатель типа '' на квалифицированную или неквалифицированную структуру '' или '' указатель на квалифицированное или неквалифицированное объединение '', а второй операнд должен называть член указанного типа.

Они являются операторами, и их типы ввода определяются стандартом.

1 голос
/ 28 ноября 2010

Стандарт C ++ 03 обозначает оба оператора.

Пример:

... после.оператор применяется к выражению типа своего класса ...

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

1 голос
/ 28 ноября 2010

Эта ссылка говорит, что они оба оператора в C ++:

http://www.cplusplus.com/doc/tutorial/operators/

Разве это не достаточно авторитетно?

1 голос
/ 28 ноября 2010

Вы можете перегрузить оператор ->: Википедия .На этой странице также говорится, что вы не можете перегрузить точку.Вот пример -> перегрузки здесь :

class String // this is handle
{
  ...
  Stringrep *operator -> () const { return b_; }
  private:
  Stringrep *b_;
}

Стрелка работает со значением слева от стрелки и возвращает то, что левая сторона «держит внутри».Подумайте о умном указателе .

0 голосов
/ 28 ноября 2010

хаха, я знаю, что люди уже говорили это окольным путем, но просто чтобы сказать это прямо.В терминах C, label-> на самом деле является сокращением для (* label)..Что, как говорится, .это оператор, который ссылается на элементы в структуре.Следовательно, -> ссылается на элемент в указателе на структуру.

...