ชนิดข้อมูลและการดำเนินการในภาษาซี การแสดงออก ประเภทข้อมูลและการประกาศ

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

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

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

คำอธิบายตัวอย่าง:

ถ่าน ก,ข; /* ตัวแปร a และ b มีประเภท

ถ่าน */ intх; /* ตัวแปร x เป็นประเภท int

*/ ถ่านซิม; /" มีการอธิบายสัญลักษณ์ตัวแปรของประเภท char;

*/int count.num; /* num และจำนวนประเภท int */

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

ตัวอย่าง:ถ่าน backch = "\0";

มาดูประเภทหลักๆ ในภาษา C กัน

int - จำนวนเต็ม ("จำนวนเต็ม")ค่าประเภทนี้เป็นจำนวนเต็มจากช่วงที่จำกัด (ปกติคือตั้งแต่ - 32768 ถึง 32767) ช่วงดังกล่าวจะกำหนดโดยขนาดเซลล์สำหรับประเภทและขึ้นอยู่กับคอมพิวเตอร์แต่ละเครื่อง นอกจากนี้ยังมีคำฟังก์ชันที่สามารถใช้ได้กับประเภท int: short int (“จำนวนเต็มสั้น” - “จำนวนเต็มสั้น”), int ที่ไม่ได้ลงนาม (“จำนวนเต็มที่ไม่ได้ลงนาม” - “จำนวนเต็มที่ไม่ได้ลงนาม”), int ยาว (“จำนวนเต็มยาว ” ) ซึ่งจะลดหรือขยายช่วงของการแทนตัวเลขในทางกลับกัน

ถ่าน- ตัวละคร (“ตัวละคร”) ค่าที่ถูกต้องสำหรับประเภทนี้คืออักขระหนึ่งตัว (อย่าสับสนกับข้อความ!) สัญลักษณ์นี้เขียนด้วยเครื่องหมายอะพอสทรอฟี

ตัวอย่าง:"x"2"?"

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

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

ลอย - จริง (จุดลอยตัว)ค่าประเภทนี้คือตัวเลข แต่ต่างจากถ่านและ int ซึ่งไม่จำเป็นต้องเป็นจำนวนเต็ม

12.87 -316.12 -3.345e5 12.345e-15

double - จำนวนจริงที่มีความแม่นยำสองเท่าประเภทนี้คล้ายกับประเภท float แต่มีช่วงค่าที่ใหญ่กว่ามาก (เช่น สำหรับระบบการเขียนโปรแกรม Borland-C จาก 1.7E-308 ถึง 1.7E+308 แทนที่จะเป็นช่วงตั้งแต่ 3.4E-38 ถึง 3.4E+38 สำหรับแบบลูกลอย) อย่างไรก็ตามการเพิ่มช่วงและความแม่นยำของการแทนตัวเลขทำให้ความเร็วในการรันโปรแกรมลดลงและการใช้ RAM ของคอมพิวเตอร์อย่างสิ้นเปลือง


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

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

เรามายกตัวอย่างการใช้สตริงกัน

โปรแกรม 84

#รวม หลัก()

scanf("%s",สตริง);

printf("%s",สตริง);

ตัวอย่างนี้อธิบายอาร์เรย์ของตำแหน่งหน่วยความจำ 31 ตำแหน่ง โดย 30 ตำแหน่งสามารถเก็บองค์ประกอบถ่านตัวเดียวได้ มันถูกป้อนเมื่อเรียกใช้ฟังก์ชัน scanf("%s",string); "&" หายไปเมื่อระบุอาร์เรย์อักขระ

ป้ายบอกทาง. ตัวชี้คือการแสดงเชิงสัญลักษณ์ของที่อยู่ของตำแหน่งหน่วยความจำที่จัดสรรให้กับตัวแปร

ตัวอย่างเช่น &name เป็นตัวชี้ไปยังตัวแปรชื่อ

นี่คือ & คือการดำเนินการรับที่อยู่ ที่อยู่จริงคือตัวเลข และการแสดงสัญลักษณ์ของที่อยู่ &ชื่อคือค่าคงที่ตัวชี้

ภาษา C มีตัวแปรประเภทตัวชี้ด้วย เช่นเดียวกับค่าของตัวแปรถ่านที่เป็นอักขระ และค่าของตัวแปร int นั้นเป็นจำนวนเต็ม ค่าของตัวแปรตัวชี้ก็คือที่อยู่ของค่าบางค่า

หากเราตั้งชื่อให้พอยน์เตอร์เป็น ptr เราสามารถเขียนคำสั่งได้ดังนี้:

ptr = /* กำหนดชื่อที่อยู่ให้กับตัวแปร ptr */

เราพูดในกรณีนี้ว่า prt คือชื่อ "ตัวชี้ไปยัง" ความแตกต่างระหว่างสองสัญกรณ์: ptr และ &name คือ prt เป็นตัวแปร ในขณะที่ &name เป็นค่าคงที่ หากจำเป็น คุณสามารถทำให้ตัวแปร ptr ชี้ไปที่วัตถุอื่นได้:

ปตท= /* ptr ชี้ไปที่ bah ไม่ใช่ชื่อ */

ตอนนี้ค่าของตัวแปร prt คือที่อยู่ของตัวแปร bah สมมติว่าเรารู้ว่าตัวแปร ptr มีการอ้างอิงถึงตัวแปร bah จากนั้น หากต้องการเข้าถึงค่าของตัวแปรนี้ คุณสามารถใช้การดำเนินการ "การกำหนดที่อยู่ทางอ้อม" *:

วาล = *ptr; /* กำหนดค่าที่ชี้โดย ptr */ สองคำสั่งสุดท้ายที่นำมารวมกันจะเทียบเท่ากับข้อความต่อไปนี้:

ดังนั้นเมื่ออยู่หลังป้าย & ตามด้วยชื่อของตัวแปร ผลลัพธ์ของการดำเนินการคือที่อยู่ของตัวแปรที่ระบุ &nurse ให้ที่อยู่ของพยาบาลตัวแปร เมื่อ * ตามด้วยตัวชี้ไปยังตัวแปร ผลลัพธ์ของการดำเนินการคือค่าที่วางอยู่ในตำแหน่งหน่วยความจำตามที่อยู่ที่ระบุ

ตัวอย่าง:พยาบาล = 22;

พีทีอาร์ = /* ชี้ไปที่พยาบาล */

ผลลัพธ์คือการกำหนดค่า 22 ให้กับตัวแปร val

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

ตัวอย่างคำอธิบายที่ถูกต้องของพอยน์เตอร์: int *pi; ถ่าน *พีซี;

ข้อกำหนดประเภทจะระบุประเภทของตัวแปรที่ตัวชี้อ้างถึง และอักขระ * ระบุตัวแปรเองว่าเป็นตัวชี้ คำอธิบายของประเภท int *pi; บอกว่า pi เป็นตัวชี้และ *pi เป็นค่า int

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

รูปแบบ: typedef<старый тип> <новый тип> ตัวอย่าง: typedef ยาวขนาดใหญ่; /* กำหนดประเภทใหญ่ซึ่งเทียบเท่ากับประเภทยาว */

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

การดำเนินงานภาษา C มีความโดดเด่นด้วยการดำเนินการที่หลากหลาย (มากกว่า 40 รายการ) ที่นี่เราจะพิจารณาเฉพาะตารางหลักเท่านั้น 3.3.

การดำเนินการทางคณิตศาสตร์. เหล่านี้ได้แก่

เพิ่ม(+),

การลบ (ไบนารี) (-)

การคูณ (*),

