Scalar กับประเภทข้อมูลดั้งเดิม - เป็นสิ่งเดียวกันหรือไม่?


127

ในบทความต่างๆที่ฉันได้อ่านบางครั้งมีการอ้างอิงถึงประเภทข้อมูลดั้งเดิมและบางครั้งก็มีการอ้างอิงถึงสเกลาร์

ความเข้าใจของฉันเกี่ยวกับแต่ละข้อคือเป็นประเภทข้อมูลของสิ่งง่ายๆเช่น int, boolean, char เป็นต้น

มีบางอย่างที่ฉันขาดหายไปซึ่งหมายความว่าคุณควรใช้คำศัพท์เฉพาะหรือเป็นคำที่ใช้แทนกันได้? หน้า Wikipedia สำหรับแต่ละหน้าไม่ได้แสดงอะไรที่ชัดเจน

หากข้อกำหนดสามารถใช้แทนกันได้คำใดที่ต้องการคือ?

คำตอบ:


203

ฉันไม่คิดว่ามันใช้แทนกันได้ บ่อยครั้งที่มีความคล้ายคลึงกัน แต่ความแตกต่างนั้นมีอยู่จริงและดูเหมือนว่าส่วนใหญ่จะอยู่ในสิ่งที่พวกเขาเปรียบเทียบและสิ่งที่เกี่ยวข้องในบริบท

โดยทั่วไปสเกลาร์จะถูกเปรียบเทียบกับสารประกอบเช่นอาร์เรย์แผนที่เซตโครงสร้าง ฯลฯ สเกลาร์คือค่า "เดี่ยว" - จำนวนเต็มบูลีนบางทีอาจเป็นสตริงในขณะที่สารประกอบประกอบด้วยสเกลาร์หลายตัว (และอาจอ้างอิงถึง สารประกอบอื่น ๆ ). "สเกลาร์" ถูกใช้ในบริบทที่ความแตกต่างที่เกี่ยวข้องอยู่ระหว่างค่าเดียว / ธรรมดา / ค่าอะตอมและค่าสารประกอบ

อย่างไรก็ตามประเภทดึกดำบรรพ์มีความแตกต่างกับประเภทอ้างอิงเช่นและจะใช้เมื่อความแตกต่างที่เกี่ยวข้องคือ "นี่เป็นค่าโดยตรงหรือเป็นการอ้างอิงถึงสิ่งที่มีค่าจริงหรือไม่" เช่นเดียวกับประเภทดั้งเดิมของ Java เทียบกับการอ้างอิง . ฉันเห็นว่านี่เป็นความแตกต่างระดับที่ค่อนข้างต่ำกว่าสเกลาร์ / สารประกอบ แต่ก็ไม่มากนัก

มันขึ้นอยู่กับบริบทจริงๆ (และมักจะพูดถึงตระกูลภาษาอะไร) ในการใช้เวลาอย่างใดอย่างหนึ่งอาจเป็นไปได้ทางพยาธิวิทยาเช่นสตริง ใน C สตริงคือสารประกอบ (อาร์เรย์ของอักขระ) ในขณะที่อยู่ใน Perl สตริงเป็นสเกลาร์ ใน Java สตริงคืออ็อบเจ็กต์ (หรือประเภทการอ้างอิง) ใน Python ทุกอย่างเป็น (แนวความคิด) ประเภทวัตถุ / การอ้างอิงรวมถึงสตริง (และตัวเลข)


1
สิ่งที่ต้องพิจารณาในการอภิปรายเกี่ยวกับประเภทการอ้างอิงและประเภทดั้งเดิมคือประเภท "มูลค่า" เกี่ยวกับความเท่าเทียมกันของสเกลาร์และดั้งเดิมนั้นขึ้นอยู่กับภาษา ตัวอย่างเช่นตามคู่มือ PHP มีเพียงครึ่งหนึ่งของประเภทดั้งเดิมเท่านั้นที่เป็นสเกลาร์: php.net/manual/en/language.types.intro.php
Joe Bowbeer

11
สิ่งนี้ช่วยฉัน 8 ปีต่อมา :)
CoderXYZ

18

มีความสับสนและการใช้คำศัพท์เหล่านี้ในทางที่ผิด มักใช้เพื่อหมายถึงอีกคนหนึ่ง นี่คือความหมายที่แท้จริงของคำเหล่านั้น

"เนทีฟ"หมายถึงประเภทที่สร้างขึ้นในภาษาซึ่งต่างจากการจัดเตรียมโดยไลบรารี (แม้แต่ไลบรารีมาตรฐาน) โดยไม่คำนึงถึงวิธีการใช้งาน สตริง Perl เป็นส่วนหนึ่งของภาษา Perl ดังนั้นจึงเป็นภาษาพื้นเมืองใน Perl C ให้ความหมายของสตริงเหนือตัวชี้ไปยังตัวอักษรโดยใช้ไลบรารีดังนั้นตัวชี้ไปยังถ่านจึงเป็นแบบเนทีฟ แต่สตริงไม่ใช่

