เมื่อเขียนโปรแกรมในภาษาใด ๆ คุณจำเป็นต้องใช้ตัวแปรที่แตกต่างกันในการจัดเก็บข้อมูลที่แตกต่างกัน ตัวแปรไม่มีอะไรนอกจากตำแหน่งหน่วยความจำที่สงวนไว้สำหรับจัดเก็บค่า ซึ่งหมายความว่าเมื่อคุณสร้างตัวแปร คุณจะประหยัดพื้นที่ในหน่วยความจำ
คุณสามารถจัดเก็บข้อมูลประเภทข้อมูลต่างๆ ได้ เช่น อักขระ อักขระกว้าง จำนวนเต็ม จุดลอยตัว จุดลอยตัวคู่ บูลีน ฯลฯ ระบบปฏิบัติการจะจัดสรรหน่วยความจำและตัดสินใจว่าสิ่งใดสามารถเก็บไว้ในตัวแปรได้ โดยขึ้นอยู่กับประเภทข้อมูลของตัวแปร หน่วยความจำที่สงวนไว้
ประเภทบิวท์อินดั้งเดิม
C++ มอบชุดข้อมูลในตัวและประเภทข้อมูลที่ผู้ใช้กำหนดให้กับโปรแกรมเมอร์ ตารางต่อไปนี้แสดงรายการประเภทข้อมูล C++ หลักเจ็ดประเภท:
พิมพ์ | คำสำคัญ |
---|---|
บูลีน | บูล |
อักขระ | ถ่าน |
จำนวนเต็ม | ภายใน |
จุดลอยตัว | ลอย |
จุดลอยตัวคู่ | สองเท่า |
ไร้ค่า | เป็นโมฆะ |
ตัวละครกว้าง | wchar_t |
ประเภทพื้นฐานบางประเภทสามารถแก้ไขได้โดยใช้ตัวแก้ไขประเภทนี้ตั้งแต่หนึ่งรายการขึ้นไป:
- ลงนาม
- ไม่ได้ลงนาม
- สั้น
ตารางต่อไปนี้แสดงประเภทของตัวแปร จำนวนหน่วยความจำที่ต้องใช้ในการจัดเก็บค่าในหน่วยความจำ และค่าสูงสุดและต่ำสุดที่สามารถจัดเก็บไว้ในตัวแปรดังกล่าวได้คือเท่าใด
พิมพ์ | ความกว้างบิตทั่วไป | ช่วงทั่วไป |
---|---|---|
ถ่าน | 1 ไบต์ | -127 ถึง 127 หรือ 0 ถึง 255 |
ถ่านที่ไม่ได้ลงนาม | 1 ไบต์ | 0 ถึง 255 |
ถ่านที่ลงนาม | 1 ไบต์ | -127 ถึง 127 |
ภายใน | 4ไบต์ | -2147483648 ถึง 2147483647 |
int ที่ไม่ได้ลงนาม | 4ไบต์ | 0 ถึง 4294967295 |
ลงนามใน | 4ไบต์ | -2147483648 ถึง 2147483647 |
สั้น ๆ | 2 ไบต์ | -32768 ถึง 32767 |
int สั้นที่ไม่ได้ลงนาม | พิสัย | 0 ถึง 65,535 |
ลงนามสั้น int | พิสัย | -32768 ถึง 32767 |
ยาว | 4ไบต์ | -2,147,483,648 ถึง 2,147,483,647 |
ลงนาม int ยาว | 4ไบต์ | เช่นเดียวกับ long int |
int ยาวที่ไม่ได้ลงนาม | 4ไบต์ | 0 ถึง 4,294,967,295 |
ลอย | 4ไบต์ | +/- 3.4e +/- 38 (~7 หลัก) |
สองเท่า | 8 ไบต์ | |
ยาวสองเท่า | 8 ไบต์ | +/- 1.7e +/- 308 (~15 หลัก) |
wchar_t | 2 หรือ 4 ไบต์ | 1 ตัวอักษรกว้าง |
ขนาดของตัวแปรอาจแตกต่างจากขนาดที่แสดงในตารางด้านบน ขึ้นอยู่กับคอมไพเลอร์และคอมพิวเตอร์ที่คุณใช้ ด้านล่างนี้เป็นตัวอย่างที่จะให้ขนาดข้อมูลประเภทต่างๆ ที่ถูกต้องบนคอมพิวเตอร์ของคุณ
#รวม
ตัวอย่างนี้ใช้ สิ้นสุดซึ่งแนะนำอักขระขึ้นบรรทัดใหม่หลังแต่ละบรรทัดและตัวดำเนินการ<< используется для передачи нескольких значений на экран. Мы также используем оператор ขนาดของ()เพื่อให้ได้ขนาดของข้อมูลประเภทต่างๆ
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการ มันจะสร้างผลลัพธ์ต่อไปนี้ ซึ่งอาจแตกต่างกันไปในแต่ละเครื่อง:
ขนาดของถ่าน: 1 ขนาดของ int: 4 ขนาดของ int สั้น: 2 ขนาดของ int ยาว: 4 ขนาดของลอย: 4 ขนาดของ double: 8 ขนาดของ wchar_t: 4
ประกาศ Typedef
คุณสามารถสร้างชื่อใหม่สำหรับประเภทที่มีอยู่โดยใช้ typedef ด้านล่างนี้เป็นไวยากรณ์ง่ายๆ ในการกำหนดประเภทใหม่โดยใช้ typedef:
Typedef พิมพ์ชื่อใหม่;
ตัวอย่างเช่น ข้อมูลต่อไปนี้จะบอกคอมไพเลอร์ว่า ขา เป็นอีกชื่อหนึ่งของ int:
Typedef int ฟุต;
ตอนนี้การประกาศต่อไปนี้ถูกต้องตามกฎหมายอย่างสมบูรณ์และสร้างตัวแปรจำนวนเต็มที่เรียกว่าระยะทาง:
เว้นระยะห่างฟุต
ประเภทที่ระบุไว้
ประเภทที่แจงนับประกาศชื่อประเภทที่เป็นทางเลือกและชุดของตัวระบุศูนย์หรือมากกว่าที่สามารถใช้เป็นค่าของประเภทได้ ตัวแจงนับแต่ละตัวเป็นค่าคงที่ซึ่งมีประเภทเป็นการแจงนับ การสร้างการแจงนับจำเป็นต้องใช้คำสำคัญ แจกแจง- มุมมองทั่วไปของประเภทการแจงนับ:
Enum enum-name ( รายชื่อ ) var-list;
ในที่นี้ enum-name คือชื่อของประเภท enum รายชื่อคั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่น รหัสต่อไปนี้กำหนดการแจงนับของสีที่เรียกว่าสี และตัวแปร c ของประเภทสี ในที่สุด c จะถูกกำหนดค่าเป็น "สีน้ำเงิน"
สี Enum ( แดง เขียว น้ำเงิน ) c; ค = สีน้ำเงิน;
ตามค่าเริ่มต้น ชื่อจะมีค่าเป็น 0 ชื่อที่สองมีค่าเป็น 1 และชื่อที่สามมีค่าเป็น 2 เป็นต้น แต่คุณสามารถสร้างชื่อให้เป็นค่าเฉพาะได้โดยการเพิ่มตัวเริ่มต้น ตัวอย่างเช่น ในการแจงนับต่อไปนี้ สีเขียวจะมีค่า 5
สี Enum(แดง, เขียว = 5, น้ำเงิน);
สีน้ำเงินที่นี่จะมีค่าเป็น 6 เพราะแต่ละชื่อจะมากกว่าชื่อก่อนหน้า
อัปเดตครั้งล่าสุด: 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:
#รวม
ในกรณีนี้ สตรีม std::wcout สามารถทำงานกับทั้ง char และ wchar_t และสตรีม std::cout สำหรับตัวแปร wchar_t จะส่งออกรหัสตัวเลขแทนที่จะเป็นอักขระ
มาตรฐาน C++11 ได้เพิ่มประเภท char16_t และ char32_t ซึ่งเน้นไปที่การใช้ Unicode อย่างไรก็ตาม เธรดสำหรับการทำงานกับประเภทเหล่านี้ยังไม่ได้ถูกนำมาใช้ในระดับระบบปฏิบัติการ ดังนั้น หากคุณต้องการแสดงค่าของตัวแปรประเภทเหล่านี้บนคอนโซล คุณจะต้องแปลงตัวแปรเป็นประเภท char หรือ wchar_t:
#รวม
ในกรณีนี้เมื่อส่งออกตัวแปรจะนำหน้าด้วยการดำเนินการแบบคาสต์เป็นประเภทถ่าน - (ถ่าน) เนื่องจากค่าของตัวแปร 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() ซึ่งจะคืนค่าขนาดของหน่วยความจำเป็นไบต์ที่ตัวแปรครอบครอง:
#รวม
เอาต์พุตคอนโซลเมื่อคอมไพล์ใน g++:
ขนาดของ(จำนวน) = 12
ในขณะเดียวกัน เมื่อกำหนดตัวแปร สิ่งสำคัญคือต้องเข้าใจว่าค่าของตัวแปรไม่ควรเกินขีดจำกัดที่ระบุไว้สำหรับประเภทของตัวแปร ตัวอย่างเช่น:
หมายเลขสั้นที่ไม่ได้ลงนาม = -65535;
เมื่อคอมไพเลอร์โปรแกรมด้วยบรรทัดนี้คอมไพเลอร์ G++ จะสร้างข้อผิดพลาดที่ระบุว่าค่า -65535 ไม่อยู่ในช่วงของค่าที่ถูกต้องสำหรับประเภทสั้นที่ไม่ได้ลงนามและจะถูกตัดทอน
ใน Visual Studio การคอมไพล์สามารถดำเนินการได้โดยไม่มีข้อผิดพลาด แต่ตัวแปรตัวเลขจะได้รับค่า 2 - ผลลัพธ์ของการแปลงตัวเลข -65535 เป็นประเภทสั้นที่ไม่ได้ลงนาม นั่นคืออีกครั้งผลลัพธ์จะไม่เป็นไปตามที่คาดหวังไว้ ค่าของตัวแปรเป็นเพียงชุดของบิตในหน่วยความจำที่ถูกตีความตามประเภทเฉพาะ และสำหรับประเภทที่แตกต่างกัน ชุดบิตเดียวกันสามารถตีความต่างกันได้ ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องพิจารณาช่วงค่าสำหรับประเภทที่กำหนดเมื่อกำหนดค่าให้กับตัวแปร
ตัวระบุอัตโนมัติ
บางครั้งการระบุประเภทของนิพจน์อาจเป็นเรื่องยาก และตามมาตรฐานล่าสุด คุณสามารถปล่อยให้คอมไพเลอร์อนุมานประเภทของออบเจ็กต์ได้ และใช้ตัวระบุอัตโนมัติสำหรับสิ่งนี้ ยิ่งไปกว่านั้น หากเรากำหนดตัวแปรด้วยตัวระบุอัตโนมัติ ตัวแปรนี้จะต้องเริ่มต้นด้วยค่าบางค่า:
หมายเลขอัตโนมัติ = 5;
ขึ้นอยู่กับค่าที่กำหนด คอมไพลเลอร์จะอนุมานประเภทของตัวแปร ไม่อนุญาตให้ใช้ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นด้วยตัวระบุอัตโนมัติ
ประเภทข้อมูลใน C เป็นคลาสของข้อมูลที่มีค่ามีลักษณะคล้ายกัน ประเภทนี้จะกำหนดการเป็นตัวแทนภายในของข้อมูลในหน่วยความจำ ประเภทข้อมูลพื้นฐานที่สุด: ตรรกะ จำนวนเต็ม ตัวเลขทศนิยม สตริง พอยน์เตอร์
ด้วยการพิมพ์แบบไดนามิก ตัวแปรจะเชื่อมโยงกับประเภท ณ เวลาที่เริ่มต้น ปรากฎว่าตัวแปรในส่วนต่าง ๆ ของโค้ดสามารถมีประเภทต่างกันได้ การพิมพ์แบบไดนามิกรองรับ Java Script, Python, Ruby, PHP
การพิมพ์แบบคงที่เป็นสิ่งที่ตรงกันข้ามกับการพิมพ์แบบไดนามิก เมื่อประกาศ ตัวแปรจะได้รับประเภทที่ไม่เปลี่ยนแปลงในภายหลัง ภาษา C และ C++ เป็นเช่นนั้น วิธีนี้เป็นวิธีที่สะดวกที่สุดในการเขียนโค้ดที่ซับซ้อน และข้อผิดพลาดต่างๆ มากมายจะหมดไปในขั้นตอนการคอมไพล์
ภาษาแบ่งอย่างไม่เป็นทางการออกเป็นประเภทที่รุนแรงและประเภทที่ไม่รุนแรง การพิมพ์ที่รัดกุมหมายความว่าคอมไพเลอร์จะส่งข้อผิดพลาดหากประเภทที่คาดไว้และประเภทจริงไม่ตรงกัน
x = 1 + “2”; //ข้อผิดพลาด - คุณไม่สามารถเพิ่มสัญลักษณ์ให้กับตัวเลขได้
ตัวอย่างการพิมพ์ที่อ่อนแอ
การตรวจสอบความสอดคล้องของประเภทจะดำเนินการโดยระบบความปลอดภัยของประเภท เกิดข้อผิดพลาดในการพิมพ์ เช่น เมื่อพยายามใช้ตัวเลขเป็นฟังก์ชัน มีภาษาที่ไม่ได้พิมพ์ ตรงกันข้ามกับที่พิมพ์ไว้ พวกมันอนุญาตให้คุณดำเนินการใด ๆ กับแต่ละวัตถุได้
คลาสหน่วยความจำ
ตัวแปรไม่ว่าจะประเภทใดก็ตาม มีขอบเขตและอายุการใช้งานของตัวเอง
คลาสหน่วยความจำ:
- อัตโนมัติ;
- คงที่;
- ภายนอก;
- ลงทะเบียน.
ตัวแปรทั้งหมดในภาษา C เป็นแบบท้องถิ่นโดยค่าเริ่มต้น สามารถใช้ได้เฉพาะภายในฟังก์ชันหรือบล็อกเท่านั้น เมื่อฟังก์ชันเสร็จสมบูรณ์ ค่าจะถูกทำลาย
ตัวแปรคงที่เป็นแบบโลคัลเช่นกัน แต่สามารถมีค่าที่แตกต่างกันนอกบล็อกได้ และค่าจะถูกบันทึกระหว่างการเรียกใช้ฟังก์ชัน
ตัวแปรภายนอกเป็นแบบโกลบอล มีอยู่ในส่วนใดก็ได้ของโค้ดและแม้แต่ในไฟล์อื่น
ตัวระบุชนิดข้อมูลในภาษา C อาจไม่สามารถระบุได้ในกรณีต่อไปนี้:
- ตัวแปรทั้งหมดภายในบล็อกไม่ใช่ตัวแปร ดังนั้น หากตั้งใจจะใช้คลาสหน่วยความจำเฉพาะนี้ ระบบจะไม่ระบุตัวระบุอัตโนมัติ
- ฟังก์ชันทั้งหมดที่ประกาศนอกบล็อกหรือฟังก์ชันเป็นแบบโกลบอลตามค่าเริ่มต้น ดังนั้นจึงไม่จำเป็นต้องใช้ตัวระบุภายนอก
หากต้องการระบุประเภทอย่างง่าย ให้ใช้ตัวระบุ int, char, float หรือ double โมดิฟายเออร์ที่ไม่ได้ลงนาม, ลงนาม, สั้น, ยาว, ยาว สามารถทดแทนตัวแปรได้
ตามค่าเริ่มต้น ตัวเลขทั้งหมดจะถูกเซ็นชื่อ ดังนั้นจึงสามารถอยู่ในช่วงของจำนวนบวกเท่านั้น ในการกำหนดตัวแปรประเภทถ่านตามแบบเซ็นชื่อ ให้เขียนอักขระแบบเซ็นชื่อ ยาว ยาว ยาว และสั้น ระบุจำนวนพื้นที่หน่วยความจำที่ถูกจัดสรรสำหรับการจัดเก็บ ที่ใหญ่ที่สุดคือยาวยาว เล็กที่สุดคือสั้น
Char เป็นชนิดข้อมูลที่เล็กที่สุดในภาษา C มีการจัดสรรหน่วยความจำเพียง 1 ไบต์เพื่อจัดเก็บค่า ตัวแปรประเภทอักขระมักจะถูกกำหนดเป็นอักขระ ซึ่งน้อยกว่า - ตัวเลข ค่าอักขระจะอยู่ในเครื่องหมายคำพูด
ประเภท int เก็บจำนวนเต็ม ขนาดไม่ได้กำหนด - ใช้หน่วยความจำสูงสุด 4 ไบต์ ขึ้นอยู่กับสถาปัตยกรรมคอมพิวเตอร์
การแปลงตัวแปรที่ไม่ได้ลงนามอย่างชัดเจนมีการระบุดังนี้:
โดยนัยหนึ่งมีลักษณะเช่นนี้:
ลอยและกำหนดตัวเลขด้วยจุดสองเท่า ตัวเลขทศนิยมจะแสดงเป็น -2.3 หรือ 3.34 มีการใช้ double เพื่อความแม่นยำยิ่งขึ้น - มีการระบุตัวเลขมากขึ้นหลังตัวคั่นจำนวนเต็มและตัวคั่นเศษส่วน ประเภทนี้ใช้พื้นที่หน่วยความจำมากกว่าโฟลต
โมฆะมีค่าว่าง มันกำหนดฟังก์ชันที่ไม่ส่งคืนสิ่งใด ตัวระบุนี้ระบุค่าว่างในอาร์กิวเมนต์ของวิธีการ พอยน์เตอร์ซึ่งสามารถรับข้อมูลประเภทใดก็ได้ก็ถูกกำหนดให้เป็นโมฆะเช่นกัน
ประเภทบูลีน บูล
ใช้ในการทดสอบและลูปตามเงื่อนไข มีเพียงสองความหมาย:
- จริง;
- โกหก.
ค่าบูลีนสามารถแปลงเป็นค่า int ได้ จริงเท่ากับหนึ่ง เท็จเท่ากับศูนย์ การแปลงประเภทสามารถทำได้ระหว่าง bool และ int เท่านั้น มิฉะนั้นคอมไพเลอร์จะเกิดข้อผิดพลาด
if (x) ( //ข้อผิดพลาด: "ไม่สามารถแปลงประเภท 'int' เป็น 'bool' โดยปริยายได้"
if (x != 0) // วิธี C#
สตริงและอาร์เรย์
อาร์เรย์เป็นชนิดข้อมูลที่ซับซ้อนในภาษาซี PL ไม่ทำงานกับสตริงในลักษณะเดียวกับ Javascript หรือ Ruby ในภาษา C สตริงทั้งหมดเป็นอาร์เรย์ขององค์ประกอบที่มีค่าอักขระ บรรทัดลงท้ายด้วยไบต์ว่าง “
นอกจากการแบ่งข้อมูลออกเป็นตัวแปรและค่าคงที่แล้ว ยังมีการจำแนกข้อมูลตามประเภทอีกด้วย คำอธิบายของตัวแปรส่วนใหญ่ประกอบด้วยการประกาศประเภทของตัวแปร ประเภทข้อมูลแสดงลักษณะช่วงของค่าและรูปแบบการแสดงในหน่วยความจำคอมพิวเตอร์ แต่ละประเภทมีลักษณะเฉพาะด้วยชุดการดำเนินการกับข้อมูล ตามเนื้อผ้า ภาษาโปรแกรมทั่วไปจะมีประเภทมาตรฐาน เช่น จำนวนเต็ม จำนวนจริง ตัวอักษร และตรรกะ 3 ให้เราทราบทันทีว่าไม่มีประเภทตรรกะในภาษาซี นิพจน์ (ในบางกรณีคือตัวแปร) จะถือว่าเป็นจริงหากค่าไม่เป็นศูนย์ มิฉะนั้นจะถือว่าเป็นเท็จ
การมีอยู่ของตัวเลขสองประเภท (จำนวนเต็มและจำนวนจริง) มีความเกี่ยวข้องกับรูปแบบที่เป็นไปได้สองรูปแบบในการแสดงตัวเลขในหน่วยความจำคอมพิวเตอร์
ข้อมูล ทั้งประเภทเก็บไว้ในรูปแบบการนำเสนอ จุดคงที่- มีความโดดเด่นด้วยความแม่นยำสูงสุดในการแสดงตัวเลขและดำเนินการกับตัวเลขเหล่านั้น รวมถึงช่วงค่าตัวเลขที่จำกัด ประเภทจำนวนเต็มใช้สำหรับข้อมูลที่โดยหลักการแล้ว ไม่สามารถมีส่วนที่เป็นเศษส่วนได้ (จำนวนคน รถยนต์ ฯลฯ ตัวเลข และตัวนับ)
พิมพ์จริงสอดคล้องกับรูปแบบการแสดงตัวเลข จุดลอยตัวซึ่งมีลักษณะเฉพาะด้วยการแสดงตัวเลขโดยประมาณด้วยจำนวนหลักนัยสำคัญที่กำหนด (เครื่องหมายแมนทิสซา) และช่วงลำดับที่กว้างของตัวเลข ซึ่งทำให้สามารถแสดงทั้งตัวเลขขนาดใหญ่มากและน้อยมากในค่าสัมบูรณ์ได้ เนื่องจากการแสดงข้อมูลประเภทจริงโดยประมาณ การเปรียบเทียบเพื่อความเท่าเทียมกันไม่ถูกต้อง.
ในการใช้งานภาษาโปรแกรมสากลสมัยใหม่ มักจะมีจำนวนเต็มหลายจำนวนและประเภทจริงหลายประเภท ซึ่งแต่ละประเภทมีลักษณะเฉพาะด้วยขนาดหน่วยความจำของตัวเองที่จัดสรรสำหรับค่าเดียว และตามด้วยช่วงของค่าตัวเลข และสำหรับประเภทจริง - และ ความแม่นยำ (จำนวนหลักของแมนทิสซา)
ข้อมูล ประเภทอักขระรับค่ากับชุดอักขระทั้งหมดที่อนุญาตสำหรับคอมพิวเตอร์ที่กำหนด หนึ่งไบต์ได้รับการจัดสรรเพื่อจัดเก็บค่าอักขระหนึ่งตัว อักขระจะถูกเข้ารหัสตามตารางการเข้ารหัสมาตรฐาน (โดยปกติคือ ASCII)
C มี 4 ประเภทพื้นฐาน:
ถ่าน- ประเภทตัวละคร;
ภายใน- ทั้งประเภท
ลอย- ประเภทจริงที่มีความแม่นยำเดียว
สองเท่า- ประเภทจริงที่มีความแม่นยำสองเท่า
หากต้องการกำหนดประเภทที่ได้รับ ให้ใช้ รอบคัดเลือก:สั้น(สั้น) - ใช้กับประเภท ภายใน,ยาว(ยาว) - ใช้กับประเภท ภายในและ สองเท่า;ลงนาม(มีป้าย) ไม่ได้ลงนาม(ไม่ได้ลงนาม) - ใช้กับจำนวนเต็มประเภทใดก็ได้ ในกรณีที่ไม่มีคำว่าไม่ได้ลงนาม ค่าจะถือว่าลงนามแล้ว เช่น นั่นคือมีการลงนามค่าเริ่มต้น เนื่องจากการยอมรับการผสมผสานระหว่างตัวระบุและชื่อของประเภทพื้นฐานโดยพลการประเภทหนึ่งจึงสามารถมีได้หลายชื่อ ข้อมูลเกี่ยวกับประเภท C มาตรฐานแสดงอยู่ในตารางที่ 1 และ 2 ตัวอธิบายคำพ้องความหมายแสดงอยู่ในเซลล์ของคอลัมน์แรก คั่นด้วยเครื่องหมายจุลภาค
ตารางที่ 1. ชนิดข้อมูลจำนวนเต็ม C มาตรฐาน
ชนิดข้อมูล |
ช่วงของค่า |
|
ถ่าน, ถ่านที่ลงนาม | ||
int ที่ไม่ได้ลงนาม, ไม่ได้ลงนาม | ||
int, int ที่ลงนาม, int สั้น, สั้น | ||
2147483648...2147483647 |
สิ่งที่น่าสนใจคือในภาษา C ประเภทอักขระสามารถใช้เป็นอักขระหรือประเภทจำนวนเต็มได้ ขึ้นอยู่กับบริบท
ตารางที่ 2. ชนิดข้อมูลจริงมาตรฐาน C
ความคิดเห็นในการเขียนโปรแกรมสำหรับส่วนแรกของคู่มือเราจำเป็นต้องมีเป็นหลัก สองประเภท:ลอยและภายใน.
ในการเขียนโปรแกรมประเภทข้อมูลคือชุดของสองชุด: ชุดของค่าและชุดการดำเนินการที่สามารถนำไปใช้กับชุดเหล่านั้นได้ ตัวอย่างเช่น การดำเนินการของการบวก (+) การคูณ (*) การหารจำนวนเต็ม (/) เศษ (%) และการลบ (-) สามารถนำไปใช้กับชนิดข้อมูลจำนวนเต็มที่ไม่ติดลบซึ่งประกอบด้วยชุดจำกัดของจำนวนธรรมชาติ
โดยทั่วไปภาษาการเขียนโปรแกรมจะมีชุดของประเภทข้อมูลดั้งเดิม ซึ่งเป็นประเภทที่ภาษาการเขียนโปรแกรมจัดให้เป็นหน่วยพื้นฐานที่มีอยู่แล้วภายใน ในภาษา 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 จากนั้น:
ถ่านไบนารีตัวอย่าง = 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), || (ตรรกะหรือ) ผลลัพธ์ของการดำเนินการแต่ละครั้งสามารถพบได้ในตารางความจริงที่เกี่ยวข้อง ตัวอย่างเช่น:
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;