แผนก (/),

ส่วนที่เหลือของการแบ่งทั้งหมด (%)

การลบ (เอกนารี) (-) .

ภาษา C มีกฎ: หากการจ่ายเงินปันผลและตัวหารเป็นประเภท int การหารจะดำเนินการทั้งหมด นั่นคือ เศษส่วนของผลลัพธ์จะถูกละทิ้ง

ตามปกติในนิพจน์ การดำเนินการของการคูณ การหาร และเศษจะดำเนินการก่อนการบวกและการลบ หากต้องการเปลี่ยนลำดับการดำเนินการ ให้ใช้วงเล็บ

โปรแกรม 85

#รวม

5 = -3 + 4 * 5 - 6; printf("%d\n",s);

ส = -3 + 4%5 - 6; printf("%d\n",s);

ส = -3 * 4% - 6/5; printf("%d\n",s);

ส= (7 + 6)%5/2; printf("%d\n",s);

ผลลัพธ์ของการรันโปรแกรม: 11 1 0 1

ตารางที่ 3.3 ลำดับความสำคัญและลำดับการดำเนินงาน

ในบทเรียนนี้คุณจะได้เรียนรู้ ตัวอักษรภาษา C++และอะไรด้วย ประเภทข้อมูลโปรแกรมสามารถประมวลผลได้ นี่อาจไม่ใช่ช่วงเวลาที่น่าตื่นเต้นที่สุด แต่ความรู้นี้จำเป็น! นอกจากนี้ เมื่อคุณเริ่มเรียนรู้ภาษาการเขียนโปรแกรมอื่น คุณจะผ่านขั้นตอนการเรียนรู้ที่คล้ายคลึงกันด้วยความมั่นใจมากขึ้น โปรแกรม C++ สามารถมีสัญลักษณ์ต่อไปนี้:

  • ตัวอักษรละตินตัวพิมพ์ใหญ่ตัวพิมพ์เล็ก A, B, C..., x, y, z และขีดล่าง;
  • เลขอารบิกตั้งแต่ 0 ถึง 9;
  • อักขระพิเศษ: ( ) , | - -< > = ! & # ~ ; ^
  • ช่องว่าง แท็บ และอักขระขึ้นบรรทัดใหม่

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

ข้อมูลในภาษา C++

ในการแก้ปัญหา โปรแกรมใดๆ ก็ตามจะประมวลผลข้อมูลบางอย่าง พวกเขาสามารถมีได้หลายประเภท: จำนวนเต็มและจำนวนจริง, อักขระ, สตริง, อาร์เรย์ ในภาษา C++ โดยปกติแล้วข้อมูลจะถูกอธิบายไว้ที่จุดเริ่มต้นของฟังก์ชัน ถึง ชนิดข้อมูลพื้นฐานภาษาได้แก่:

เพื่อสร้างข้อมูลประเภทอื่น ๆ ขั้นพื้นฐานและที่เรียกว่า ตัวระบุ C++ กำหนดตัวระบุประเภทข้อมูลสี่ประเภท:

  • สั้น - สั้น;
  • ยาว - ยาว;
  • ลงนาม - ลงนาม;
  • ไม่ได้ลงนาม - ไม่ได้ลงนาม

ประเภทจำนวนเต็ม

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

พิมพ์ พิสัย ขนาด
ภายใน -2147483648…2147483647 4 ไบต์
int ที่ไม่ได้ลงนาม 0…4294967295 4 ไบต์
ลงนามใน -2147483648…2147483647 4 ไบต์
สั้น ๆ -32768…32767 2 ไบต์
ยาว -2147483648…2147483647 4 ไบต์
int สั้นที่ไม่ได้ลงนาม 0…65535 2 ไบต์

แบบจริงๆ

จำนวนจุดลอยตัวจะแสดงในรูปแบบ mE +- p โดยที่ m คือแมนทิสซา (จำนวนเต็มหรือเศษส่วนที่มีจุดทศนิยม) p คือเลขชี้กำลัง (จำนวนเต็ม) โดยทั่วไปแล้วค่าเช่น ลอยใช้เวลาถึง 4 ไบต์และ สองเท่า 8 ไบต์ ตารางช่วงมูลค่าจริง:

ลอย 3.4E-38…3.4E+38 4 ไบต์
สองเท่า 1.7E-308…1.7E+308 8 ไบต์
ยาวสองเท่า 3.4E-4932…3.4E+4932 8 ไบต์

ประเภทบูลีน

ตัวแปรประเภท บูลสามารถรับได้เพียงสองค่าเท่านั้น จริง (จริง ) หรือ ฟาสเล (โกหก ). ค่าใดๆ ที่ไม่เท่ากับศูนย์จะถูกตีความว่าเป็น จริง.ความหมาย เท็จแสดงในหน่วยความจำเป็น 0

ประเภทเป็นโมฆะ

ชุดค่าประเภทนี้ว่างเปล่า ใช้เพื่อกำหนดฟังก์ชันที่ไม่ส่งคืนค่า เพื่อระบุรายการว่างของอาร์กิวเมนต์ของฟังก์ชัน เป็นประเภทพื้นฐานสำหรับพอยน์เตอร์ และในการดำเนินการคัดแยกประเภท

การแปลงชนิดข้อมูล

ในภาษา C++ มีการแปลงชนิดข้อมูลอยู่ 2 ประเภท: แบบชัดเจนและโดยนัย

  • การแปลงโดยนัยเกิดขึ้นโดยอัตโนมัติ ซึ่งกระทำระหว่างการเปรียบเทียบ มอบหมาย หรือประเมินนิพจน์ประเภทต่างๆ ตัวอย่างเช่น โปรแกรมต่อไปนี้จะพิมพ์ค่าดังกล่าวไปยังคอนโซล ลอย

#รวม "stdafx.h" #รวม ใช้เนมสเปซมาตรฐาน; int main() ( int i=5; float f=10.12; cout<>โมฆะ"); ส่งกลับ 0; )

#รวม "stdafx.h"

#รวม

ใช้เนมสเปซมาตรฐาน ;

int หลัก()

int i = 5 ; ลอย f = 10.12 ;

ศาล<< i / f ;

ระบบ ("หยุดชั่วคราว>>เป็นโมฆะ" );

กลับ 0 ;

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

  • การแปลงที่ชัดเจนตรงกันข้ามกับโดยปริยาย โปรแกรมเมอร์เป็นผู้ดำเนินการ มีหลายวิธีในการแปลงนี้:
  1. การแปลงเป็นรูปแบบ : (ลอย)
  2. การแปลงเป็นรูปแบบ ซี++: ลอย()

การหล่อแบบสามารถทำได้โดยใช้การดำเนินการต่อไปนี้:

static_cast<>() con_cast<>() ตีความ_cast ใหม่<>() ไดนามิก_แคสต์<> ()

static_cast<> ()

const_cast<> ()

ตีความใหม่_cast<> ()

dynamic_cast<> ()

static_cas- แปลงประเภทข้อมูลที่เกี่ยวข้อง ตัวดำเนินการนี้แปลงประเภทตามกฎปกติ ซึ่งอาจจำเป็นเมื่อคอมไพเลอร์ไม่ทำการแปลงอัตโนมัติ ไวยากรณ์จะมีลักษณะดังนี้:

พิมพ์ static_cast<Тип>(วัตถุ);

เมื่อใช้ static_cast คุณจะไม่สามารถลบค่าคงที่ออกจากตัวแปรได้ แต่ตัวดำเนินการต่อไปนี้สามารถทำได้ const_cast- ใช้เฉพาะเมื่อจำเป็นต้องลบความมั่นคงออกจากวัตถุเท่านั้น ไวยากรณ์จะมีลักษณะดังนี้:

