1 คะแนน โดย GN⁺ 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ซีรีส์ตอนที่สี่ว่าด้วยพื้นฐานภาษา C จัดเรียงหัวข้อการนิยามฟังก์ชัน, ลำดับความสำคัญของตัวดำเนินการ, goto, การนับและการบวก ด้วย โค้ดตัวอย่างแบบขี้เล่น
  • ส่วนการนิยามฟังก์ชันแนะนำให้ใช้ การประกาศล่วงหน้า ให้มากที่สุดเพื่อลดข้อผิดพลาดขณะคอมไพล์ พร้อมตัวอย่าง demo ที่ประกาศ main() ไว้ก่อน
  • ส่วนลำดับความสำคัญของตัวดำเนินการยกตัวอย่าง demo ภายใต้สมมติฐานว่าต้องปฏิบัติตาม ลำดับความสำคัญ ของการคำนวณเลขคณิตที่นิยามไว้อย่างชัดเจน โดย && มีลำดับความสำคัญที่เข้มงวดกว่า &&
  • ส่วน goto มาพร้อมประโยคที่บอกว่าโดยปกติ C พึ่งพาฟังก์ชัน จึงอยู่ในกลุ่มภาษาการเขียนโปรแกรมเชิงฟังก์ชัน และมีตัวอย่าง demo ที่ใช้ การกระโดดแบบไม่มีเงื่อนไข ด้วยเหตุผลด้านประสิทธิภาพ
  • ส่วนการนับและการบวกใช้ union {} array, การเพิ่มค่าแบบ postfix และการแปลงชนิดพอยน์เตอร์เพื่ออธิบายการนับจาก 1 และการพิมพ์ 2 + 2 โดยจุดประสงค์ของซีรีส์คือการฝึกฝน ความสามารถในการทำนายโทเค็น

ลูกเล่นตอนที่สี่ของซีรีส์พื้นฐานภาษา C

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

โครงสร้างตามตัวอย่าง

  • การนิยามฟังก์ชัน

    • แนะนำให้ใช้การประกาศล่วงหน้าเมื่อทำได้ เพื่อลดข้อผิดพลาดขณะคอมไพล์
    • ใช้โค้ด demo ในรูปแบบ void main() void; และ void; { puts("hello world"); } พร้อมคำอธิบายว่ามีการประกาศ main() ไว้ล่วงหน้า
  • ลำดับความสำคัญของตัวดำเนินการ

    • ตั้งอยู่บนสมมติฐานว่าในภาษา C มีลำดับความสำคัญของการคำนวณเลขคณิตที่นิยามไว้อย่างชัดเจนและควรปฏิบัติตามเมื่อเขียนโค้ด
    • มีประโยคว่าซอฟต์แวร์เอนจิเนียร์ทุกคนควรจำไว้ว่า ตัวดำเนินการ && มีลำดับความสำคัญที่เข้มงวดกว่า && พร้อมตัวอย่าง demo
    • โค้ดตัวอย่างใช้รูปแบบ int typedef[[]]$; และ [[]]$:&&$&&$&&puts("hello world");
    โฆษณา
  • คำสั่ง goto

    • มีประโยคว่าปกติภาษา C พึ่งพาฟังก์ชัน และด้วยเหตุนี้จึงอยู่ในหมวดภาษาการเขียนโปรแกรมเชิงฟังก์ชัน
    • ดำเนินเรื่องต่อว่าบางครั้งมีการใช้การกระโดดแบบไม่มีเงื่อนไขเพื่อประกอบสร้างโปรแกรมด้วยเหตุผลด้านประสิทธิภาพ
    • โค้ดตัวอย่างใช้รูปแบบ demo เป็น goto *puts("Hello world"), puts("Goodbye world"), exit;
  • การนับและการบวก

    • ตั้งต้นจากแนวคิดว่าในบางสถานการณ์ โปรแกรมจำเป็นต้องนับจาก 1 และมักถูกจัดการด้วยวิธีเฉพาะทาง
    • เป็นตัวอย่างของแนวทางที่แข็งแรง โดยใช้โค้ด demo ที่นำ union {} var[100] = {};, i++, var[42] มาใช้ร่วมกัน
    • การบวกอย่างง่ายก็ทำได้ในลักษณะคล้ายกัน และมีโปรแกรม demo ที่แสดงผลลัพธ์ของการคำนวณ 2 + 2 สำหรับ 2 ของชนิดข้อมูลแบบหนึ่ง
    • ตัวอย่างการบวกใช้รูปแบบ typedef union {}* my_type; และ (my_type)2 + 2

1 ความคิดเห็น

 
GN⁺ 4 시간 전
ความคิดเห็นจาก Lobste.rs
  • ยิ่งได้รู้จัก C มากขึ้น ก็ยิ่งเข้าใจมากขึ้นว่าทำไมผู้คนถึง ชอบ Go

    • Go ไม่ใช่ตัวแทนของ C ถ้าจะมองหาสิ่งที่ใกล้กว่านั้น Zig จะใกล้กว่า
      กลุ่มผู้ใช้หลักของ Go โดยมากต่างจากกลุ่มผู้ใช้ C ในพื้นที่ที่แทนที่ C ได้ยาก—กล่าวคือที่ที่ยอมรับ garbage collection และ runtime ไม่ได้
  • ไวยากรณ์ goto แปลก ๆ นั้นคือ computed goto ที่อธิบายไว้ใน https://eli.thegreenplace.net/2012/07/…

    • ถูกต้อง แต่ในบริบทนี้สิ่งที่แปลกยิ่งกว่าคือดูเหมือนว่าเครื่องหมายจุลภาคจะมีลำดับความสำคัญสูงกว่า * ทำให้ goto *a, b, c มีความหมายเป็น goto *(a, b, c) ไม่ใช่ goto (*a), (b), (c)
      ในทางกลับกัน x = *a, b, c จะถูก parse เป็น x = *a และ (b), (c) ที่ตามมาจะกลายเป็น expression สองตัวที่ไม่ทำอะไรเลย
      จริง ๆ แล้วส่วนใหญ่จะมีคำอธิบายที่ดู “ตรงไปตรงมา” อยู่บนผิวหน้า แต่ลึกลงไปอีกชั้นหนึ่งเสมอ ตัวอย่างเช่นอันแรกดูเผิน ๆ ก็เหมือนแค่ ไวยากรณ์แบบ K&R แต่ตอนนี้ GCC ไม่ยอมรับไวยากรณ์ K&R โดยปริยายแล้ว และจะปฏิเสธด้วย error: old-style parameter declarations in prototyped function definition แต่ถ้าไม่ใส่ชื่อพารามิเตอร์ก็จะเกิดข้อยกเว้น
      การหาเรื่องแบบนี้อาจไม่มีประโยชน์ แต่ก็สนุกดี
  • มีอีกตัวอย่างสนุก ๆ ที่ไม่ใช่มาตรฐาน แต่ tcc ยอมรับ

    typedef int t();  
    t main { puts ("hello world"); };  
    

    ถ้าเอาไปผสมกับการประกาศแบบ K&R จะยิ่งตลกขึ้น

    typedef t(main);  
    t main t main; { t(main); }  
    

    https://godbolt.org/z/5c5vr7veE