Kiểu dữ liệu vô hướng và nguyên thủy - chúng có giống nhau không?


127

Trong các bài báo khác nhau mà tôi đã đọc, đôi khi có đề cập đến các kiểu dữ liệu nguyên thủy và đôi khi có đề cập đến các đại lượng vô hướng.

Sự hiểu biết của tôi về mỗi loại là chúng là các kiểu dữ liệu của một cái gì đó đơn giản như int, boolean, char, v.v.

Có điều gì tôi thiếu có nghĩa là bạn nên sử dụng thuật ngữ cụ thể hoặc các thuật ngữ chỉ đơn giản có thể hoán đổi cho nhau? Các trang Wikipedia cho mỗi trang không hiển thị bất cứ điều gì rõ ràng.

Nếu các điều khoản đơn giản có thể hoán đổi cho nhau, thì điều khoản nào được ưu tiên hơn?

Câu trả lời:


203

Tôi không nghĩ chúng có thể hoán đổi cho nhau. Chúng thường giống nhau, nhưng sự khác biệt vẫn tồn tại và dường như chủ yếu nằm ở những gì chúng tương phản với nhau và những gì có liên quan trong ngữ cảnh.

Vô hướng thường tương phản với các hợp chất , chẳng hạn như mảng, bản đồ, tập hợp, cấu trúc, v.v. Một vô hướng là một giá trị "duy nhất" - số nguyên, boolean, có lẽ là một chuỗi - trong khi một hợp chất được tạo thành từ nhiều đại lượng vô hướng (và có thể tham chiếu đến hợp chất khác). "Vô hướng" được sử dụng trong các ngữ cảnh mà sự khác biệt có liên quan giữa các giá trị đơn / đơn giản / nguyên tử và giá trị hợp chất.

Tuy nhiên, các kiểu nguyên thủy tương phản với các kiểu tham chiếu , ví dụ và được sử dụng khi sự phân biệt có liên quan là "Đây có phải là một giá trị trực tiếp hay nó là một tham chiếu đến thứ có chứa giá trị thực?", Như trong các kiểu nguyên thủy của Java so với các tham chiếu . Tôi thấy đây là một sự phân biệt cấp thấp hơn một chút so với vô hướng / hợp chất, nhưng không hoàn toàn.

Nó thực sự phụ thuộc vào ngữ cảnh (và thường là ngữ hệ đang được thảo luận). Để lấy một, có thể là bệnh lý, ví dụ: dây. Trong C, một chuỗi là một hợp (một mảng các ký tự), trong khi trong Perl, một chuỗi là một vô hướng. Trong Java, một chuỗi là một đối tượng (hoặc kiểu tham chiếu). Trong Python, mọi thứ (về mặt khái niệm) là một đối tượng / kiểu tham chiếu, bao gồm chuỗi (và số).


1
Cũng cần được xem xét trong một cuộc thảo luận về kiểu tham chiếu và kiểu nguyên thủy là kiểu "giá trị". Về sự tương đương của vô hướng và nguyên hàm, nó phụ thuộc vào ngôn ngữ. Theo hướng dẫn PHP, ví dụ, chỉ một nửa trong số các loại nguyên thủy của nó là vô hướng: php.net/manual/en/language.types.intro.php
Joe Bowbeer

11
Điều này đã giúp tôi 8 năm sau :)
CoderXYZ

18

Có rất nhiều sự nhầm lẫn và sử dụng sai các thuật ngữ này. Thường thì cái này được dùng để chỉ cái khác. Đây là ý nghĩa thực sự của những thuật ngữ đó.

"Gốc" đề cập đến các kiểu được tích hợp vào ngôn ngữ, trái ngược với việc được cung cấp bởi thư viện (thậm chí là thư viện chuẩn), bất kể chúng được triển khai như thế nào. Chuỗi Perl là một phần của ngôn ngữ Perl, vì vậy chúng có nguồn gốc từ Perl. C cung cấp ngữ nghĩa chuỗi qua các con trỏ tới ký tự bằng thư viện, vì vậy con trỏ tới char là bản địa, nhưng chuỗi thì không.