พิมพ์const_cast< พิมพ์> (วัตถุ);

ตีความใหม่_cast- ใช้ในการแปลงประเภทต่างๆ จำนวนเต็มเป็นตัวชี้ และในทางกลับกัน หากเห็นคำศัพท์ใหม่ “ดัชนี” - ไม่ต้องตกใจ! นี่เป็นประเภทข้อมูลด้วย แต่เราจะไม่ดำเนินการในเร็วๆ นี้ ไวยากรณ์ที่นี่เหมือนกับของตัวดำเนินการที่กล่าวถึงก่อนหน้านี้:

พิมพ์ตีความใหม่_หล่อ< พิมพ์> (วัตถุ);

dynamic_cast- ใช้สำหรับการแปลงประเภทไดนามิก ใช้ตัวชี้หรือการอ้างอิง ไวยากรณ์:

พิมพ์พลวัต _หล่อ< พิมพ์> (วัตถุ);

อักขระควบคุม

คุณคุ้นเคยกับ "อักขระควบคุม" เหล่านี้บางส่วนแล้ว (เช่น ด้วย \n). ทั้งหมดเริ่มต้นด้วยแบ็กสแลชและล้อมรอบด้วยเครื่องหมายคำพูดคู่ด้วย

ภาพ

รหัสเลขฐานสิบหก

ชื่อ

เสียงบี๊บ

ย้อนกลับไปหนึ่งก้าว

การแปลหน้า (รูปแบบ)

การแปลบรรทัด

การรับรถคืน

การจัดตารางแนวนอน

แท็บแนวตั้ง

ข้อมูลทั้งหมดในภาษา C มีประเภทของตัวเอง ตัวแปรบางประเภทใช้พื้นที่ในหน่วยความจำบางส่วน ซึ่งจะแตกต่างกันไปขึ้นอยู่กับประเภท ในภาษา C ไม่มีการกำหนดจำนวนหน่วยความจำที่ชัดเจนให้กับบางประเภท สิ่งนี้มอบให้กับการใช้งานคอมไพเลอร์เฉพาะสำหรับแพลตฟอร์มเฉพาะ ยกตัวอย่างตัวแปรเช่น ภายใน ในคอมไพเลอร์ตัวหนึ่งสามารถครอบครองหน่วยความจำได้ 16 บิตในอีก 32 บิตในหนึ่งในสาม - 8 บิต ทุกอย่างถูกกำหนดโดยคอมไพเลอร์เฉพาะ จริงอยู่ที่ทุกคนมุ่งมั่นที่จะทำให้เป็นสากลและโดยพื้นฐานแล้วในคอมไพเลอร์ส่วนใหญ่ก็เป็นประเภทนี้ ภายใน ตัวอย่างเช่นใช้เวลา 2 ไบต์และประเภท ถ่าน - หนึ่ง.

เมื่อเร็ว ๆ นี้ฉันเป็นคนโง่เล็กน้อยฉันจำไม่ได้ว่าประเภทหนึ่งใช้ไปกี่ไบต์ สองเท่า วี AVR-GCC- โดยทั่วไป เมื่อเขียนโปรแกรมคอนโทรลเลอร์ คุณจะทำงานกับประเภทจำนวนเต็ม เช่น ภายใน และ ถ่าน และคุณมักจะไม่หันไปใช้ประเภทจุดลอยตัวเนื่องจากการใช้ทรัพยากร

ดังนั้นในอนาคตฉันจะทิ้งคำเตือนไว้ที่นี่โดยระบุขนาดของหน่วยความจำที่ประเภทข้อมูลสำหรับคอมไพเลอร์ AVR-GCC และช่วงของการเปลี่ยนแปลงในตัวแปรประเภทนี้

ชนิดข้อมูลในภาษา C สำหรับคอมไพเลอร์ AVR-GCC

พิมพ์ ขนาดใน
ไบต์ (บิต)
เปลี่ยนช่วงเวลา
ถ่าน 1 (8) -128 .. 127
ถ่านที่ไม่ได้ลงนาม 1 (8) 0 .. 255
ถ่านที่ลงนาม 1 (8) -128 .. 127
ภายใน 2 (16) -32768 .. 32767
int ที่ไม่ได้ลงนาม 2 (16) 0 .. 65535
ลงนามใน 2 (16) -32768 .. 32767
สั้น ๆ 2 (16) -32768 .. 32767
int สั้นที่ไม่ได้ลงนาม 2 (16) 0 .. 65535
ลงนามสั้น int 2 (16) -32768 .. 32767
ยาว 4 (32) -2147483648 .. 2147483647
int ยาวที่ไม่ได้ลงนาม 4 (32) 0 .. 4294967295
ลงนาม int ยาว 4 (32) -2147483648 .. 2147483647
ลอย 4 (32) 3.4E-38 .. 3.4E+38
สองเท่า 4 (32) 3.4E-38 .. 3.4E+38
ยาวสองเท่า 10 (80) 3.4E-4932 .. 3.4E+4932

บันทึก

ประเภทการใช้งาน สองเท่า AVR-GCC เบี่ยงเบนไปจากมาตรฐาน ตามมาตรฐาน สองเท่าครอบครอง 64 บิต ใน AVR-GCC ตัวแปรประเภทนี้จะใช้พื้นที่ 32 บิต ดังนั้น จึงเทียบเท่ากับตัวแปรที่มีประเภท ลอย!

นอกจากนี้ ไลบรารี AVR-GCC ยังแนะนำอนุพันธ์ประเภทมาตรฐานหลายประเภทอีกด้วย มีอธิบายไว้ในไฟล์ stdint.h - อาจทำเพื่อปรับปรุงความชัดเจนและลดข้อความของโปรแกรม (เร่งการเขียน :)) นี่คือแผ่นมาตรฐาน:

ประเภทที่ได้มาจากประเภทมาตรฐานในภาษา C สำหรับคอมไพเลอร์ AVR-GCC

ประเภทที่ได้รับ ประเภทมาตรฐาน
int8_t ถ่านที่ลงนาม
uint8_t ถ่านที่ไม่ได้ลงนาม
int16_t ลงนามใน
uint16_t int ที่ไม่ได้ลงนาม
int32_t ลงนาม int ยาว
uint32_t int ยาวที่ไม่ได้ลงนาม
int64_t ลงนามยาวยาว int
uint64_t int ยาว ไม่ได้ลงนาม

ประเภทโมฆะ

มีอีกประเภทหนึ่งในภาษา C - ประเภท เป็นโมฆะ . เป็นโมฆะ ใช้เพื่อระบุว่าฟังก์ชันไม่ส่งคืนผลลัพธ์ใดๆ หรือไม่รับพารามิเตอร์ใดๆ เป็นอินพุต ประเภทนี้ไม่ได้ใช้ในการประกาศตัวแปร จึงไม่กินพื้นที่หน่วยความจำ

