Contents

ความรู้เบื้องต้นเกี่ยวกับฟังก์ชัน C

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

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

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

ฟังก์ชั่นในภาษา C คืออะไร?

/th/images/an-introduction-to-c-functions.jpg

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

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

ฟังก์ชั่น: การประกาศ การกำหนด และการโทร

การใช้ฟังก์ชันต่างๆ ขึ้นอยู่กับองค์ประกอบสำคัญ 3 ประการ ซึ่งทำหน้าที่เป็นรากฐานสำคัญในการใช้งาน

ประกาศฟังก์ชั่น

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

 return_type function_name(parameters); 

ที่ไหน:

ประเภทการส่งคืนของฟังก์ชันแสดงถึงการจัดหมวดหมู่ข้อมูลของค่าที่ส่งคืน ซึ่งอาจครอบคลุมโครงสร้างข้อมูล C ที่ถูกต้องตามกฎหมาย หรืออาจประกอบด้วยค่าว่างหากฟังก์ชันไม่ให้ค่าผลลัพธ์

ตัวระบุที่กำหนดให้กับเอนทิตีด้านการทำงานทำหน้าที่เป็นการกำหนดสำหรับฟังก์ชันดังกล่าว ซึ่งอำนวยความสะดวกในการเรียกใช้งานในช่วงหัวเลี้ยวหัวต่อในอนาคต

พารามิเตอร์อินพุตของฟังก์ชันจะแสดงเป็นรายการและประกอบด้วยประเภทข้อมูลพร้อมกับชื่อพารามิเตอร์ที่คั่นด้วยเครื่องหมายจุลภาค รายการนี้เรียกว่า"พารามิเตอร์"และทำหน้าที่เป็นข้อบ่งชี้ข้อกำหนดอินพุตสำหรับฟังก์ชัน

ตัวอย่างเช่น นี่คือการประกาศฟังก์ชันง่ายๆ:

 int add(int a, int b); 

คำจำกัดความของฟังก์ชัน

เมื่อมีการเรียกใช้ฟังก์ชัน มันจะดำเนินการตามคำแนะนำที่ระบุไว้ในการประกาศ ซึ่งครอบคลุมถึงตัวระบุ ประเภทการส่งคืน รายการพารามิเตอร์ และโค้ดที่ควบคุมการดำเนินการของฟังก์ชัน ไวยากรณ์เป็นไปตามโครงสร้างนี้:

 return_type function_name(parameters) {
    // Function body - code that defines what the function does
    // Return a value if applicable
    return value;
} 

มาแบ่งส่วนของไวยากรณ์กัน:

คลังข้อมูลของคำสั่งที่อยู่ในวงเล็บปีกกา { } ถือเป็นส่วนเนื้อหาของฟังก์ชัน ซึ่งประกอบด้วยชุดคำสั่งที่อธิบายลักษณะพฤติกรรมของฟังก์ชันเมื่อมีการเรียกใช้

คำสั่ง return ถูกใช้เมื่อฟังก์ชันส่งกลับค่าที่มีชนิดข้อมูลที่ไม่เป็นโมฆะ วัตถุประสงค์ของข้อความนี้คือเพื่อถ่ายทอดมูลค่าที่ส่งคืนกลับไปยังฝ่ายที่เรียก เพื่อให้แน่ใจว่าสอดคล้องกับประเภทการส่งคืนที่กำหนด

