สวัสดีและยินดีต้อนรับ.
ในวิดีโอนี้ ฉันต้องการอธิบายให้คุณทราบว่าข้อผิดพลาดของคอมไพเลอร์คืออะไร
ถึงจุดนี้.
ขวา.
เราได้เขียนโค้ดบางส่วนและเราสังเกตเห็นว่าในหน้าต่างเอาต์พุตของบิลด์ เราออกคำสั่งคอมไพล์และเราทราบเมื่อเกิดข้อผิดพลาด
ขวา.
มักจะมีคำอธิบายดีๆ ที่บอกว่ามีข้อผิดพลาดในโค้ดของคุณ แต่นั่นหมายความว่าอย่างไรกันแน่?
ดังนั้นเมื่อคุณเขียนโค้ดสำหรับการเขียนโปรแกรม ภาษา ภาษาโปรแกรมจะเข้มงวดมาก
พวกเขามีกฎ
และคุณต้องปฏิบัติตามกฎเหล่านั้นเพื่อให้โปรแกรมทำงาน
คอมไพเลอร์จะตรวจสอบไวยากรณ์ของรหัส
และถ้าถูกต้องและไม่มีข้อผิดพลาดทางความหมาย ก็จะสร้างจากซอร์สโค้ด รหัสประเภทภาษาเครื่อง
และคุณสามารถเรียกใช้โปรแกรมได้
ดังนั้นคุณต้องปฏิบัติตามกฎเหล่านี้และเป็นกฎที่มีรายละเอียดมาก
ดังนั้นคุณต้องมีรายละเอียดมาก
ดังนั้นข้อผิดพลาดของคอมไพเลอร์จึงมีได้สองรูปแบบ
อาจมาในรูปแบบของข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดทางความหมาย
ข้อผิดพลาดทางไวยากรณ์คือเมื่อคุณมีบางอย่างผิดปกติกับโครงสร้างของโค้ด
คุณไม่ได้ปฏิบัติตามกฎของภาษาในแง่ของไวยากรณ์ใช่ไหม
คุณไม่ได้ใส่วงเล็บในช่องว่างที่ถูกต้อง
คุณไม่ได้เพิ่มคำสั่งทั้งหมดของคุณด้วยเครื่องหมายอัฒภาค
คุณไม่ใช่คุณสะกดคำหลักผิด
ทั้งหมดนี้เป็นตัวอย่างทั่วไป
เครื่องหมายอัฒภาคเป็นเครื่องหมายทั่วไปเมื่อคุณเริ่มต้นใช้งานครั้งแรก
ดังนั้น หากคุณประกาศตัวแปรและกำหนดให้ตัวแปรห้าตัว แต่ไม่มีเครื่องหมายอัฒภาคในตอนท้าย นั่นเป็นข้อผิดพลาดทางไวยากรณ์
มีบางอย่างผิดปกติกับโครงสร้างนั้น
เหมือนกับว่าคุณจะใช้คำสั่ง printf และคุณพูดคำสั่ง printf ภายในเครื่องหมายคำพูดคู่
แต่คุณลืมเครื่องหมายคำพูดปิดท้าย
นั่นเป็นข้อผิดพลาดทางไวยากรณ์
และโดยทั่วไปแล้ว มีบางอย่างผิดปกติกับโครงสร้างนั้นในคอมไพเลอร์ เมื่อสแกนซอร์สโค้ดของคุณและพบข้อผิดพลาดนี้
มักจะให้คำอธิบายข้อผิดพลาดที่สามารถชี้คุณไปในทิศทางที่ถูกต้อง และมักจะให้หมายเลขบรรทัดด้วย
และเราได้เห็นมาแล้วในวิดีโอก่อนหน้านี้
ข้อผิดพลาดประเภทอื่นที่คอมไพเลอร์สามารถตรวจจับได้คือข้อผิดพลาดทางความหมาย
มันไม่ได้จับข้อผิดพลาดทางความหมายเสมอไปหากเป็นข้อผิดพลาดทางตรรกะ แต่ความหมายมักจะหมายถึงมีบางอย่างผิดปกติกับความหมาย
ความตั้งใจของโปรแกรม
ตัวอย่างเช่น หากคุณต้องเพิ่มตัวแปร A และ B สองตัว แต่ตัวแปรเหล่านั้นเป็นคนละประเภทกัน
และมันก็ไม่สมเหตุสมผลใช่ไหม
ไม่สมเหตุสมผลที่จะเพิ่ม A และ B
บางครั้งคอมไพเลอร์สามารถตรวจจับข้อผิดพลาดทางความหมายเหล่านี้ได้
ข้อผิดพลาดทางความหมายอื่นๆ เกี่ยวข้องกับตรรกะ และเราจะพูดถึงสิ่งเหล่านั้น
และคอมไพเลอร์ไม่พบสิ่งเหล่านั้นเสมอไป
โครงสร้างถูกต้องและทุกอย่างเรียบร้อยดีกับโครงสร้าง แต่มีบางอย่างไม่ถูกต้องในทางตรรกะ
มีข้อผิดพลาดในตรรกะของรหัส
ดังนั้นเมื่อคุณคิดถึงข้อผิดพลาดทางความหมาย สิ่งที่คอมไพเลอร์สามารถจับได้
มันเกี่ยวข้องกับการจับประเภทและสิ่งที่คุณไม่ควรทำมากกว่า โดยมีกฎต่างๆ ของภาษาที่เกี่ยวข้องกับประเภทตัวแปร
ทีนี้มาดูในโค้ดไลท์เพื่อดูตัวอย่างทั่วไปของข้อผิดพลาดทางไวยากรณ์และความหมายบางอย่างในภาษาโปรแกรม
C
ดังนั้นที่นี่เราอยู่ในแสงของรหัสด้วยแอปพลิเคชันประเภท Hello world ที่เรียบง่าย
นี่คือรหัสที่สร้างขึ้นสำหรับคุณจากการตั้งค่าโครงการของคุณ
หากคุณบันทึกเป็นเทมเพลต
รหัสง่ายมากใช่ไหม
และเมื่อคุณรวบรวมไฟล์นี้ มันจะบอกคุณว่าคุณมีข้อผิดพลาดในไวยากรณ์หรือไม่
คุณสามารถคลิกขวาอีกครั้งและคุณสามารถคอมไพล์ได้
และตอนนี้เราไม่มีข้อผิดพลาดใช่ไหม
แต่เราปฏิบัติตามกฎทั้งหมดในเชิงวากยสัมพันธ์
แต่ไวยากรณ์รวมถึงโครงสร้างทั้งหมดของรหัสอีกครั้ง
ดังนั้น หากคุณไม่มีเครื่องหมายอัฒภาคหรือคุณไม่มีสัญลักษณ์ปอนด์ก่อนเครื่องหมายรวม และคุณพยายามรวบรวมมัน
คุณจะเห็นว่ามีข้อผิดพลาดเกิดขึ้น และโดยปกติแล้วข้อผิดพลาดของคอมไพเลอร์จะมีความหมายบางอย่าง
ตอนนี้ เมื่อคุณเขียนโค้ดมากขึ้นเรื่อยๆ และฝึกฝนมากขึ้นเรื่อยๆ คอมไพเลอร์เหล่านี้จะไม่ดูงุ่มง่าม
พวกมันจะไม่อธิบายแบบละเอียดจนคุณคุ้นเคย เช่น ข้อผิดพลาดนี้บอกว่าเรามีข้อผิดพลาดในบรรทัดที่หนึ่ง
ใช่ไหม
และมันก็ดี
คุณสามารถดับเบิลคลิกที่นี้
มันจะไปที่ข้อผิดพลาดนั้น แต่มันบอกว่าคาดหวังเท่ากับรู้เครื่องหมายอัฒภาค
มันไม่ได้บอกคุณว่ามีอะไรผิดปกติ
คุณรู้ไหม จากการฝึกเขียนโปรแกรม คุณจะรู้ว่า โอ้ ฉันลืมสัญลักษณ์ปอนด์
ดังนั้นข้อผิดพลาดของคอมไพเลอร์บางอย่างจึงไม่อธิบายเท่าที่คุณต้องการหากคุณยังใหม่ต่อการเขียนโปรแกรม
คุณเพิ่มมัน เพิ่มสัญลักษณ์ปอนด์ คุณคอมไพล์ใหม่และคุณก็พร้อมที่จะไป
หากคุณสะกดคำว่า standard i o ผิด บางครั้งจะไม่สามารถค้นหาได้
ดังนั้นคุณบันทึกและคอมไพล์ใหม่ และคุณเห็นข้อผิดพลาดที่อธิบายเพิ่มเติมเล็กน้อย
ขวา?
ไม่มีไฟล์หรือไดเร็กทอรี Stdio ดังกล่าว h ที่บอกว่าคุณชอบ โอ้ บางทีคุณอาจสะกดผิด
การสะกดผิดจึงเป็นข้อผิดพลาดทั่วไป
คุณรู้ไหมว่าไม่ได้วางสิ่งต่าง ๆ ในมุมมองที่ถูกต้องในแง่ของวงเล็บที่ไม่ตรงกัน
คุณลืมวงเล็บ คุณรู้ไหมว่าคุณคอมไพล์ใหม่อีกครั้ง
มาดูกันว่าข้อผิดพลาดนั้นเป็นอย่างไร
อีกครั้งนั่นไม่ใช่คำอธิบายที่ยอดเยี่ยม
มันกำลังบอกว่า มันมีวงเล็บก่อนวงเล็บปีกกาลงท้าย เพราะมันไม่รู้ว่ามันคิดว่า
บางทีวงเล็บขวานี่น่าจะไปสิ้นสุดที่ไหนสักแห่งในนี้
ไม่สามารถบอกคุณได้อย่างแน่ชัดว่าเกิดอะไรขึ้น
ดังนั้นบางครั้งวงเล็บและวงเล็บปีกกาที่ขาดหายไปจึงไม่สามารถสื่อความหมายได้
แต่ถ้าคุณมีบางอย่าง เช่น เครื่องหมายอัฒภาคขาดหายไป นั่นก็ค่อนข้างตรงไปตรงมา
ข้อผิดพลาดในการคอมไพล์นั้นบอกคุณได้อย่างชัดเจนว่าเกิดอะไรขึ้น
เครื่องหมายอัฒภาคที่คาดไว้ก่อนหน้าประเภทการส่งคืนจะชี้คุณไปยังตำแหน่งที่คุณควรใส่เครื่องหมายอัฒภาคนั้น
ดังนั้นคุณสามารถดับเบิลคลิกที่นั้น ใส่เครื่องหมายอัฒภาคหากคุณไม่มีเครื่องหมายคำพูดคู่ และคอมไพล์ใหม่
ขวา?
ตอนนี้คุณเห็นบางสิ่งที่ระบุว่าขาดหายไป โดยยุติการอ้างคำพูดคู่
และอีกครั้ง มันชี้ให้คุณเห็นว่าคำพูดแรกเกิดขึ้นที่ใด และมันให้ข้อผิดพลาดหลายข้อ
ใช่แล้ว แม้ว่าคุณจะมีเพียงแค่อันเดียวจริงๆ
คุณมีคำพูดสองครั้งและคุณก็พร้อมที่จะไป
ตอนนี้หลักนี้บอกว่าคุณต้องส่งคืน int
จะเกิดอะไรขึ้นถ้าคุณพยายามส่งคืนสิ่งที่ต้องการภายในเครื่องหมายอัญประกาศคู่
อีกครั้ง คุณไม่ได้ทำตามโครงสร้างของภาษานั้น และโดยทั่วไปจะบอกว่าคุณกำลังส่งคืนตัวชี้อักขระจากประเภทฟังก์ชัน
อีกครั้ง ข้อผิดพลาดในการคอมไพล์เหล่านี้อาจไม่สมเหตุสมผลสำหรับคุณในตอนนี้ แต่เมื่อคุณเขียนโค้ดมากขึ้นเรื่อยๆ
มันก็จะสมเหตุสมผลมากขึ้น
แต่ทั้งหมดเกี่ยวกับการปฏิบัติตามโครงสร้างนั้น
ทีนี้ ถ้าคุณพยายามทำสิ่งต่าง ๆ ที่มันสมเหตุสมผลทางวากยสัมพันธ์ แต่ความหมายไม่ถูกต้อง
ตัวอย่างเช่น สมมติว่าเราพิมพ์ F แล้วลองดำเนินการเลขคณิต เช่น หารด้วยแปดหรือหารด้วยเจ็ด
เราบันทึกและรวบรวม และตอนนี้เราเห็นข้อผิดพลาดทางความหมายมากขึ้นที่เรามีสัญลักษณ์หารหลังเครื่องหมายอัญประกาศคู่
คุณทราบตำแหน่งที่คาดว่าจะใช้เครื่องหมายอัฒภาค C เป็นหลัก เราจะพบข้อผิดพลาดทางไวยากรณ์ ข้อผิดพลาดทางความหมาย
ความหมายของรหัสมักเกี่ยวข้องกับตรรกะ
ไม่พบข้อผิดพลาดทางความหมายที่เกิดขึ้นในภาษาเช่น C บวกบวกเมื่อคุณใช้
วัตถุ
ดังนั้นให้ระวังข้อผิดพลาดทางไวยากรณ์จากคอมไพเลอร์
เรื่องทั่วไปที่สะกดผิด
คีย์เวิร์ดที่ไม่ได้ลงท้ายด้วยวงเล็บเมื่อคุณเริ่มบล็อกของโค้ดเมื่อคุณไม่มีบล็อกสิ้นสุดและเริ่มต้น
และคุณสามารถมีข้อผิดพลาดหลายรายการได้ใช่ไหม
สมมติว่าเราพูดว่าเรามี Hello world
เราขาดเครื่องหมายอัฒภาค
เรากำลังส่งคืนสตริง
คุณรู้ไหม เราขาดตัวยึด และเราสร้างมันขึ้นมา
และนี่เป็นโปรแกรมที่ค่อนข้างเล็ก
แต่เมื่อเราพยายามคอมไพล์ตอนนี้ เราเห็นข้อผิดพลาดหลายจุดใช่ไหม
ข้อผิดพลาดสองข้อ
และมันก็ค่อนข้างยุ่งยาก เช่น ฉันจะเริ่มตรงไหนดี?
โดยปกติสิ่งที่คุณจะทำคือคุณจะแก้ไขข้อผิดพลาดแรก เพราะบางครั้งข้อผิดพลาดเดียวอาจทำให้เกิดข้อผิดพลาดเพิ่มเติมได้
ดังนั้นคุณควรดูข้อผิดพลาดของคอมไพเลอร์ที่ด้านบนสุดและแก้ไขข้อผิดพลาดนั้นก่อนเสมอ
คุณต้องการแก้ไขหนึ่งในบรรทัดที่ห้าใช่ไหม
จากนั้นคุณอาจต้องการแก้ไขแล้วคอมไพล์ใหม่ จากนั้นอาจแก้ไขรายการในบรรทัดที่หกหลังจากนั้น
และตอนนี้ก็พูดว่าเจสัน
ตอนนี้คุณสามารถพูดว่าคืนค่าศูนย์ แต่ควรแก้ไขข้อผิดพลาดแรกก่อนที่จะแก้ไขข้อผิดพลาดที่ตามมา เพราะข้อผิดพลาดหนึ่งอาจทำให้เกิดข้อผิดพลาดอื่นได้
และอย่างไรก็ตาม โค้ดของเราจะมีข้อผิดพลาดอยู่เสมอ
แม้แต่โปรแกรมเมอร์ที่ช่ำชองที่สุดก็ยังมีข้อผิดพลาดทางไวยากรณ์
ดังนั้นจึงเป็นเรื่องปกติที่จะมีข้อผิดพลาด
สิ่งที่สำคัญจริงๆ คือการทำความเข้าใจข้อความที่มาจากคอมไพเลอร์เพื่อบอกวิธีแก้ไข
และอีกครั้งที่จะมาถึงในทางปฏิบัติ
เราจะพูดถึงเพิ่มเติมเกี่ยวกับคอมไพเลอร์ คอมไพเลอร์ทั่วไปในวิดีโอต่อๆ ไป แต่เพียงพยายามให้แน่ใจว่าคุณทำตามโครงสร้างของภาษาในขณะที่คุณเรียนรู้
ภาษาวากยสัมพันธ์ และอื่นๆ
ในการบรรยายถัดไป เราจะพูดถึงวิธีที่เราสามารถมีข้อผิดพลาดประเภทต่างๆ
ฉันพูดถึงข้อผิดพลาดทางตรรกะ
เราสามารถพูดคุยเกี่ยวกับคำเตือนได้เล็กน้อย
เราจะพูดถึงข้อผิดพลาดของตัวเชื่อมโยงและข้อผิดพลาดรันไทม์ด้วย
ขอบคุณ