อัปเดตครั้งล่าสุด: 17/09/2017

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

    boole : ประเภทบูลีน สามารถรับค่าใดค่าหนึ่งจากสองค่าได้: จริงและเท็จ รอยเท้าหน่วยความจำสำหรับประเภทนี้ไม่ได้กำหนดไว้อย่างแม่นยำ

    char : แสดงถึงอักขระ ASCII ตัวเดียว ใช้พื้นที่ 1 ไบต์ (8 บิต) ในหน่วยความจำ สามารถเก็บค่าใดๆ ได้ตั้งแต่ -128 ถึง 127 หรือตั้งแต่ 0 ถึง 255

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

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

    wchar_t : แสดงถึงอักขระแบบกว้าง บน Windows จะใช้หน่วยความจำ 2 ไบต์ (16 บิต) บน Linux จะใช้ 4 ไบต์ (32 บิต) สามารถเก็บค่าใดๆ ได้ตั้งแต่ 0 ถึง 65,535 (สำหรับ 2 ไบต์) หรือตั้งแต่ 0 ถึง 4,294,967,295 (สำหรับ 4 ไบต์)

    char16_t : แสดงถึงอักขระ Unicode ตัวเดียว ใช้พื้นที่ 2 ไบต์ (16 บิต) ในหน่วยความจำ สามารถเก็บค่าใดๆ ได้ตั้งแต่ 0 ถึง 65,535

    char32_t : แสดงถึงอักขระ Unicode ตัวเดียว ครอบครองหน่วยความจำ 4 ไบต์ (32 บิต) สามารถเก็บค่าใดๆ ได้ตั้งแต่ 0 ถึง 4,294,967,295

    short : แทนจำนวนเต็มในช่วง –32768 ถึง 32767 ใช้หน่วยความจำ 2 ไบต์ (16 บิต)

    ประเภทนี้ยังมีคำพ้องความหมาย short int, signed short int, signed short

    unsigned short: แทนจำนวนเต็มในช่วง 0 ถึง 65535 ใช้หน่วยความจำ 2 ไบต์ (16 บิต)

    ประเภทนี้มีคำพ้องความหมาย unsigned short int

    int: หมายถึงจำนวนเต็ม ขึ้นอยู่กับสถาปัตยกรรมโปรเซสเซอร์ อาจมีขนาด 2 ไบต์ (16 บิต) หรือ 4 ไบต์ (32 บิต) ช่วงของค่าขีดจำกัดอาจแตกต่างกันตั้งแต่ –32768 ถึง 32767 (มี 2 ไบต์) หรือตั้งแต่ −2,147,483,648 ถึง 2,147,483,647 (มี 4 ไบต์) แต่ทั้งนี้ขนาดต้องมากกว่าหรือเท่ากับขนาดของแบบสั้นและน้อยกว่าหรือเท่ากับขนาดของแบบยาว

    ประเภทนี้มีคำพ้องความหมาย signed int และ signed

    unsigned int : แสดงถึงจำนวนเต็มบวก ขึ้นอยู่กับสถาปัตยกรรมโปรเซสเซอร์ อาจใช้พื้นที่ 2 ไบต์ (16 บิต) หรือ 4 ไบต์ (32 บิต) และด้วยเหตุนี้ ช่วงของค่าขีดจำกัดอาจแตกต่างกันไป: ตั้งแต่ 0 ถึง 65535 (สำหรับ 2 ไบต์) หรือจาก 0 ถึง 4,294,967,295 (สำหรับ 4 ไบต์)

    unsigned สามารถใช้เป็นคำพ้องสำหรับประเภทนี้ได้

    long : แสดงถึงจำนวนเต็มในช่วง −2,147,483,648 ถึง 2,147,483,647 ใช้พื้นที่หน่วยความจำ 4 ไบต์ (32 บิต)

    ประเภทนี้มีคำพ้องความหมาย long int , signed long int และ signed long

    unsigned long: แทนจำนวนเต็มในช่วง 0 ถึง 4,294,967,295 ใช้พื้นที่หน่วยความจำ 4 ไบต์ (32 บิต)

    มีคำพ้องความหมาย long int ที่ไม่ได้ลงนาม

    long long: แสดงถึงจำนวนเต็มในช่วง −9,223,372,036,854,775,808 ถึง +9,223,372,036,854,775,807 โดยทั่วไปจะใช้หน่วยความจำ 8 ไบต์ (64 บิต)

    มีคำพ้องความหมาย long long int , ลงนาม long long int และลงนาม long long

    unsigned long long : แทนจำนวนเต็มในช่วง 0 ถึง 18,446,744,073,709,551,615 โดยทั่วไป 8 ไบต์ (64 บิต) ในหน่วยความจำ

    มีคำพ้องความหมายที่ไม่ได้ลงนาม long long int

    float : แสดงถึงจำนวนจริงจุดลอยตัวที่มีความแม่นยำเดียวในช่วง +/- 3.4E-38 ถึง 3.4E+38 ครอบครองหน่วยความจำ 4 ไบต์ (32 บิต)

    double : แทนจำนวนจริงจุดลอยตัวที่มีความแม่นยำสองเท่าในช่วง +/- 1.7E-308 ถึง 1.7E+308 ครอบครองหน่วยความจำ 8 ไบต์ (64 บิต)

    long double : แสดงถึงจำนวนจริงจุดลอยตัวที่มีความแม่นยำสองเท่าอย่างน้อย 8 ไบต์ (64 บิต) ช่วงของค่าที่ถูกต้องอาจแตกต่างกันไปขึ้นอยู่กับขนาดของหน่วยความจำที่ถูกครอบครอง

    void : พิมพ์โดยไม่มีค่า

ดังนั้น ชนิดข้อมูลทั้งหมดยกเว้นโมฆะสามารถแบ่งออกเป็นสามกลุ่ม: อักขระ (char, wchar_t, char16_t, char32_t), จำนวนเต็ม (short, int, long, long long) และประเภทตัวเลขทศนิยม (float, double, long double)

ประเภทตัวละคร

ประเภทที่ใช้แทนอักขระในแอปพลิเคชัน ได้แก่ char, wchar_t, char16_t และ char32_t

มากำหนดตัวแปรหลายตัวกัน:

ถ่าน c = "d"; wchar_t d="ค";

ตัวแปรถ่านจะใช้ค่าเป็นอักขระหนึ่งตัวในเครื่องหมายคำพูดเดี่ยว: char c ="d" คุณยังสามารถกำหนดตัวเลขจากช่วงที่ระบุด้านบนในรายการ: char c = 120 ในกรณีนี้ ค่าของตัวแปร c จะเป็นอักขระที่มีรหัส 120 ในตารางอักขระ ASCII

ควรพิจารณาว่าหากต้องการส่งออกอักขระ wchar_t ไปยังคอนโซล คุณควรใช้ไม่ใช่ std::cout แต่เป็นสตรีม std::wcout:

#รวม int main() ( char a = "H"; wchar_t b = "e"; std::wcout<< a << b << "\n"; return 0; }

ในกรณีนี้ สตรีม std::wcout สามารถทำงานกับทั้ง char และ wchar_t และสตรีม std::cout สำหรับตัวแปร wchar_t จะส่งออกรหัสตัวเลขแทนที่จะเป็นอักขระ

มาตรฐาน C++11 ได้เพิ่มประเภท char16_t และ char32_t ซึ่งเน้นไปที่การใช้ Unicode อย่างไรก็ตาม เธรดสำหรับการทำงานกับประเภทเหล่านี้ยังไม่ได้ถูกนำมาใช้ในระดับระบบปฏิบัติการ ดังนั้น หากคุณต้องการแสดงค่าของตัวแปรประเภทเหล่านี้บนคอนโซล คุณจะต้องแปลงตัวแปรเป็นประเภท char หรือ wchar_t:

#รวม int main() ( char a = "H"; wchar_t b = "e"; char16_t c = "l"; char32_t d = "o"; std::cout<< a << (char)b << (char)c << (char)d << "\n"; return 0; }

