วิธีปฏิบัติเพื่อเรียนรู้ C? [ปิด]


10

ฉันต้องการที่จะขุดลงใน C และโดยปกติเมื่อฉันต้องการเรียนรู้ภาษาใหม่ฉันคิดว่าเป้าหมายของโครงการที่เรียบง่าย / สำเร็จที่มีวัตถุประสงค์ในทางปฏิบัติบางอย่าง (ใช้ประโยชน์จาก API, ทำงานโดยอัตโนมัติ ฯลฯ )

ฉันมีช่วงเวลาที่ยากลำบากในการหาสิ่งหนึ่งสำหรับ C เป็นหลักเพราะทุกสิ่งที่ฉันอ่านชี้ไปที่ข้อเท็จจริงที่ว่าการใช้งานหลักของ C ในปัจจุบันคือในระบบฝังตัวและโครงการซอฟต์แวร์ที่ซับซ้อนมากขึ้นเช่นระบบปฏิบัติการ

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

อ้างอิงถึงแหล่งเรียนรู้ภาคปฏิบัติ? (บทช่วยสอน / วิธีการสร้างผลลัพธ์สุดท้ายที่มีจุดประสงค์ / ผลประโยชน์)


3
คุณจะได้รับคำตอบที่สมเหตุสมผลมากขึ้นถ้าคุณบอกเราได้ว่าทำไมคุณถึงต้องการเรียนรู้ C?
zvrba

2
ฉันเห็นด้วยกับ zvrba C เหมาะอย่างยิ่งสำหรับสิ่งต่ำระดับเร็วและรหัสไดรเวอร์ หากคุณกำลังเขียนโค้ดสำหรับเกมมันก็ยอดเยี่ยมเช่นกัน (แม้ว่าคุณอาจจะทำงานร่วมกับนักเขียนรหัส C ++ ที่จะบ่นกับคุณในการเขียนรหัส "ที่ไม่ได้มาตรฐาน") แม้ว่าฉันรู้สึกว่าสภาและ C นั้นคล้ายกับภาษาละติน (ในภาษาที่พูด) พวกเขาไม่ใช่คนแรก แต่ส่วนใหญ่มาหลังจากพวกเขาใช้ความคิดและสร้างจากพวกเขาเพื่อสร้างภาษาของตัวเอง ดังนั้นการศึกษา C MIGHTจะทำให้คุณเข้าใจภาษาระดับสูงขึ้นได้ดีขึ้น
Jamie Taylor

คุณได้ดูLearn C The Wayของ Zed Shaw แล้วหรือยัง เกี่ยวกับการปฏิบัติเท่าที่จะได้รับและค่อนข้างฟรีเช่นกัน
ไวแอตต์บาร์เน็ตต์

คน Python the Hard Way ตอนนี้มีหนังสือสำหรับภาษาอื่นรวมถึงรุ่นอัลฟ่าสำหรับ C ฉันจะเริ่มต้นที่นั่น C อยู่ในระดับสูงมีความแตกต่างอย่างมากกับ asm ฉันเกลียดการเปรียบเทียบกับ asm เพราะมันเป็นเท็จ ค่อนข้างแน่ใจว่ามันช่วยให้คุณทำสิ่งที่ภาษาอื่น ๆ เคยชิน ไม่สำคัญว่าคุณต้องการสร้างแอปพลิเคชั่นใด ๆ ที่คุณสามารถเขียนเป็นภาษา C ได้โดยไม่มีเหตุผลในการกำหนดเป้าหมายแอปพลิเคชันเป็นภาษา
old_timer

คำตอบ:


27

ผมก็จะขอแนะนำให้ยกขึ้นสำเนาของKernighan และ Ritchie ของภาษา C Programming (ฉบับที่ 2) มีแบบฝึกหัดจำนวนมากในตอนท้ายของแต่ละบทที่คุณสามารถทำได้พร้อมกับการแนะนำภาษา C ที่ดีมาก มันจะไม่ทำให้คุณเป็นผู้เชี่ยวชาญภาษา แต่คุณควรมีความเข้าใจที่ดีพอในตอนท้ายของหนังสือและแบบฝึกหัดเพื่อหาโครงการโอเพ่นซอร์สที่เขียนใน Cซึ่งคุณสามารถอ่านต้นฉบับและอาจมีส่วนร่วม ถึง.

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


1
เพิ่มคำถามที่พบบ่อยจาก comp.lang.c ไปที่ c-faq.com
Mike Sherrill 'Cat Recall'

3
+1 สำหรับไม่คิดแก้ปัญหาการสร้างใหม่เพื่อเรียนรู้
CVn

4
K&R น่ากลัวสำหรับการเรียนรู้รูปแบบการเขียนโปรแกรมที่ดีโดยทั่วไปและน่ากลัวในการสอนวิธีปฏิบัติในการเขียนโปรแกรมที่ปลอดภัย / มีเหตุผล C โดยเฉพาะ ตัวอย่างโค้ดทั้งหมดที่อยู่ในนั้นจะทำให้งงงวยที่สุดเวลาส่วนใหญ่ที่พวกเขาสอนนิสัยอันตรายทันที มันเป็นหนังสือที่ล้าสมัยฉันไม่อยากจะแนะนำอะไรเลยนอกจากความคิดถึง ไม่เหมาะสมอย่างยิ่งสำหรับโปรแกรมเมอร์มือใหม่