"ปรมาณู"หมายถึงชนิดที่ไม่สามารถย่อยสลายได้อีกต่อไป มันเป็นตรงข้ามของ"คอมโพสิต" คอมโพสิตสามารถย่อยสลายได้โดยรวมค่าอะตอมหรือส่วนประกอบอื่น ๆ จำนวนเต็มเนทีฟและเลขทศนิยมเป็นอะตอม เศษส่วนจำนวนเชิงซ้อนคอนเทนเนอร์ / คอลเลกชันและสตริงเป็นส่วนประกอบ

"สเกลาร์" - และนี่คือสิ่งที่ทำให้คนส่วนใหญ่สับสน - หมายถึงค่าที่สามารถแสดงมาตราส่วน (ดังนั้นชื่อ) เช่นขนาดปริมาตรการนับ ฯลฯ จำนวนเต็มเลขทศนิยมและเศษส่วนเป็นสเกลาร์ จำนวนเชิงซ้อนบูลีนและสตริงไม่ใช่สเกลาร์ สิ่งที่เป็นปรมาณูไม่จำเป็นต้องเป็นสเกลาร์และสิ่งที่เป็นสเกลาร์ไม่จำเป็นต้องเป็นปรมาณู สเกลาร์สามารถเป็นของพื้นเมืองหรือจัดเตรียมโดยห้องสมุด

บางชนิดมีการจำแนกประเภทแปลก ๆ ประเภท BigNumber มักใช้เป็นอาร์เรย์ของตัวเลขหรือจำนวนเต็มเป็นสเกลาร์ แต่ในทางเทคนิคไม่ใช่อะตอม อาจดูเหมือนเป็นปรมาณูหากการใช้งานถูกซ่อนไว้และคุณไม่สามารถเข้าถึงส่วนประกอบภายในได้ แต่ส่วนประกอบถูกซ่อนไว้เท่านั้นดังนั้นปรมาณูจึงเป็นภาพลวงตา มีให้ในไลบรารีเกือบตลอดเวลาดังนั้นจึงไม่ได้อยู่ในตัวเครื่อง แต่อาจเป็นได้ ตัวอย่างเช่นในภาษาการเขียนโปรแกรม Mathematica ตัวเลขจำนวนมากเป็นภาษาพื้นเมืองและเนื่องจากไม่มีวิธีใดที่โปรแกรม Mathematica จะแยกย่อยออกเป็นหน่วยการสร้างของพวกเขาพวกมันก็เป็นอะตอมในบริบทนั้นเช่นกันแม้ว่าจะเป็นองค์ประกอบที่อยู่ภายใต้ ครอบคลุม (ซึ่งคุณไม่ได้อยู่ในโลกของภาษา Mathematica อีกต่อไป)

คำจำกัดความเหล่านี้ไม่ขึ้นอยู่กับภาษาที่ใช้


16
แม้ว่าคำจำกัดความของประเภทสเกลาร์นี้จะมีความหมายสำหรับฉันมากที่สุด แต่ก็ดูเหมือนจะไม่เป็นที่ยอมรับกันมากที่สุด
lleaff

1
ขอขอบคุณสำหรับคำจำกัดความที่ชัดเจนของ "Scalar" แม้ว่า @lleaff จะชี้ให้เห็นว่าคนส่วนใหญ่ไม่ได้ใช้มันในแง่นี้ แต่มันจะดีกว่าถ้าพวกเขาทำ
clockworkpc

คำจำกัดความทางภาษาที่ยอดเยี่ยม คำตอบนี้ควรอ่านพร้อมกับคำตอบของ Michael Ekstrand เพื่อการสนทนาที่สมบูรณ์ยิ่งขึ้น ในบริบทของภาษาโปรแกรมสเกลาร์มีความหมายที่แตกต่างกันอย่างน่าเสียดาย
Jerry

9

พูดง่ายๆก็คือดูเหมือนว่าประเภท 'สเกลาร์' หมายถึงรายการเดียวซึ่งต่างจากคอมโพสิตหรือคอลเลกชัน ดังนั้นสเกลาร์จึงรวมทั้งค่าดั้งเดิมและค่าต่างๆเช่นค่า enum

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

บางทีคำว่า 'สเกลาร์' อาจเป็นการย้อนกลับไปที่ C:

โดยที่สเกลาร์เป็นวัตถุดั้งเดิมที่มีค่าเดียวและไม่ประกอบด้วยวัตถุ C ++ อื่น ๆ

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

ฉันอยากรู้ว่าสิ่งนี้หมายถึงว่าสิ่งของเหล่านี้จะมีค่าเป็น 'มาตราส่วน' หรือไม่? - เช่นการนับเลข