แน่นอนว่า นี่คือรูปแบบการประกาศฟังก์ชันที่สวยงามในภาษาอังกฤษ:pythondef ทักทาย(ชื่อ):print(“Hello,"+ name + “!”)

 int add(int a, int b) {
    int sum = a \+ b;
    return sum;
}

การเรียกใช้ฟังก์ชัน

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

 return_type result = function_name(arguments); 

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

เมื่อฟังก์ชันส่งคืนค่าด้วยชนิดข้อมูลที่ไม่เป็นโมฆะ ฟังก์ชันอาจใช้ตัวแปรของชนิดข้อมูลที่เหมาะสมเพื่อจับค่าที่ส่งคืน

นี่คือตัวอย่างของการเรียกใช้ฟังก์ชัน:

 #include <stdio.h>

// Function prototype
int add(int a, int b);

int main() {
    int x = 5, y = 3;

    // Call the function and store the result in 'sum'
    int sum = add(x, y);
    printf("The sum of %d and %d is %d\n", x, y, sum);
    return 0;
}

// Function definition
int add(int a, int b) {
    return a \+ b;
} 

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

พารามิเตอร์ฟังก์ชันและค่าส่งคืน

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

มีสองวิธีในการส่งพารามิเตอร์

###ผ่านความคุ้มค่า

ในวิธีการนี้ เมื่อมีการเรียกใช้ฟังก์ชัน ฟังก์ชันจะถ่ายโอนค่าของอาร์กิวเมนต์จริงไปยังพารามิเตอร์ที่เกี่ยวข้อง การเปลี่ยนแปลงที่เกิดขึ้นกับพารามิเตอร์ภายในฟังก์ชันไม่มีผลกระทบต่ออาร์กิวเมนต์เริ่มต้น

ตัวอย่างเช่น:

 #include <stdio.h>

int square(int num) {
    num = num * num;
    return num;
}

int main() {
    int x = 5;
    int y = square(x);

    // Output: x and y after function call: 5 25
    printf("x and y after function call: %d %d\n", x, y);

    return 0;
} 

ฟังก์ชันสี่เหลี่ยมยอมรับอินพุตตัวเลขที่แสดงโดยตัวแปร"num"

ฟังก์ชัน square ใช้ตัวเลขเป็นอินพุต คำนวณรากที่สอง แก้ไขตามนั้น และส่งกลับผลลัพธ์ที่อัปเดต

วัตถุประสงค์หลักของรหัสนี้คือการประกาศตัวแปร “x” ซึ่งเริ่มแรกกำหนดค่าเป็นจำนวนเต็ม

โค้ดดำเนินการโดยการเรียกใช้ฟังก์ชัน square และระบุค่า x เป็นอาร์กิวเมนต์ การดำเนินการนี้จะตามมาด้วยการกำหนดเอาต์พุตผลลัพธ์ให้กับตัวแปรรองที่ชื่อ y

หลังจากการเรียกใช้ฟังก์ชัน ฟังก์ชันหลักจะส่งเอาต์พุตค่า x และ y ออกมาในภายหลัง ค่าตัวเลขของ x ยังคงไม่เปลี่ยนแปลงอันเป็นผลมาจากการแก้ไขพารามิเตอร์’num’ภายในการดำเนินการที่แสดงด้วย’กำลังสอง’เนื่องจากการปรับดังกล่าวไม่มีผลกระทบต่อสถานะเริ่มต้นของ x

ผ่านการอ้างอิง

โดยการส่งที่อยู่หน่วยความจำ (เช่น ตัวชี้) ของตัวแปรไปยังฟังก์ชัน การแก้ไขใดๆ ที่ทำกับตัวแปรดังกล่าวภายในขอบเขตของฟังก์ชันนั้นก็จะสะท้อนให้เห็นในสถานะดั้งเดิมที่อยู่นอกเหนือขอบเขตของฟังก์ชันด้วย

ความแตกต่างที่โดดเด่นประการหนึ่งระหว่างภาษาโปรแกรม C และภาษาต่างๆ เช่น Python อยู่ที่การใช้พอยน์เตอร์ รวมถึงฟังก์ชันของพวกมันเป็นอาร์กิวเมนต์

 #include <stdio.h>

void square(int *num) {
    *num = *num * *num;
}

int main() {
    int x = 5;
    square(&x);

    // Output: x after function call: 25
    printf("x after function call: %d\n", x);
    return 0;
} 

ฟังก์ชัน Square ยอมรับตัวชี้จำนวนเต็มเป็นอาร์กิวเมนต์อินพุต ซึ่งแสดงโดยตัวแปร"num"ฟังก์ชันนี้ไม่ให้ผลตอบแทนใดๆ

ฟังก์ชัน square รับตัวเลขเป็นอินพุต คำนวณกำลังสองด้วยการคูณด้วยตัวมันเอง จากนั้นอัปเดตค่าที่จัดเก็บไว้ในหน่วยความจำที่ชี้ไปโดยอาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันโดยใช้ตัวดำเนินการ Dereference (\*)

วัตถุประสงค์หลักของข้อมูลโค้ดนี้คือเพื่อสร้างตัวแปรจำนวนเต็มใหม่ชื่อ"x"และกำหนดค่าเริ่มต้นเป็น 5

รหัสจะดำเนินการโดยการยกเลิกการอ้างอิงตัวชี้ไปที่ x และส่งที่อยู่ของมัน ซึ่งได้รับจากการใช้ที่อยู่ของตัวดำเนินการ & เพื่อเป็นอาร์กิวเมนต์ของฟังก์ชัน square()

หลังจากการเรียกใช้ฟังก์ชัน"กำลังสอง"ลำดับการดำเนินการหลักจะดำเนินการพิมพ์ค่าปัจจุบันของตัวแปร’x’ซึ่งได้รับการอัปเดตภายในฟังก์ชัน และตอนนี้เก็บค่าตัวเลขไว้ที่ยี่สิบห้า การแก้ไขพารามิเตอร์’*num’ดั้งเดิมโดยฟังก์ชัน"square"ทำให้เกิดผลลัพธ์นี้สำหรับตัวแปร’x'

โดยพื้นฐานแล้ว ความแตกต่างหลักระหว่างสองแนวทางนี้อยู่ที่ผลกระทบต่อค่าดั้งเดิมภายนอกฟังก์ชัน เมื่อมีการแก้ไขพารามิเตอร์ภายในฟังก์ชัน วิธีการส่งผ่านค่าส่งผลให้เกิดการสร้างแบบจำลอง ในขณะที่การส่งผ่านโดยการอ้างอิงหรือตัวชี้ทำให้สามารถจัดการค่าเริ่มต้นได้โดยตรง

ภาษาโปรแกรมอื่นๆ มักจะมีคำที่เทียบเท่ากับพอยน์เตอร์ของ C อย่างไรก็ตามฟังก์ชันการทำงานมีแนวโน้มที่จะมีความก้าวหน้ามากขึ้น ตัวอย่างเช่น ภาษา C# ให้การสนับสนุนตัวแปร “out” เพื่อเป็นวิธีการระบุว่าค่าควรถูกส่งผ่านโดยการอ้างอิง ไม่ใช่ตามค่า

ฟังก์ชั่นเป็นโมฆะ

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

นี่คือตัวอย่างของฟังก์ชันโมฆะ:

 #include <stdio.h>

// Void function with no parameters
void greet() {
    printf("Hello, All Things N!");
}

int main() {
    // Call the void function, output: "Hello, All Things N!"
    greet();

    return 0;
} 

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

สำรวจฟังก์ชั่นในการเขียนโปรแกรม C

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

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