2
@Thomas ใช่รุ่นที่ 2 คุณสามารถอ้างอิงตัวอย่างโค้ดใด ๆ จากมันและฉันสามารถชี้ให้เห็นถึง 2-3 กรณีการปฏิบัติที่เป็นอันตราย / ไม่ดีในนั้น ฉันจะเปิดหนังสือตอนนี้และเลือกตัวอย่างแบบสุ่ม ตกลงไปเลย, p119: การกำหนดเงื่อนไขภายใน, การใช้ชนิดข้อมูลดั้งเดิมดั้งเดิม, การใช้ int โดยนัย (ไม่ได้ลงนาม), พิมพ์ผลลัพธ์ของ malloc (แย่มาก!), พิมพ์พารามิเตอร์ให้เป็นโมฆะ * (ทำไม ??? ) ผลตอบแทนหลายรายการ (aka สปาเก็ตตี้) โดยใช้ NULL โดยไม่มี #include ที่เหมาะสมหากไม่มี {}

2
+ 1 สำหรับ KnR C. เป็นคำแนะนำที่ดีที่สุด (และรัดกุมที่สุด) สำหรับการเขียนโปรแกรมในภาษาเฉพาะที่ฉันเคยอ่าน อย่างที่คนอื่น ๆ ชี้ไปมันอาจเป็นเรื่องน่าสงสัยเล็กน้อยในสถานที่ - คำแนะนำอย่างหนึ่งที่ฉันให้คือ: ถ้าเคยมีคู่มือการเขียนโปรแกรมที่ต้องการให้คุณอ่านสิ่งที่อยู่รอบ ๆ โดยทั่วไปแล้วคุณสามารถหาได้จากบล็อกรหัส แต่หนังสือเล่มนี้ต้องการให้คุณอ่านมันแบบ cover-to-cover อย่างน้อยหนึ่งครั้ง
Jamie Taylor

1

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

ใช้สิ่งอำนวยความสะดวกในการดีบักหน่วยความจำสำหรับแพลตฟอร์มที่คุณใช้ สำหรับ Linux มีรั้วไฟฟ้าบน Mac OS X นั่นคือ Guard Malloc นอกจากนี้ยังมี Valgrind ซึ่งรองรับระบบปฏิบัติการจำนวนมาก

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

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

การทดสอบหน่วยยังช่วย


0

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


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

ใช่ แต่ฉันสมมติว่าผู้ถามได้อ่านหนังสือ K&R หรืออะไรทำนองนั้น ฉันแนะนำวิธีนี้เมื่อฉันถามในช่อง Python มันจะแตกต่างกันใน C หรือไม่?
Nishant

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

0

คุณจะต้องการทำสิ่งที่สามารถทำงานได้จากบรรทัดคำสั่ง การเขียนโปรแกรม GUI ใน C เป็นความเจ็บปวดที่สำคัญในตูดแม้จะมีกรอบ GUI ที่ดี

ข้อเสนอแนะปกติของฉันสำหรับประสบการณ์การเรียนรู้การปฏิบัติ C นั้นเป็นรายชื่อผู้ติดต่อหรือแอพการจัดการข้อมูลอย่างง่ายอื่น ๆ ซึ่งจะครอบคลุมบิตที่สำคัญส่วนใหญ่ (I / O, การจัดการหน่วยความจำ, การประมวลผลข้อความ ฯลฯ ) และคุณไม่จำเป็นต้องใช้อะไรนอกเหนือจากไลบรารี C มาตรฐานเพื่อให้สำเร็จ C ไม่ได้มีการสนับสนุนใด ๆ ในตัวสำหรับกราฟิก, ระบบเครือข่ายเสียงหรืออะไรอย่างอื่น1ดังนั้นสำหรับการโจมตีครั้งแรกของคุณลงในการเขียนโปรแกรม C ดีที่สุดที่จะหลีกเลี่ยงสิ่งที่ต้องอาศัยสิ่งต่างๆประเภทนั้น

C สามารถใช้สำหรับการเขียนโปรแกรมเอนกประสงค์ คุณต้องปรับวงล้อตามความคาดหวังของคุณบ้าง (ลองจินตนาการว่ามันเป็นปี 1983 และคุณกำลังนั่งอยู่หน้า VT52 ที่แนบกับ VAX 11/750 และคุณจะต้องอยู่ในความคิดที่ถูกต้อง)

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


1 - การปรับปรุงมาตรฐานภาษาล่าสุด (2011) ได้เพิ่มการสนับสนุนเธรดในตัว


0

ผมขอแนะนำโครงการออยเลอร์ ฉันใช้มันเพื่อปรับปรุง C ++ ของฉันและมันยอดเยี่ยม เป็นเรื่องที่ดีเพราะปัญหาแต่ละอย่างเป็นงานเล็ก ๆ ที่อาจใช้เวลาน้อยกว่าหนึ่งชั่วโมงในการทำให้เสร็จ (อย่างน้อยก็ในตอนแรก)

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


0

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

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