ฉันกำลังพิจารณาการเรียนรู้ค
ไม่มีเหตุผลที่เฉพาะเจาะจงที่จะไม่เรียนรู้ C แต่ฉันอยากจะแนะนำ C ++ มันเสนอสิ่งที่ C ทำมาก (เนื่องจาก C ++ เป็นชุดสุดยอดของ C) ที่มี "extras" จำนวนมาก การเรียนรู้ C ก่อน C ++ นั้นไม่จำเป็น - เป็นภาษาที่แยกกันได้อย่างมีประสิทธิภาพ
อีกวิธีหนึ่งถ้า C เป็นชุดเครื่องมืองานไม้มันอาจจะเป็น:
- ค้อน
- เล็บ
- เลื่อยมือ
- สว่านมือ
- ซานเดอร์บล็อก
- สิ่ว (อาจจะ)
คุณสามารถสร้างอะไรก็ได้ด้วยเครื่องมือเหล่านี้ - แต่สิ่งที่ดีอาจต้องใช้เวลาและทักษะมากมาย
C ++ คือชุดเครื่องมือไฟฟ้าที่ร้านฮาร์ดแวร์ในพื้นที่ของคุณ
หากคุณยึดติดกับคุณสมบัติทางภาษาพื้นฐานในการเริ่มต้น C ++ จะมีช่วงการเรียนรู้เพิ่มเติมเล็กน้อย
แต่ทำไมคนใช้ C (หรือ C ++) ถ้ามันสามารถใช้ 'อันตราย'?
เพราะบางคนไม่ต้องการเฟอร์นิเจอร์จาก IKEA =)
แม้ว่าอย่างจริงจังในขณะที่หลายภาษาที่ "สูงกว่า" กว่า C หรือ C ++ อาจมีสิ่งที่ทำให้พวกเขา (อาจ) "ง่ายขึ้น" ที่จะใช้ในบางแง่มุมนี่ไม่ใช่สิ่งที่ดีเสมอไป หากคุณไม่ชอบวิธีการทำงานหรือคุณสมบัติที่ไม่ได้จัดเตรียมไว้อาจเป็นไปได้ว่าคุณไม่สามารถทำอะไรได้มากนัก ในทางกลับกัน C และ C ++ ให้คุณสมบัติภาษา "ระดับต่ำ" มากพอ (รวมถึงตัวชี้) ที่คุณสามารถเข้าถึงหลายสิ่งได้โดยตรง (โดยเฉพาะฮาร์ดแวร์หรือระบบปฏิบัติการ) หรือสร้างด้วยตัวเองซึ่งอาจไม่สามารถทำได้ ภาษาที่ใช้งาน
โดยเฉพาะอย่างยิ่ง C มีชุดคุณสมบัติต่อไปนี้ซึ่งทำให้เป็นที่ต้องการสำหรับโปรแกรมเมอร์จำนวนมาก:
- ความเร็ว - เนื่องจากความเรียบง่ายสัมพัทธ์และการเพิ่มประสิทธิภาพคอมไพเลอร์ในช่วงหลายปีที่ผ่านมาจึงค่อนข้างเร็ว นอกจากนี้ผู้คนจำนวนมากได้ค้นพบทางลัดจำนวนมากไปยังเป้าหมายที่เฉพาะเจาะจงเมื่อใช้ภาษาซึ่งทำให้มันอาจเร็วขึ้น
- ขนาด - ด้วยเหตุผลที่คล้ายกันกับที่แสดงรายการไว้สำหรับความเร็วโปรแกรม C สามารถทำขนาดเล็กมาก (ทั้งในแง่ของขนาดที่ปฏิบัติการได้และการใช้หน่วยความจำ) ซึ่งเป็นที่ต้องการสำหรับสภาพแวดล้อมที่มีหน่วยความจำ จำกัด (เช่นฝังตัวหรือมือถือ)
ความเข้ากันได้ - C มีมาเป็นเวลานานและทุกคนมีเครื่องมือและไลบรารีสำหรับมัน ภาษาเองก็ไม่จู้จี้จุกจิกเช่นกัน - คาดว่าโปรเซสเซอร์จะดำเนินการตามคำสั่งและหน่วยความจำเพื่อเก็บสิ่งต่างๆ
นอกจากนี้ยังมีบางสิ่งบางอย่างที่รู้จักกันเป็นApplication Binary Interface (ABI) ในระยะสั้นจะเป็นวิธีที่สำหรับโปรแกรมในการสื่อสารในระดับเครื่องรหัสซึ่งจะมีข้อได้เปรียบกว่าการเชื่อมต่อของการเขียนโปรแกรมประยุกต์ (API) ในขณะที่ภาษาอื่น ๆ เช่น C ++ สามารถมี ABI ได้ แต่โดยทั่วไปแล้วภาษาเหล่านี้จะมีความสม่ำเสมอน้อยกว่า (เห็นด้วย) ดังนั้น C จึงเป็นภาษาพื้นฐานที่ดีเมื่อคุณต้องการใช้ ABI เพื่อสื่อสารกับโปรแกรมอื่นด้วยเหตุผลบางประการ
ทำไมโปรแกรมเมอร์ไม่เพียง แต่ใช้ Java หรือ Python หรือภาษาอื่นที่รวบรวมเช่น Visual Basic?
ประสิทธิภาพ (และแผนการจัดการหน่วยความจำบางครั้งที่ไม่สามารถนำไปใช้ได้โดยไม่ต้องเข้าถึงหน่วยความจำโดยตรง)
การเข้าถึงหน่วยความจำโดยตรงกับพอยน์เตอร์แนะนำเทคนิคที่เนี้ยบ (มักจะรวดเร็ว) เมื่อคุณสามารถวางอุ้งเท้าตัวเล็ก ๆ และเลขศูนย์ไว้ใน cubbyholes ในหน่วยความจำของคุณได้โดยตรงและไม่ต้องรอครูผู้สอน เวลาเล่นจากนั้นจึงตักขึ้นอีกครั้ง
ในระยะสั้นการเพิ่มสิ่งต่าง ๆ อาจทำให้เกิดความล่าช้าหรือทำให้เกิดความซับซ้อนที่ไม่ต้องการ
เกี่ยวกับภาษาสคริปต์และ ilk นั้นคุณต้องทำงานอย่างหนักเพื่อให้ได้ภาษาที่ต้องการให้โปรแกรมรองทำงานได้อย่างมีประสิทธิภาพเท่ากับ C (หรือภาษาที่คอมไพล์) ที่เป็นวิธีดั้งเดิม การเพิ่มล่ามแบบทันทีจะแนะนำความเป็นไปได้ในการลดความเร็วในการดำเนินการและการใช้หน่วยความจำเพิ่มขึ้นเนื่องจากคุณกำลังเพิ่มโปรแกรมอื่นลงในมิกซ์ ประสิทธิภาพของโปรแกรมของคุณขึ้นอยู่กับประสิทธิภาพของโปรแกรมรองนี้มากพอ ๆ กับที่คุณเขียนโค้ดโปรแกรมดั้งเดิมของคุณ (ไม่ดี =) ไม่พูดถึงโปรแกรมของคุณมักจะพึ่งพาโปรแกรมที่สองอย่างสมบูรณ์แม้กระทั่งดำเนินการ โปรแกรมที่สองนั้นไม่มีอยู่ในระบบบางระบบ? รหัสไม่ไป
ในความเป็นจริงการแนะนำอะไร "พิเศษ" อาจช้าหรือซับซ้อนรหัสของคุณ ในภาษา "ที่ไม่มีตัวชี้ที่น่ากลัว" คุณมักจะรอบิตของรหัสอื่น ๆ เพื่อทำความสะอาดหลังคุณหรือหาวิธี "ปลอดภัย" ที่จะทำสิ่งต่าง ๆ - เนื่องจากโปรแกรมของคุณยังคงดำเนินการเข้าถึงหน่วยความจำแบบเดียวกับที่อาจทำได้ ชี้ คุณไม่ใช่คนที่จัดการมัน (ดังนั้นคุณจึงไม่สามารถ f * ck มันได้อัจฉริยะ = P)
โดยอันตรายฉันหมายถึงตัวชี้และสิ่งอื่นที่คล้ายคลึงกัน [... ] เช่นเดียวกับคำถาม Stack Overflow เหตุใดฟังก์ชันที่ได้รับจึงอันตรายที่ไม่ควรใช้
ตามคำตอบที่ยอมรับ:
"มันยังคงเป็นส่วนหนึ่งของภาษาอย่างเป็นทางการจนถึงมาตรฐาน ISO 1999 C แต่มันก็ถูกลบออกอย่างเป็นทางการโดยมาตรฐาน 2011 การใช้งาน C ส่วนใหญ่ยังคงสนับสนุน แต่อย่างน้อย gcc ออกคำเตือนสำหรับรหัสใด ๆ ที่ใช้มัน"
ความคิดที่ว่าเพราะสิ่งที่สามารถทำได้ในภาษานั้นจะต้องทำคือโง่ ภาษามีข้อบกพร่องที่ได้รับการแก้ไข สำหรับเหตุผลที่เข้ากันได้กับรหัสที่เก่ากว่าโครงสร้างนี้ยังสามารถใช้งานได้ แต่ไม่มีสิ่งใด (น่าจะเป็น) ที่บังคับให้โปรแกรมเมอร์ใช้รับ () และอันที่จริงคำสั่งนี้ถูกแทนที่ด้วยทางเลือกที่ปลอดภัยกว่า
ยิ่งไปกว่านั้นปัญหาของการได้รับ () ไม่ได้เป็นปัญหาตัวชี้ต่อ เป็นปัญหากับคำสั่งที่ไม่จำเป็นต้องรู้วิธีใช้หน่วยความจำอย่างปลอดภัย ในแง่นามธรรมนี่คือประเด็นตัวชี้ทั้งหมด - การอ่านและการเขียนสิ่งที่คุณไม่ควรทำ นั่นไม่ใช่ปัญหาของพอยน์เตอร์ มันเป็นปัญหากับการใช้งานตัวชี้
ในการชี้แจงตัวชี้ไม่อันตรายจนกว่าคุณจะเข้าถึงตำแหน่งหน่วยความจำที่คุณไม่ได้ตั้งใจ และถึงอย่างนั้นก็ไม่รับประกันว่าคอมพิวเตอร์ของคุณจะละลายหรือระเบิด ในกรณีส่วนใหญ่โปรแกรมของคุณจะหยุดทำงาน (ถูกต้อง)
ที่กล่าวว่าเนื่องจากพอยน์เตอร์ให้การเข้าถึงที่ตั้งหน่วยความจำและเนื่องจากข้อมูลและรหัสที่ปฏิบัติการได้มีอยู่ในหน่วยความจำร่วมกันจึงมีอันตรายที่เกิดจากความเสียหายจากอุบัติเหตุที่คุณต้องการจัดการหน่วยความจำอย่างถูกต้อง
จนถึงจุดนั้นเนื่องจากการดำเนินการเข้าถึงหน่วยความจำโดยตรงอย่างแท้จริงมักให้ประโยชน์โดยทั่วไปน้อยกว่าเมื่อหลายปีก่อนแม้แต่ภาษาที่ไม่ได้เก็บรวบรวมอย่าง C ++ ได้แนะนำสิ่งต่าง ๆ เช่นตัวชี้อัจฉริยะเพื่อช่วยลดช่องว่างระหว่างประสิทธิภาพของหน่วยความจำและความปลอดภัย
โดยสรุปมีเหตุผลน้อยมากที่จะกลัวตัวชี้ตราบใดที่ใช้งานอย่างปลอดภัย เพียงแค่ใช้คำแนะนำจากรุ่น South Park ของสตีฟ "จระเข้ฮันเตอร์" เออร์วิน - ไม่ได้ไปรอบ ๆ เกาะนิ้วหัวแม่มือของคุณใน bumholes