מבוא לפונקציות C

מבוא לפונקציות C
קוראים כמוך עוזרים לתמוך ב-MUO. כאשר אתה מבצע רכישה באמצעות קישורים באתר שלנו, אנו עשויים להרוויח עמלת שותף. קרא עוד.

אולי כיסת את תחביר C בסיסי, עם דוגמאות פשוטות, וכעת אתה תוהה כיצד ליצור תוכניות גדולות יותר בעולם האמיתי. בתור התחלה, תרצה לארגן את הקוד שלך לחלקים יעילים, עם מינימום חזרות. ב-C, כמו ברוב השפות, התשובה לבעיות שלך היא הפונקציה.





סרטון היום של MUO גלול כדי להמשיך עם התוכן

יצירה ושימוש בפונקציות ב-C היא פשוטה ומביאה יתרונות רבים. פונקציות מאפשרות לך לפרק תוכניות מורכבות לנתחים קטנים יותר. הם מספקים שימוש חוזר, הן בתוך התוכנית המקורית שלך, והן בספריות קשורות או תוכניות נפרדות אחרות.





כדי להתחיל, תצטרך ללמוד על הצהרות פונקציות, אבות טיפוס, פרמטרים והצהרות החזרה.





מהן פונקציות ב-C?

  מסך המציג קוד בשפת תכנות

בתכנות C , פונקציה היא קטע בעל שם של קוד שעושה משהו כשאתה מבקש ממנו. זה עוזר לשמור על הקוד שלך מאורגן ומאפשר לך להשתמש באותה פעולה מספר פעמים מבלי לחזור על עצמך.

הדוגמה הפשוטה ביותר היא כזו שכבר השתמשת בה: הפונקציה main() . הפונקציה הראשית מיוחדת במיוחד מכיוון שהיא משמשת כנקודת הכניסה הראשית לכל תוכנית C. אתה יכול גם להשתמש בפונקציות של ספרייה, שהן אלה שמישהו אחר כבר כתב, או שאתה יכול לכתוב פונקציות המוגדרות על ידי המשתמש שלך.



פונקציות: הצהרה, הגדרה והתקשרות

שלושת ההיבטים הללו הם בסיסיים לשימוש בפונקציות.

הצהרת פונקציה

זה מספק מידע על שם הפונקציה, סוג ההחזרה והפרמטרים של פונקציה, ומאפשר את השימוש בה לפני ההגדרה המלאה שלה. זה נקרא גם אב טיפוס של פונקציה. זה עוקב אחר התחביר הפשוט הזה:





 return_type function_name(parameters);

איפה:

  • return_type הוא סוג הנתונים של הערך שהפונקציה מחזירה. זה יכול להיות כל סוג נתונים C חוקי או בָּטֵל אם הפונקציה לא מחזירה ערך.
  • function_name הוא השם שאתה נותן לפונקציה. תשתמש בזה כדי לקרוא לפונקציה מאוחר יותר.
  • פרמטרים היא רשימה של פרמטרי קלט שהפונקציה מקבלת, אם יש כאלה. כל פרמטר מורכב מסוג נתונים ואחריו שם פרמטר מופרד בפסיקים.

לדוגמה, הנה הצהרת פונקציה פשוטה:





 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;
}

בואו נפרק חלקים מהתחביר:

גוף פונקציה : זהו גוש הקוד המוקף בסוגריים מסולסלים {} . הוא מכיל את ההוראות שמגדירות מה הפונקציה עושה כאשר היא נקראת.

הצהרת החזרה : אם לפונקציה יש סוג החזרה אחר מאשר בָּטֵל , ה לַחֲזוֹר הצהרה שולחת ערך חזרה למתקשר. ערך זה צריך להתאים לסוג ההחזרה שצוין.

הנה דוגמה פשוטה להגדרת פונקציה:

 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, מעדכנת את ערכו ומחזירה את הערך החדש הזה.
  • הפונקציה הראשית מכריזה על משתנה מספר שלם, איקס , ומקצה לו את הערך 5.
  • לאחר מכן הוא קורא לפונקציה הריבועית, ומעביר לה את הערך של x. הוא מקצה את התוצאה למשתנה שני, ו .
  • לאחר קריאת הפונקציה, main מדפיס את הערכים של 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;
}
  • ה כיכר הפונקציה לוקחת מצביע שלם ( int * ) פרמטר, על אחד . זה לא מחזיר ערך.
  • הפונקציה הריבועית מחשבת את הריבוע של הערך ש על אחד מכיל ומעדכן את הערך הזה באמצעות אופרטור ה-pointer dereference, * .
  • ה רָאשִׁי הפונקציה מכריזה על משתנה מספר שלם, איקס , ומקצה לו את הערך 5 .
  • לאחר מכן הוא קורא ל- כיכר פונקציה עם מצביע ל איקס באמצעות כתובת המפעיל: &איקס .
  • לאחר קריאת הפונקציה, main מדפיס את הערך של איקס , שהוא עכשיו 25 מאז השינויים ל *על אחד בתוך ה כיכר הפונקציה משפיעה על המקור איקס .

לסיכום, ההבדל העיקרי בין שתי השיטות הוא כיצד שינויים בפרמטר בתוך הפונקציה משפיעים על הערך המקורי מחוצה לה. מעבר לפי ערך יוצר עותק, בעוד מעבר לפי הפניה (מצביע) מאפשר מניפולציה ישירה של הערך המקורי.