ในกรณีนี้เมื่อส่งออกตัวแปรจะนำหน้าด้วยการดำเนินการแบบคาสต์เป็นประเภทถ่าน - (ถ่าน) เนื่องจากค่าของตัวแปร b, c และ d จะถูกแปลงเป็นประเภทถ่านและสามารถส่งออกเป็น คอนโซลโดยใช้ std::cout stream

ประเภทจำนวนเต็ม

ประเภทจำนวนเต็มจะแสดงตามประเภทต่อไปนี้: short, unsigned short, int, unsigned int, long, unsigned long, long long และ unsigned long long:

สั้น = -10; สั้นที่ไม่ได้ลงนาม b= 10; อินท์ค = -30; int d = 60 ที่ไม่ได้ลงนาม; ยาว e = -170; ยาวที่ไม่ได้ลงนาม f = 45; ยาวยาว g = 89;

ประเภทของจำนวนจุดลอยตัว

ประเภทจำนวนจุดลอยตัวและเศษส่วนจะแสดงด้วยจำนวนทศนิยม สอง และคู่ยาว:

ลอยตัว = -10.45; ดับเบิ้ล ข = 0.00105; ยาวสองเท่า c = 30.890045;

ขนาดชนิดข้อมูล

รายการด้านบนแสดงขนาดที่ใช้ในหน่วยความจำแต่ละประเภท อย่างไรก็ตาม เป็นที่น่าสังเกตว่านักพัฒนาคอมไพเลอร์สามารถเลือกขนาดจำกัดสำหรับประเภทได้อย่างอิสระ โดยขึ้นอยู่กับความสามารถด้านฮาร์ดแวร์ของคอมพิวเตอร์ มาตรฐานจะกำหนดเฉพาะค่าขั้นต่ำที่ควรจะเป็นเท่านั้น ตัวอย่างเช่น สำหรับประเภท int และ short ค่าต่ำสุดคือ 16 บิต สำหรับประเภทยาว - 32 บิต สำหรับประเภท long double ในกรณีนี้ขนาดของประเภทยาวจะต้องไม่น้อยกว่าขนาดของประเภท int และขนาดของประเภท int จะต้องไม่น้อยกว่าขนาดของประเภทสั้นและขนาดของประเภทคู่ยาวจะต้อง จะมากกว่าสองเท่า ตัวอย่างเช่น คอมไพเลอร์ g++ สำหรับ Windows ใช้ 12 ไบต์สำหรับ long doubles และคอมไพเลอร์ที่สร้างไว้ใน Visual Studio และยังทำงานภายใต้ Windows จะใช้ 8 ไบต์สำหรับ long doubles นั่นคือแม้จะอยู่ในแพลตฟอร์มเดียวกัน คอมไพเลอร์ที่แตกต่างกันอาจมีแนวทางที่แตกต่างกันในการกำหนดขนาดของข้อมูลบางประเภท แต่โดยทั่วไป จะใช้ขนาดที่ระบุไว้ข้างต้นเมื่ออธิบายชนิดข้อมูล

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

#รวม int main() ( เลขคู่ยาว = 2; std::cout<< "sizeof(number) =" << sizeof(number); return 0; }

เอาต์พุตคอนโซลเมื่อคอมไพล์ใน g++:

ขนาดของ(จำนวน) = 12

ในขณะเดียวกัน เมื่อกำหนดตัวแปร สิ่งสำคัญคือต้องเข้าใจว่าค่าของตัวแปรไม่ควรเกินขีดจำกัดที่ระบุไว้สำหรับประเภทของตัวแปร ตัวอย่างเช่น:

หมายเลขสั้นที่ไม่ได้ลงนาม = -65535;

เมื่อคอมไพเลอร์โปรแกรมด้วยบรรทัดนี้คอมไพเลอร์ G++ จะสร้างข้อผิดพลาดที่ระบุว่าค่า -65535 ไม่อยู่ในช่วงของค่าที่ถูกต้องสำหรับประเภทสั้นที่ไม่ได้ลงนามและจะถูกตัดทอน

ใน Visual Studio การคอมไพล์สามารถดำเนินการได้โดยไม่มีข้อผิดพลาด แต่ตัวแปรตัวเลขจะได้รับค่า 2 - ผลลัพธ์ของการแปลงตัวเลข -65535 เป็นประเภทสั้นที่ไม่ได้ลงนาม นั่นคืออีกครั้งผลลัพธ์จะไม่เป็นไปตามที่คาดหวังไว้ ค่าของตัวแปรเป็นเพียงชุดของบิตในหน่วยความจำที่ถูกตีความตามประเภทเฉพาะ และสำหรับประเภทที่แตกต่างกัน ชุดบิตเดียวกันสามารถตีความต่างกันได้ ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องพิจารณาช่วงค่าสำหรับประเภทที่กำหนดเมื่อกำหนดค่าให้กับตัวแปร

ตัวระบุอัตโนมัติ

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

หมายเลขอัตโนมัติ = 5;

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

ในการเขียนโปรแกรมประเภทข้อมูลคือชุดของสองชุด: ชุดของค่าและชุดการดำเนินการที่สามารถนำไปใช้กับชุดเหล่านั้นได้ ตัวอย่างเช่น การดำเนินการของการบวก (+) การคูณ (*) การหารจำนวนเต็ม (/) เศษ (%) และการลบ (-) สามารถนำไปใช้กับชนิดข้อมูลจำนวนเต็มที่ไม่ติดลบซึ่งประกอบด้วยชุดจำกัดของจำนวนธรรมชาติ

โดยทั่วไปภาษาการเขียนโปรแกรมจะมีชุดของประเภทข้อมูลดั้งเดิม ซึ่งเป็นประเภทที่ภาษาการเขียนโปรแกรมจัดให้เป็นหน่วยพื้นฐานที่มีอยู่แล้วภายใน ในภาษา C++ ผู้สร้างภาษาจะเรียกประเภทดังกล่าวว่าประเภทพื้นฐาน ประเภทพื้นฐานในภาษา C++ คือ:

  • บูลีน(บูล);
  • ตัวละคร (เช่น ถ่าน);
  • int (เช่น int);
  • จุดลอยตัว (เช่น ลอย);
  • การแจงนับ (กำหนดโดยโปรแกรมเมอร์);
  • เป็นโมฆะ

นอกเหนือจากรายการดังกล่าวแล้ว ยังมีการสร้างประเภทต่อไปนี้:

  • สาธิต (เช่น int*);
  • อาร์เรย์ (เช่น ถ่าน);
  • การอ้างอิง (เช่น double&);
  • โครงสร้างอื่นๆ

เรามาดูแนวคิดของตัวอักษรกันดีกว่า (เช่น 1, 2.4F, 25e-4, 'a' ฯลฯ): ตัวอักษรคือรายการในซอร์สโค้ดของโปรแกรมที่แสดงถึงค่าคงที่ กล่าวอีกนัยหนึ่ง ตัวอักษรเป็นเพียงการแสดงวัตถุ (ค่า) บางประเภทในโค้ดโปรแกรม C++ มีความสามารถในการเขียนค่าจำนวนเต็ม จุดลอยตัว อักขระ บูลีน และค่าสตริง

ตัวอักษรชนิดจำนวนเต็มสามารถเขียนได้เป็น:

  • ระบบตัวเลขที่ 10 เช่น 1205 ;
  • ระบบตัวเลขที่ 8 ในรูปแบบ 0 + หมายเลข ตัวอย่างเช่น 0142;
  • ระบบตัวเลขที่ 16 ในรูปแบบ 0x + ตัวเลข ตัวอย่างเช่น 0x2F

