Можно ли считать переменную типа 'int' примитивной / фундаментальной структурой данных? - PullRequest
6 голосов
/ 12 января 2010

Грубое определение структуры данных заключается в том, что она позволяет хранить данные и применять набор операций к этим данным, сохраняя согласованность данных до и после операции. Однако некоторые люди настаивают на том, что примитивную переменную типа 'int' также можно рассматривать как структуру данных. Я получаю ту часть, где она позволяет вам хранить данные, но я думаю, что операционная часть отсутствует. Примитивные переменные не имеют прикрепленных к ним операций. Поэтому я чувствую, что если у вас нет определенного набора операций, привязанного к нему, вы не сможете назвать его структурой данных. У int нет операций, связанных с ним, с ним можно работать с помощью набора универсальных операторов.

Пожалуйста, сообщите, если я здесь что-то не так.

Ответы [ 9 ]

5 голосов
/ 12 января 2010

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

Структура данных - это произвольная конструкция, используемая для описания того, как хранить данные в системе. Это может быть как простой примитив, так и сложный, как класс. Так что ответ во многом субъективен. Это «да», если вы решите использовать примитив как таковой, что простой примитив может считаться примитивной структурой данных, поскольку он описывает, КАК вы хотите хранить элемент данных. Ответ также «нет», потому что он описывает элемент структуры и не обязательно саму структуру в целом.

Что касается того, как это относится к операциям, то, строго говоря, структура данных не имеет ничего общего с поведением, это просто механизм хранения. Сохранение согласованности данных - это действительно поведенческая вещь. Да, ваш компилятор, вероятно, выдает ошибки, если вы пытаетесь вставить 32-битное значение в байт, но это симптоматично для поведения системы (т. Е. Компиляции), воздействующей на структуру данных вашего приложения, из которых ваш примитивы - это элемент.

2 голосов
/ 12 января 2010

Я не думаю, что вы правильно определили структуру данных.

Мне кажется, что struct (без методов) является допустимой структурой данных, но у нее нет реальных «операций». И это не важно. Он содержит данные.

Для этого, и int хранит данные, Object хранит данные. Это структуры данных (технически).

Тем не менее, я никогда не обнаруживаю, что говорю: «Какую структуру данных мне использовать? Я знаю! Int!».

Я бы сказал, что вам необходимо переоценить значение "структуры данных".

1 голос
/ 12 января 2010

Ваше определение структуры данных не совсем верно. Структура данных не обязательно имеет какие-либо привязанные поведения или операции. ADT или абстрактный тип данных - это то, что вы описываете как структуру данных. ADT включает в себя данные и поведение или операции, которые работают с этими данными. Сам по себе int не является ADT, но я полагаю, вы могли бы назвать его структурой данных. Если вы инкапсулируете int и его операции, то у вас есть ADT, который, я думаю, вы пытаетесь описать как структуру данных. Классы предоставляют механизм для реализации ADT на современных языках.

Википедия имеет хорошее описание абстрактных типов данных.

1 голос
/ 12 января 2010

Примитивы do имеют прикрепленные к ним операции; однако они могут быть не в формате методов, как вы ожидаете в объектно-ориентированной парадигме.

Назначение =, сложение +, вычитание -, сравнение == и т. Д. - все операции. Особенно если учесть, что вы можете явно определить, переопределить или перегрузить эти операции для произвольных классов (например, структур данных) в некоторых языках (например, C ++), тогда примитив int, char или что вы не очень отличается.

1 голос
/ 12 января 2010

Я бы сказал, что "int" - это структура данных - она ​​имеет определенное представление и значение. То есть, в зависимости от вашей системы, она имеет конкретную длину, определенный набор доступных для нее операторов и определенное представление (будь то комплимент от двух). Он предназначен для хранения «целых чисел».

Практически, это различие не особенно актуально.

0 голосов
/ 12 января 2010

Конечно, это зависит от того, что вы подразумеваете под «структурой данных». Другие сосредоточились на том, является ли ваше определение правильным и поднимают хорошие вопросы. Но что если мы скажем: «Давайте пока проигнорируем этот термин и сосредоточимся на том, что вы описали?» Другими словами, что если посмотреть на

  • Кусок данных, который имеет назначенную интерпретацию его значения
  • Набор операций с этими данными

Тогда, конечно, int квалифицируется. (Если бы не было операций на int, мы бы все застряли!)

Более математический подход к программированию, начинающийся с этих вопросов и приводящий их к тому, что некоторые называют «алгеброй вычислений», см. Элементы программирования , автор Alex Stepanov и Пол МакДжонс.

0 голосов
/ 12 января 2010

'int' не имеет каких-либо операций, к которым он может быть применен с помощью набора универсальных операторов.

Операции неразрывно связаны с вещами , над которыми они работают; нет такой вещи как общие операции.

Это верно в математическом смысле (< работает для набора целых чисел, но не имеет значения для комплексных чисел), а также в компьютерном научном смысле (для оценки a + b требуется, чтобы a и b являются или могут быть преобразованы в совместимые типы, для которых определена операция +).

0 голосов
/ 12 января 2010

Не думаю, (ссылка: Википедия ), что Структура данных включает определение допустимых операций (для операторов) Конечно, мы могли бы привести C ++ class в качестве контрпримера, в котором мы можем определить перегруженные операторы. В то же время мы определяем структуру как просто составной / определенный пользователем тип данных и не объявляем никаких допустимых операций над ними. Мы позволяем компилятору выяснить это.

0 голосов
/ 12 января 2010

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

'int' не имеет каких-либо операций, к ним можно обращаться с помощью набора универсальных операторов.

Generic? Тогда почему 2+2 работает, а "ninja" + List<float> нет? Если бы оператор был универсальным, он бы работал на что угодно. Это не так. Он работает только с несколькими предопределенными типами, такими как целые числа.

У Ints определен набор операций, определенных на них. Арифметические операции, такие как сложение, вычитание, умножение или деление, например. Большинство языков также имеют некоторую функциональность, подобную ToString(), определенную для целых чисел. Но вы не можете просто сделать что-нибудь с int. Например, вы не можете передать int функции, ожидающей строку. У int есть очень специфический набор операций, определенных на них. Эти операции просто не являются методами-членами. Они бывают в форме операторов и функций, не являющихся членами, или методов-членов других классов. Но они все еще являются операциями, которые работают с целыми числами.

...