"Nguyên tử" dùng để chỉ một loại không thể phân hủy được nữa. Nó đối lập với "composite" . Vật liệu tổng hợp có thể được phân hủy thành sự kết hợp của các giá trị nguyên tử hoặc vật liệu tổng hợp khác. Số nguyên và số dấu phẩy động là nguyên tử. Phân số, số phức, vùng chứa / tập hợp và chuỗi là hỗn hợp.

"Vô hướng" - và đây là điều khiến hầu hết mọi người nhầm lẫn - đề cập đến các giá trị có thể thể hiện tỷ lệ (do đó có tên), chẳng hạn như kích thước, khối lượng, số đếm, v.v. Số nguyên, số dấu phẩy động và phân số là các đại lượng vô hướng. Số phức, boolean và chuỗi KHÔNG phải là số vô hướng. Một cái gì đó là nguyên tử không nhất thiết là vô hướng và một cái gì đó vô hướng không nhất thiết phải là nguyên tử. Vô hướng có thể là bản địa hoặc do các thư viện cung cấp.

Một số loại có phân loại kỳ quặc. Các kiểu BigNumber, thường được triển khai dưới dạng một mảng chữ số hoặc số nguyên, là các đại lượng vô hướng, nhưng về mặt kỹ thuật chúng không phải là nguyên tử. Chúng có thể có vẻ là nguyên tử nếu quá trình triển khai bị ẩn và bạn không thể truy cập các thành phần bên trong. Nhưng các thành phần chỉ là ẩn, vì vậy tính nguyên tử là một ảo tưởng. Chúng hầu như luôn được cung cấp trong các thư viện, vì vậy chúng không phải là bản gốc, nhưng chúng có thể là như vậy. Ví dụ, trong ngôn ngữ lập trình Mathematica, các số lớn là bản địa và vì không có cách nào để chương trình Mathematica phân rã chúng thành các khối xây dựng của chúng, chúng cũng nguyên tử trong ngữ cảnh đó, mặc dù thực tế là chúng là vật liệu tổng hợp dưới bao gồm (nơi bạn không còn ở trong thế giới của ngôn ngữ Mathematica).

Các định nghĩa này độc lập với ngôn ngữ đang được sử dụng.


16
Mặc dù định nghĩa về kiểu vô hướng này có ý nghĩa nhất đối với tôi, nhưng đây có vẻ không phải là định nghĩa được chấp nhận phổ biến nhất.
lleaff

1
Cảm ơn bạn đã định nghĩa rõ ràng về 'Vô hướng'. Mặc dù, như @lleaff chỉ ra rằng hầu hết mọi người không sử dụng nó theo nghĩa cụ thể này, sẽ tốt hơn nếu họ làm vậy.
clockworkpc

Các định nghĩa ngôn ngữ tuyệt vời. Câu trả lời này nên được đọc cùng với câu trả lời của Michael Ekstrand để có một cuộc thảo luận đầy đủ hơn. Thật không may, trong ngữ cảnh của các ngôn ngữ lập trình, vô hướng có những ý nghĩa khác nhau.
Jerry

9

Nói một cách đơn giản, có vẻ như kiểu 'vô hướng' đề cập đến một mục duy nhất, trái ngược với tổng hợp hoặc tập hợp. Vì vậy, vô hướng bao gồm cả giá trị nguyên thủy cũng như những thứ như giá trị enum.

http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html

Có lẽ thuật ngữ 'vô hướng' có thể là một sự trở lại của C:

trong đó vô hướng là các đối tượng nguyên thủy chứa một giá trị duy nhất và không bao gồm các đối tượng C ++ khác

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

Tôi tò mò về việc liệu điều này có ám chỉ liệu những món đồ này sẽ có giá trị 'quy mô' không? - Chẳng hạn như đếm số.