24, 030, 0x18 - ทั้งหมดนี้เป็นบันทึกที่มีหมายเลขเดียวกันในระบบตัวเลขที่ต่างกัน
หากต้องการเขียนตัวเลขทศนิยม ให้ใช้เครื่องหมายจุด: 0.1, .5, 4 - อย่างใดอย่างหนึ่ง
สัญกรณ์เลขชี้กำลัง - 25e-100 ไม่ควรมีช่องว่างในบันทึกดังกล่าว

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

ตัวอย่าง int Const = 3; // ในที่นี้ const คือตัวระบุ // int คือประเภทฐาน // ตัวอย่างคือชื่อของตัวแปร // = 3 - ตัวเริ่มต้น

ชื่อตัวแปรคือลำดับอักขระที่ประกอบด้วยตัวอักษรละติน (ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ตัวเลข และ/หรือขีดล่าง แต่อักขระตัวแรกไม่สามารถเป็นตัวเลขได้ ควรเลือกชื่อตัวแปรเพื่อให้เดาได้ง่ายเสมอว่าเก็บอะไรไว้ เช่น "monthPayment" ในบันทึกย่อและในทางปฏิบัติ เราจะใช้สัญลักษณ์ CamelCase เป็นกฎสำหรับการบันทึกตัวแปร ชื่อตัวแปรต้องไม่ตรงกับคำที่สงวนไว้ในภาษา ตัวอย่างของคำดังกล่าว ได้แก่ if, while, function, goto, switch เป็นต้น

นอกจากชื่อตัวแปรแล้ว ผู้ประกาศยังสามารถมีอักขระเพิ่มเติมได้:

  • * - ตัวชี้; ก่อนชื่อ;
  • *const - ตัวชี้คงที่; ก่อนชื่อ;
  • & - ลิงค์; ก่อนชื่อ;
  • - อาร์เรย์; หลังชื่อ;
  • () - การทำงาน; หลังชื่อ

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

ตัวระบุระบุคุณลักษณะเพิ่มเติมนอกเหนือจากประเภท ตัวระบุ const ที่ให้ไว้ในตัวอย่างช่วยให้คุณสามารถห้ามการเปลี่ยนแปลงค่าของตัวแปรในภายหลังได้ ตัวแปรที่ไม่เปลี่ยนรูปดังกล่าวเรียกว่าค่าคงที่หรือค่าคงที่

การประกาศค่าคงที่โดยไม่กำหนดค่าเริ่มต้นจะไม่ทำงานด้วยเหตุผลเชิงตรรกะ:

ค่าคงที่ EMPTY_CONST; // ข้อผิดพลาด ตัวแปรคงที่ไม่ได้เตรียมใช้งาน const int ตัวอย่าง = 2; // ค่าคงที่ด้วยค่า 2 ตัวอย่าง = 3; // ข้อผิดพลาด พยายามกำหนดค่าให้กับตัวแปรคงที่

เมื่อตั้งชื่อค่าคงที่ เป็นเรื่องปกติที่จะใช้เฉพาะตัวพิมพ์ใหญ่เท่านั้น โดยแยกคำด้วยอักขระขีดล่าง

ชนิดข้อมูลพื้นฐานในภาษา C++

ในขณะที่ตรวจสอบแต่ละประเภทผู้อ่านไม่ควรลืมเกี่ยวกับคำจำกัดความของประเภทข้อมูล

1. ประเภทจำนวนเต็ม (char, short (int), int, long (int), long long)

จากชื่อมันง่ายที่จะเข้าใจว่าชุดของค่าประกอบด้วยจำนวนเต็ม นอกจากนี้ชุดค่าของแต่ละประเภทที่ระบุไว้สามารถลงนามหรือไม่ได้ลงนามได้ จำนวนองค์ประกอบที่มีอยู่ในชุดขึ้นอยู่กับขนาดของหน่วยความจำที่ใช้ในการจัดเก็บค่าของประเภทนั้น ตัวอย่างเช่น สำหรับตัวแปรประเภท char จะมีการจัดสรรหน่วยความจำ 1 ไบต์ ดังนั้นองค์ประกอบทั้งหมดจะเป็น:

  • 2 8N = 2 8 * 1 = 256 โดยที่ N คือขนาดของหน่วยความจำเป็นไบต์เพื่อเก็บค่า

ในกรณีนี้ ช่วงของจำนวนเต็มที่ใช้ได้จะเป็นดังนี้:

  • - สำหรับถ่านที่ไม่ได้ลงนาม
  • [-128..127] - สำหรับถ่านที่ลงนามแล้ว

ตามค่าเริ่มต้น ตัวแปรจำนวนเต็มจะถือว่าลงนามแล้ว เพื่อระบุในโค้ดว่าตัวแปรจะต้องไม่ได้ลงนาม คุณลักษณะที่ลงนามจะถูกเพิ่มลงในประเภทฐานทางด้านซ้าย เช่น ไม่ได้ลงนาม:

ค่ายาวที่ไม่ได้ลงนาม // ระบุประเภทที่ไม่ได้ลงนามจำนวนเต็ม (ยาว)

ประเภทที่ระบุไว้จะแตกต่างกันเพียงขนาดของหน่วยความจำที่จำเป็นสำหรับการจัดเก็บเท่านั้น เนื่องจากภาษา C++ ค่อนข้างขึ้นอยู่กับเครื่อง มาตรฐานภาษาจึงรับประกันเงื่อนไขต่อไปนี้เท่านั้น:

  • 1 = ขนาดตัวอักษร ≤ ขนาดสั้น ≤ ขนาด int ≤ ขนาดยาว

โดยทั่วไปขนาดของประเภทจะเป็นดังนี้: char - 1, short - 2, int - 4, long -8, long long - 8 ไบต์

คุณสามารถดำเนินการทางคณิตศาสตร์ด้วยค่าประเภทจำนวนเต็ม: +, -, *, /, %; การดำเนินการเปรียบเทียบ: ==, !=,<=, <, >- การดำเนินการบิต: &, |, xor,<<, >>.
การดำเนินการส่วนใหญ่ เช่น การบวก การคูณ การลบ และการเปรียบเทียบ นั้นง่ายต่อการเข้าใจ บางครั้ง หลังจากดำเนินการทางคณิตศาสตร์แล้ว ผลลัพธ์อาจอยู่นอกช่วงของค่า ในกรณีนี้โปรแกรมจะสร้างข้อผิดพลาด
การหารจำนวนเต็ม (/) ค้นหาส่วนของจำนวนเต็มของจำนวนเต็มหนึ่งหารด้วยอีกจำนวนหนึ่ง ตัวอย่างเช่น:

  • 6 / 4 = 1;
  • 2 / 5 = 0;
  • 8 / 2 = 4.

สัญลักษณ์เปอร์เซ็นต์ (%) แสดงถึงการดำเนินการหาเศษที่เหลือของการหารจำนวนเต็มสองตัว:

  • 6 % 4 = 2;
  • 10 % 3 = 1.

การดำเนินการที่เข้าใจยากกว่านั้นคือการดำเนินการแบบบิต: & (AND), | (OR), xor (เฉพาะ OR)<< (побитовый сдвиг влево), >> (เลื่อนไปทางขวาระดับบิต)

การดำเนินการบิต AND, OR และ XOR ใช้การดำเนินการเชิงตรรกะที่สอดคล้องกันกับข้อมูลแต่ละบิต:

  • 1 10 = 01 2
  • 3 10 = 11 2
  • 1 10 & 3 10 = 01 2 & 11 2 = 01 2
  • 1 10 | 3 10 = 01 2 | 11 2 = 11 2
  • 1 10 x หรือ 3 10 = 01 2 x หรือ 11 2 = 10 2

ในการประมวลผลภาพ จะใช้ 3 แชนเนลสำหรับสี: แดง น้ำเงิน และเขียว - บวกกับความโปร่งใสซึ่งถูกเก็บไว้ในตัวแปร int เนื่องจาก แต่ละช่องมีช่วงค่าตั้งแต่ 0 ถึง 255 ในระบบเลขฐานสิบหกค่าบางอย่างจะถูกเขียนดังนี้ 0x180013FF; จากนั้นค่า 18 16 จะสอดคล้องกับช่องสีแดง 00 16 - สีน้ำเงิน 13 16 - สีเขียว FF - ช่องอัลฟ่า (โปร่งใส) ในการเลือกช่องสัญญาณเฉพาะจากจำนวนเต็ม จะใช้ช่องที่เรียกว่า หน้ากาก โดยที่ตำแหน่งที่เราสนใจคือ F 16 หรือ 1 2 นั่นคือเพื่อเน้นค่าของช่องสีน้ำเงิน คุณต้องใช้มาสก์ เช่น ระดับบิตและ:

Int blue_channel = 0x180013FF & 0x00FF0000;

หลังจากนั้นค่าผลลัพธ์จะถูกเลื่อนไปทางขวาตามจำนวนบิตที่ต้องการ

การเลื่อนบิตจะเลื่อนตัวเลขไปทางซ้ายหรือขวาตามเลขฐานสองตามที่ระบุไว้ทางด้านขวาของการดำเนินการ ตัวอย่างเช่น หมายเลข 39 สำหรับประเภทอักขระจะเขียนในรูปแบบไบนารีดังนี้ 00100111 จากนั้น:

Char ไบนารีตัวอย่าง = 39; // 00100111 ผลลัพธ์ถ่าน = binaryExample<< 2; // сдвигаем 2 бита влево, результат: 10011100

หากตัวแปรเป็นประเภทที่ไม่ได้ลงนาม ผลลัพธ์จะเป็นหมายเลข 156 สำหรับตัวแปรที่ลงนามจะเท่ากับ -100 โปรดทราบว่าสำหรับประเภทจำนวนเต็มแบบมีเครื่องหมาย หน่วยในบิตที่สำคัญที่สุดของการแสดงบิตจะเป็นเครื่องหมายว่าตัวเลขนั้นเป็นลบ ในกรณีนี้ ค่าในรูปแบบไบนารี่ที่ประกอบด้วยค่าทั้งหมดจะสอดคล้องกับ -1 ถ้า 1 อยู่ในหลักที่มีนัยสำคัญที่สุดเท่านั้น และหลักที่เหลือเป็นศูนย์ ตัวเลขดังกล่าวจะมีค่าต่ำสุดสำหรับประเภทใดประเภทหนึ่ง: สำหรับถ่านจะเป็น -128

2. ประเภทจุดลอยตัว (ลอย, ดับเบิ้ล (ลอย))

ชุดของค่าทศนิยมเป็นเซตย่อยของจำนวนจริง แต่ไม่ใช่ทุกจำนวนจริงที่สามารถแทนค่าได้ในไบนารี่ ซึ่งบางครั้งก็นำไปสู่ข้อผิดพลาดโง่ ๆ:

ค่าลอยตัว = 0.2; ค่า == 0.2; // เกิดข้อผิดพลาด ค่าที่นี่จะไม่เท่ากับ 0.2

เมื่อทำงานกับตัวแปรจุดลอยตัว โปรแกรมเมอร์ไม่ควรใช้การทดสอบความเท่าเทียมกันหรือความไม่เท่าเทียมกัน โดยปกติจะใช้การทดสอบการตกภายในช่วงเวลาที่กำหนดแทน:

ความคุ้มค่า - 0.2< 1e-6; // ok, подбирать интервал тоже нужно осторожно

นอกเหนือจากการดำเนินการเปรียบเทียบแล้ว ประเภทจุดลอยตัวยังรองรับการดำเนินการทางคณิตศาสตร์ 4 แบบที่สอดคล้องกับการดำเนินการทางคณิตศาสตร์ที่มีจำนวนจริงอย่างสมบูรณ์

3. ประเภทบูลีน (ตรรกะ) (บูล)

ประกอบด้วยสองค่าเท่านั้น: จริง (จริง) และเท็จ (เท็จ) ในการทำงานกับตัวแปรประเภทนี้ จะใช้การดำเนินการเชิงตรรกะ: ! (NOT), == (ความเท่าเทียมกัน), != (ความไม่เท่าเทียมกัน), && (ตรรกะ AND), || (ตรรกะหรือ) ผลลัพธ์ของการดำเนินการแต่ละครั้งสามารถพบได้ในตารางความจริงที่เกี่ยวข้อง ตัวอย่างเช่น:

XY XOR0 0 0 0 1 1 1 0 1 1 1 0

4. ประเภทอักขระ (char, wchar_t)

ประเภทอักขระไม่ได้เป็นเพียงประเภทจำนวนเต็ม (โดยปกติประเภทนี้จะเรียกว่าไบต์) แต่ยังเป็นประเภทอักขระด้วย โดยจัดเก็บหมายเลขอักขระจากตารางเป็นอักขระ ASCII ตัวอย่างเช่น รหัส 0x41 สอดคล้องกับอักขระ 'A' และ 0x71 - 't'

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

5.1. อาร์เรย์

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

Int myArray; // อาร์เรย์ของ 5 องค์ประกอบประเภทจำนวนเต็ม

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

อัตราต่อรอง = (1, 3, 7, 9, 11); // อาร์เรย์เริ่มต้นด้วยค่า 5 ค่า

ในการเข้าถึงค่าเฉพาะในอาร์เรย์ (องค์ประกอบอาร์เรย์) ให้ใช้การดำเนินการเข้าถึงดัชนี () ระบุหมายเลของค์ประกอบ (ตัวเลขเริ่มต้นจาก 0) ตัวอย่างเช่น:

ราคาต่อรอง; // เข้าถึงองค์ประกอบแรกของอาร์เรย์ ส่งกลับค่า 1 อัตราต่อรอง; // เข้าถึงองค์ประกอบที่สาม ส่งกลับค่า 7 อัตราต่อรอง = 13; // กำหนดค่าใหม่ให้กับองค์ประกอบที่ 5 ของอัตราต่อรองอาร์เรย์ // ข้อผิดพลาดในการเข้าถึง

5.3. สตริง

ในการเขียนสตริง โปรแกรมเมอร์ใช้แนวคิดที่ว่าสตริงนั้นเป็นชุดอักขระ (อาร์เรย์) ตามลำดับ หากต้องการระบุจุดสิ้นสุดของบรรทัด ให้ใช้อักขระพิเศษที่ปลายบรรทัด: '\0' อักขระพิเศษเหล่านี้ ซึ่งประกอบด้วยแบ็กสแลชและอักขระระบุ เรียกว่าอักขระควบคุมหรืออักขระหลีก นอกจากนี้ยังมี '\n' - จุดเริ่มต้นของบรรทัดใหม่ '\t' - การจัดตาราง ในการเขียนแบ็กสแลชในสตริง จะใช้ Escape - วางสแลชอีกอันไว้หน้าเครื่องหมาย: '\' นอกจากนี้ การ Escape ยังใช้ในการเขียนเครื่องหมายคำพูดอีกด้วย

มาสร้างตัวแปรสตริงกัน:

ตัวอักษร textExample = ('T', 'e', ​​​​'s', 't', '\0'); // เขียนสตริง "ทดสอบ"

มีสัญกรณ์แบบง่ายสำหรับการเริ่มต้นสตริง:

Char textExample = “ทดสอบ”; // ตัวอักษรตัวสุดท้ายไม่ได้เขียน แต่ขนาดยังคงเป็น 5

นี่คือประเภทข้อมูลที่มีประโยชน์อีกประเภทหนึ่ง - สตริง โดยไม่ต้องลงรายละเอียด สตริง
ประเภทนี้สามารถเพิ่มได้ เช่น:

สตริงสวัสดี = "สวัสดี"; ชื่อสตริง = "สูงสุด!"; สตริง hello_name = สวัสดี + ชื่อ; // รับสตริง "Hello, Max!"

6. ลิงค์

Int = 2; // ตัวแปร "a" ชี้ไปที่ค่า 2 int &b = a; // ตัวแปร “b” ชี้ไปที่ตำแหน่งเดียวกับ “a” b = 4; // โดยการเปลี่ยนค่า b โปรแกรมเมอร์จะเปลี่ยนค่าของ a ตอนนี้ a = 4 int &c = 4; // ข้อผิดพลาด คุณไม่สามารถทำเช่นนี้ได้เพราะว่า การอ้างอิงไม่สามารถกำหนดค่าได้

7. ดัชนี

เพื่อให้เข้าใจถึงประเภทข้อมูลนี้ คุณต้องจำไว้ว่าค่าหลายค่าประเภทนี้คือที่อยู่ของเซลล์หน่วยความจำที่ข้อมูลเริ่มต้น ตัวชี้ยังรองรับการดำเนินการบวก (+) การลบ (-) และการอ้างอิง (*)

ที่อยู่ 0x0 หมายความว่าตัวชี้ว่างเปล่า เช่น ไม่ได้ชี้ไปที่ข้อมูลใดๆ ที่อยู่นี้มีตัวอักษรของตัวเอง - NULL:

Int *nullPtr = โมฆะ; // ตัวชี้ null

คุณสามารถเพิ่มและลบที่อยู่ด้วยจำนวนเต็มหรือที่อยู่อื่นได้
ย้ายหน่วยความจำที่มีอยู่ในโปรแกรม

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

ค่า IntInMemory = 2; // ตั้งค่าตัวแปรประเภทจำนวนเต็ม int *somePtr = // คัดลอกที่อยู่ของตัวแปรที่นี่ & - ส่งคืนที่อยู่ของตัวแปร somePtr; // ที่อยู่ของเซลล์หน่วยความจำ เช่น 0x2F *somePtr; // ค่าจะถูกเก็บไว้ใน 4 เซลล์: 0x2F, 0x30, 0x31 และ 0x32

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

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

8. การโอน

การแจงนับเป็นประเภทพื้นฐานเดียวที่กำหนดโดยโปรแกรมเมอร์ โดยทั่วไปแล้ว การแจงนับคือชุดลำดับของค่าคงที่จำนวนเต็มที่มีชื่อ โดยชื่อของการแจงนับจะเป็นประเภทฐาน

สีอีนัม (แดง, น้ำเงิน, เขียว);

ตามค่าเริ่มต้น RED = 0, BLUE = 1, GREEN = 2 ดังนั้นจึงสามารถเปรียบเทียบค่าระหว่างกันได้ เช่น สีแดง< BLUE < GREEN. Программист при объявлении перечисления может самостоятельно задать значения каждой из констант:

การเข้าถึง Enum (อ่าน = 1, เขียน = 2, EXEC = 4);

มักจะสะดวกในการใช้การแจงนับที่มีค่าเป็นกำลังสองเพราะว่า ในการแทนค่าไบนารี่ ตัวเลขที่เป็นกำลังของ 2 จะประกอบด้วย 1 และศูนย์ ตัวอย่างเช่น:

8 10 = 00001000 2

ผลลัพธ์ของการบวกตัวเลขเหล่านี้เข้าด้วยกันจะระบุอย่างชัดเจนเสมอว่าตัวเลขใดที่ถูกบวก:

37 10 = 00100101 2 = 00000001 2 + 00000100 2 + 00100000 2 = 1 10 + 4 10 + 32 10

เป็นโมฆะ

ในทางวากยสัมพันธ์ ประเภท void เป็นของประเภทพื้นฐาน แต่สามารถใช้ได้เฉพาะเป็นส่วนหนึ่งของประเภทที่ซับซ้อนมากขึ้นเท่านั้น เนื่องจาก ไม่มีวัตถุประเภทโมฆะ โดยทั่วไปแล้ว ประเภทนี้ใช้เพื่อระบุว่าฟังก์ชันไม่มีค่าตอบแทนหรือเป็นประเภทพื้นฐานของตัวชี้ไปยังวัตถุประเภทที่ไม่ได้กำหนด:

วัตถุเป็นโมฆะ; // ข้อผิดพลาด ไม่มีวัตถุประเภท void void // ข้อผิดพลาด ไม่มีการอ้างอิงถึง void void *ptr; // ตกลง เก็บตัวชี้ไปยังประเภทที่ไม่รู้จัก

บ่อยครั้งที่เราจะใช้ void โดยเฉพาะเพื่อระบุว่าฟังก์ชันไม่คืนค่าใดๆ ตัวชี้ประเภทโมฆะจะใช้เมื่อโปรแกรมเมอร์รับผิดชอบอย่างเต็มที่ต่อความสมบูรณ์ของหน่วยความจำและการคัดเลือกประเภทที่ถูกต้อง

หล่อ

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

จำนวนเต็ม = 2; ลอย ลอย = จำนวนเต็ม; // ลอยตัว = 2.0

การหล่อแบบย้อนกลับจะดำเนินการโดยที่ข้อมูลสูญหาย ดังนั้นจะเหลือเพียงส่วนจำนวนเต็มของจำนวนจุดลอยตัวเท่านั้น ส่วนที่เป็นเศษส่วนจะหายไป

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

ค่า Int = (int) 2.5;

การดำเนินการเอกนารีและไบนารี

การดำเนินการที่เราทำก่อนหน้านี้เรียกว่าไบนารี: ทางซ้ายและขวาของสัญลักษณ์การดำเนินการคือค่าหรือตัวแปร เช่น 2 + 3 นอกเหนือจากการดำเนินการแบบไบนารีแล้ว ภาษาโปรแกรมยังใช้การดำเนินการแบบเอกภาคที่ใช้กับตัวแปรด้วย . สามารถอยู่ทางซ้ายหรือทางขวาของตัวแปรได้ เคยพบการดำเนินการดังกล่าวหลายครั้ง - การดำเนินการยกเลิกการอ้างอิง (*) และการรับที่อยู่ของตัวแปร (&) เป็นแบบเอกเทศ ตัวดำเนินการ “++” และ “—” จะเพิ่มและลดค่าของตัวแปรจำนวนเต็ม 1 ตามลำดับ และสามารถเขียนไปทางซ้ายหรือทางขวาของตัวแปรได้

C++ ยังใช้สัญลักษณ์ชวเลขสำหรับการดำเนินการไบนารีในกรณีที่ด้านซ้ายและด้านขวาของนิพจน์มีตัวแปรเดียวกัน เช่น การดำเนินการบางอย่างจะดำเนินการกับค่าของตัวแปรและผลลัพธ์ของการดำเนินการจะถูกเก็บไว้ในตัวแปรเดียวกัน:

ก += 2; // เช่นเดียวกับ a = a + 2; ข /= 5; // เช่นเดียวกับ b = b / 5; ค &= 3; // เช่นเดียวกับ c = c & 3;