2
ฉันถูกสอน (เมื่อนานมาแล้วในโรงเรียน) ว่าคำนี้มาจาก 'ตัวประมวลผลสเกลาร์' ซึ่งตรงกันข้ามกับ 'ตัวประมวลผลเวกเตอร์' สเกลาร์โปรเซสเซอร์คือซีพียูที่สามารถจัดการข้อมูลได้ครั้งละหนึ่งชิ้นเท่านั้น โปรเซสเซอร์เหล่านี้ถูกตั้งชื่อตามเงื่อนไขทางคณิตศาสตร์ ที่น่าสนใจก็คือเมื่อคุณค้นหา 'สเกลาร์' ในวิกิพีเดียคุณจะเปลี่ยนเส้นทางไปที่ 'ตัวแปร'
ปลิ้น

2

ฉันชอบคำตอบของ Scott Langeberg เพราะมันกระชับและได้รับการสนับสนุนจากลิงก์ที่เชื่อถือได้ ฉันจะโหวตคำตอบของ Scott ถ้าทำได้

ฉันคิดว่าประเภทข้อมูล "ดั้งเดิม" อาจถือได้ว่าเป็นประเภทข้อมูลหลักเพื่อให้ประเภทข้อมูลทุติยภูมิได้มาจากประเภทข้อมูลหลัก ที่มาเกิดจากการรวมกันเช่นโครงสร้าง C ++ โครงสร้างสามารถใช้เพื่อรวมชนิดข้อมูล (เช่นและ int และถ่าน) เพื่อรับชนิดข้อมูลทุติยภูมิ ชนิดข้อมูลที่กำหนดโครงสร้างเป็นชนิดข้อมูลทุติยภูมิเสมอ ชนิดข้อมูลหลักไม่ได้มาจากสิ่งใด แต่เป็นข้อมูลที่กำหนดในภาษาโปรแกรม

ฉันมีคู่ขนานกับดั้งเดิมเป็นศัพท์ที่มีความหมายหลัก เส้นขนานนั้นคือ "นิพจน์ทั่วไป" ฉันคิดว่าศัพท์เฉพาะ "ปกติ" สามารถเข้าใจได้ว่าเป็น "การควบคุม" ดังนั้นคุณจึงมีนิพจน์ที่ควบคุมการค้นหา

นิรุกติศาสตร์สเกลาร์ ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) หมายถึงคล้ายขั้นบันได ฉันคิดว่าวิธีนี้เกี่ยวข้องกับการเขียนโปรแกรมก็คือบันไดมีมิติเดียวคือกี่ขั้นจากปลายบันได ชนิดข้อมูลสเกลาร์มีเพียงมิติเดียวจึงแสดงด้วยค่าเดียว

ฉันคิดว่าในการใช้งานดั้งเดิมและสเกลาร์สามารถใช้แทนกันได้ มีตัวอย่างของ primitive ที่ไม่ใช่สเกลาร์หรือสเกลาร์ที่ไม่ใช่แบบดั้งเดิมหรือไม่?

แม้ว่าจะใช้แทนกันได้ แต่แบบดั้งเดิมหมายถึงชนิดข้อมูลที่เป็นส่วนประกอบพื้นฐานของชนิดข้อมูลอื่น ๆ และแบบดั้งเดิมไม่ได้ประกอบด้วยชนิดข้อมูลอื่น

สเกลาร์หมายถึงการมีค่าเดียว สเกลาร์ตรงกันข้ามกับเวกเตอร์ทางคณิตศาสตร์ เวกเตอร์ไม่ได้แสดงด้วยค่าเดียวเนื่องจาก (ใช้เวกเตอร์ชนิดหนึ่งเป็นตัวอย่าง) จำเป็นต้องมีค่าหนึ่งเพื่อแสดงทิศทางของเวกเตอร์และค่าอื่นที่จำเป็นในการแสดงขนาดของเวกเตอร์

ลิงค์อ้างอิง: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


0

ใน C ประเภทการแจงนับอักขระและการแทนค่าต่างๆของจำนวนเต็มจะสร้างคลาสประเภททั่วไปที่เรียกว่าประเภทสเกลาร์ ดังนั้นการดำเนินการที่คุณสามารถดำเนินการกับค่าของประเภทสเกลาร์ใด ๆ จะเหมือนกับการดำเนินการสำหรับจำนวนเต็ม


0

ประเภทว่างเป็นสิ่งเดียวที่สอดคล้องกับคำจำกัดความของ "ประเภทสเกลาร์" อย่างแนบเนียนที่สุด แม้แต่การทำให้เป็นอนุกรมของ 'ไม่มี' เป็น 'N' การปรับให้พอดีกับคำ 16 บิตซึ่งเป็นสเกลาร์แบบดั้งเดิมหรือแม้แต่บิตเดียวที่มีค่าที่เป็นไปได้หลายค่าไม่ใช่ "ข้อมูลเดียว"


0

ดั้งเดิมทุกตัวเป็นสเกลาร์ แต่ไม่ใช่ในทางกลับกัน DateTime เป็นสเกลาร์ แต่ไม่ใช่แบบดั้งเดิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.