2
Tôi đã được dạy (cách đây rất lâu ở trường) rằng thuật ngữ này có nguồn gốc từ 'bộ xử lý vô hướng' trái ngược với 'bộ xử lý vectơ'. Bộ xử lý vô hướng là một CPU chỉ có thể xử lý một phần dữ liệu tại một thời điểm. Các bộ xử lý này được / được đặt tên theo các thuật ngữ số học. Điều thú vị là khi bạn tra cứu 'vô hướng' trên wikipedia, bạn sẽ được chuyển hướng đến 'biến'.
Evert

2

Tôi thích câu trả lời của Scott Langeberg vì nó ngắn gọn và được hỗ trợ bởi các liên kết có thẩm quyền. Tôi sẽ bỏ phiếu cho câu trả lời của Scott nếu tôi có thể.

Tôi cho rằng kiểu dữ liệu "nguyên thủy" có thể được coi là kiểu dữ liệu chính để các kiểu dữ liệu thứ cấp có nguồn gốc từ kiểu dữ liệu chính. Việc dẫn xuất là thông qua kết hợp, chẳng hạn như cấu trúc C ++. Một cấu trúc có thể được sử dụng để kết hợp các kiểu dữ liệu (chẳng hạn như int và một char) để có được một kiểu dữ liệu phụ. Kiểu dữ liệu do cấu trúc định nghĩa luôn là kiểu dữ liệu thứ cấp. Các kiểu dữ liệu chính không bắt nguồn từ bất cứ thứ gì, thay vào đó chúng là một kiểu đã cho trong ngôn ngữ lập trình.

Tôi có một song song với nguyên thủy là danh pháp có nghĩa là chính. Song song đó là "biểu thức chính quy". Tôi nghĩ danh pháp "thường xuyên" có thể hiểu là "điều tiết". Vì vậy, bạn có một biểu thức điều chỉnh việc tìm kiếm.

Từ nguyên vô hướng ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) có nghĩa là giống bậc thang. Tôi nghĩ cách này liên quan đến lập trình là một cái thang chỉ có một chiều: Có bao nhiêu bậc từ cuối bậc thang. Kiểu dữ liệu vô hướng chỉ có một thứ nguyên, do đó được biểu thị bằng một giá trị duy nhất.

Tôi nghĩ trong cách sử dụng, nguyên thủy và vô hướng có thể hoán đổi cho nhau. Có ví dụ nào về một nguyên thủy không phải là vô hướng, hoặc một vô hướng không nguyên thủy không?

Mặc dù có thể hoán đổi cho nhau, nhưng nguyên thủy đề cập đến kiểu dữ liệu là khối xây dựng cơ bản của các kiểu dữ liệu khác và nguyên thủy không bao gồm các kiểu dữ liệu khác.

Vô hướng đề cập đến việc nó có một giá trị duy nhất. Vô hướng đối lập với vectơ toán học. Một vectơ không được biểu diễn bằng một giá trị duy nhất vì (sử dụng một loại vectơ làm ví dụ) một giá trị là cần thiết để biểu thị hướng của vectơ và một giá trị khác cần thiết để biểu thị độ lớn của vectơ.

Liên kết tham khảo: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


0

Trong C, các kiểu liệt kê, ký tự và các biểu diễn khác nhau của số nguyên tạo thành một lớp kiểu tổng quát hơn được gọi là kiểu vô hướng. Do đó, các phép toán bạn có thể thực hiện trên các giá trị của bất kỳ kiểu vô hướng nào cũng giống như các phép toán đối với số nguyên.


0

kiểu null là thứ duy nhất phù hợp thực tế nhất với định nghĩa của "kiểu vô hướng". Ngay cả việc đăng 'None' thành 'N.' phù hợp với một từ 16 bit theo truyền thống là vô hướng - hoặc thậm chí một bit đơn lẻ có nhiều giá trị có thể - không phải là "dữ liệu đơn lẻ".


0

Mọi nguyên thủy là vô hướng, nhưng không phải ngược lại. DateTime là vô hướng, nhưng không phải là nguyên thủy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.