עבור לתוכן

C (שפת תכנות)

תגובה מומלצת
צוות האתר אישר תגובה זו וניתן לסמוך על התוכן הנכתב בה.

יוצר/ת האשכול MargotRobbie
  • יניב
  • 10
  • 772 הודעות
(נערך)

C

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

שפת C היא אחת משפות התכנות הנפוצות בעולם[1]. קיימים מהדרים לשפת C עבור כמעט כל סוגי המחשבים ומערכות ההפעלה. שפת C השפיעה על שפות תכנות רבות, ובמיוחד על C++‎, שנכתבה בתחילה כקדם מעבד עבור C, וכיום היא כמעט מכילה את שפת C. רוב שפות התכנות הנפוצות כיום כוללות מאפיינים תחביריים המזכירים את שפת C.

היסטוריה

שפת C תוכננה ופותחה לראשונה בין שנת 1969 לראשית שנות ה-70 (עד 1973). השפה נוצרה על ידי דניס ריצ'י, במעבדות חברת בל על מערכות ההפעלה UNIX שרצו על מחשבי PDP-11. מהר מאוד היא התפשטה ויצאה לאור ויצאו מספר גרסאות שונות לשפה אשר נבדלו בהבדלים קטנים זו מזו. הצורך בשפה עלה לשם כתיבת מערכת הפעלה. באותה עת הייתה קיימת שפת B, ובאמצעותה נכתבה שפת C בתחילה.

מקור השם של השפה הוא באותה שפת B, תוך התקדמות אות אחת באלפבית, או האות הבאה אחרי B בשמה של BCPL.

תקנים

שפת C היא שפה בעלת תקן פתוח המנוהל על ידי ANSI ו-ISO. העדכון האחרון לתקן נעשה בשנת 2011, ונקרא בפי משתמשי השפה "C11". התקן הראשון לשפה הונהג על ידי ANSI ב-1989 (נהוג להתייחס אליו כ-"ANSI C" או "C89") ואומץ על ידי ISO ב-1990 (בשינוים מינוריים, ולתקן הזה מתייחסים כ-"C90"). תקן נוסף לשפה הוגדר בשנת 1999, ונקרא C99.

ממציא השפה, דניס ריצ'י, ובריאן קרניגהאן, כתבו את הספר "The C Programming Language", המתעד את השפה ומהווה תקן נוסף, ראשון ולא רשמי, לשפה. מתייחסים לתקן הזה לפעמים כ-"K&R" על פי האותיות הראשונות של שמות המשפחה של מחבריו. מהדורה שנייה של הספר מתייחסת לתקן C89.

לדוגמה, לפי תקן ANSI, שפת C חייבת לתמוך בתכונות הבאות:

  • עד 31 פרמטרים לפונקציה.
  • עד 509 תווים בשורת קוד.
  • עד 32 רמות קינון קוד.
  • הערך המקסימלי משתנה מסוג long int, לא יפחת מ: 2,147,483,647.

מודולים

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

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

#include <string.h>

פונקציות

פונקציות[]

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

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

int max(int a, int b)

{

if (a > b)

return a;

else

return b;

}

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

printf("%d", max(5, 3));

תדפיס את המספר 5, כי הוא המספר הגבוה יותר מבין המספרים 3 ו-5.

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

מאפיינים

שפת C הינה שפה פרוצדורלית, בעלת טיפוסיות סטטית, חלשה, ולא בטוחה.

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

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

שפת C היא שפה ה"מחזיקה את עצמה" (self hosting). כלומר, קיימים מהדרים לשפת C הכתובים אף הם בשפת C (לכך ניתן להגיע בתהליך הנקרא Bootstrapping).

התנהגות לא מוגדרת:

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

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

מושגים בשפת C

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

int x; // משתנה זה יאותחל רק אם הוא גלובלי .int מטיפוס x הגדרה של משתנה בשם

int y = 5; // משתנה זה יאותחל לערך 5 .int מטיפוס y הגדרה של משתנה בשם

extern int z; // המוגדר בחלק אחר בתוכנית .int מטיפוס z הצהרה על קיומו של משתנה גלובלי בשם

למשתנים בשפת C ישנו ערך הניתן לשינוי.

ישנן ארבע קטגוריות של משתנים:

  1. משתנים מקומיים (לוקליים). משתנים אלה שייכים לפונקציה, ומוגדרים אך ורק בבלוק הקוד הנוכחי - בין סוגריים מסולסלות. ברגע שהתוכנית יוצאת מהבלוק שבו הוגדרו (למשל בין קריאות שונות לפונקציה), הם אינם קיימים יותר. לא ניתן, למשל, להתייחס מפונקציה אחת למשתנה שהוגדר בפונקציה אחרת. משתנים מסוג זה אינם מאותחלים על ידי המהדר, אלא במפורש על ידי המתכנת, או כלל לא. אם לא אותחל, הערך התחלתי של המשתנה הוא נתון שרירותי כלשהו (ערך התחלתי כזה מכונה לעתים זבל. הוא אינו מוגדר, אך לרוב יכיל את מה שהכיל האזור הזה בזיכרון לפני היווצרות המשתנה).
  2. משתנים מקומיים סטטיים. אל משתנים אלה ניתן לגשת רק מתוך הפונקציה והבלוק שבהם הם הוגדרו, אך אורך החיים שלהם הוא כאורך חיי התוכנית - הם שומרים על ערכם בין קריאות שונות לפונקציה, למשל.
  3. משתנים גלובליים. אלה מוגדרים בכל הקבצים שבהם קיימת הצהרה עליהם. ניתן להגדיר משתנה גלובלי רק בקובץ בודד; על מנת לגשת אליו מקובץ נפרד יש להצהיר על קיומו.
  4. משתנים גלובליים סטטיים. אלה מוגדרים אך ורק בתוך קובץ יחיד, ולא ניתן להתייחס אליהם מקבצים אחרים.

מבני בקרה

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

פקודת תנאי[]

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

if (x < 5)

printf("three is lower than five");

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

if (number_of_apples < 10) {

printf("I am hungry!");

printf("Give me more apples!");

}

לפקודת תנאי ישנה גרסה מורחבת, המאפשרת להגדיר רצף של פקודות שיתבצע במקרה שהתנאי איננו מתקיים. לשם כך משתמשים במילה השמורה else ("אחרת", באנגלית):

if (number_of_apples < 10)

printf("I am hungry");

else

printf("I am not hungry!");

לולאות

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

ב־C קיימים שלושה סוגי לולאות: לולאות while שמבוססות על בדיקת תנאי להמשך הלולאה לפני ביצוע הקוד, לולאות do-while שדומות ללולאות while, אך התנאי נבדק בסוף הלולאה, ולולאות for, שבנוסף לבדיקת התנאי גם משלבות בצורה טבעית משתני עזר שיפקחו על ריצת הלולאה (למשל, ספירת מספר הפעמים שהלולאה חזרה על עצמה). לולאת for:

int i;

for (i = 0 ; i < 5 ; i++) {

/* הכנס כאן קוד... */

}

לולאת while עם בקרה בכניסה:

while (/* הכנס כאן תנאי */) {

/* הכנס כאן קוד... */

}

לולאת do-while עם בקרה ביציאה:

do {

/* הכנס כאן קוד... */

} while (/* הכנס כאן תנאי */);

GOTO

שפת C כוללת אפשרות להורות למעבד לקפוץ ישירות לביצוע של פקודה מסוימת, לה הוגדר שם (label) בעזרת פקודת goto.

בקוד להלן, הפקודה המסומנת "2" לא תתבצע כלל:

printf("a"); /* 1 */

goto out;

printf("b"); /* 2 */

out:

printf("c"); /* 3 */

ניתן לקפוץ באמצעות goto אך ורק בתוך הפונקציה הנוכחית.

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

  • קפיצה החוצה מלולאה בתוך לולאה (במקרה כזה פקודת break בודדת איננה מספיקה)
  • קפיצה אל קוד המבצע שחרור משאבים
  • מימוש של אוטומט סופי דטרמיניסטי
נערך על ידי MargotRobbie
קישור ישיר להודעה
שתף באתרים אחרים

  • תגובות 16
  • נוצר
  • תגובה אחרונה

משתמשים מובילים באשכול זה

משתמשים מובילים באשכול זה

DMatriX
  • דור אזולאי
  • 144
  • 1.5k הודעות

אמן.

קישור ישיר להודעה
שתף באתרים אחרים

Allison
  • שחר
  • 582
  • 2.4k הודעות

ישתבח שמו לעד

קישור ישיר להודעה
שתף באתרים אחרים

GandalFlelele
  • Ben
  • 11
  • 271 הודעות

אמן

קישור ישיר להודעה
שתף באתרים אחרים

Zpower
  • זיו
  • 153
  • 2.7k הודעות

כל הכבוד על המדריך! אני כרגע מתמקד בלתרגל את javascript שסיימתי ללמוד ולאחר מכן אני אלמד C#.

גם היא מאוד דומה ל-C, תודה רבה! היה תענוג לקרוא.

קישור ישיר להודעה
שתף באתרים אחרים

יוצר/ת האשכול MargotRobbie
  • יניב
  • 10
  • 772 הודעות
כל הכבוד על המדריך! אני כרגע מתמקד בלתרגל את javascript שסיימתי ללמוד ולאחר מכן אני אלמד C#.

גם היא מאוד דומה ל-C, תודה רבה! היה תענוג לקרוא.

C# ממש לא דומה לC.

לעומת זאת Java דומה מאוד לC#.

קישור ישיר להודעה
שתף באתרים אחרים

Trokar
  • guri
  • 14
  • 454 הודעות

נראה מסובך... ותע"ה הסכלתי משהו

קישור ישיר להודעה
שתף באתרים אחרים

יוצר/ת האשכול MargotRobbie
  • יניב
  • 10
  • 772 הודעות
נראה מסובך... ותע"ה הסכלתי משהו

תודה!

יש לך שלל מדריכים שיהפכו את החוויה שלך בתכנות ממסובכת לקלילה או לפחות בינונית להבנה.

קישור ישיר להודעה
שתף באתרים אחרים

Trokar
  • guri
  • 14
  • 454 הודעות
תודה!

יש לך שלל מדריכים שיהפכו את החוויה שלך בתכנות ממסובכת לקלילה או לפחות בינונית להבנה.

אולי אני אתחיל ללמוד קצת.. מכיר מישהו טוב ב-Youtube שמסביר באנגלית ?

קישור ישיר להודעה
שתף באתרים אחרים

יוצר/ת האשכול MargotRobbie
  • יניב
  • 10
  • 772 הודעות
אולי אני אתחיל ללמוד קצת.. מכיר מישהו טוב ב-Youtube שמסביר באנגלית ?

TheNewBoston

קישור ישיר להודעה
שתף באתרים אחרים

Trokar
  • guri
  • 14
  • 454 הודעות
TheNewBoston

תודה :like:

קישור ישיר להודעה
שתף באתרים אחרים

lol2k
  • 10
  • 254 הודעות

פשוט עשית העתק הדבק מויקיפדיה. במקום לפתוח אשכול על c פשוט תיתן קישור לעמוד של זה בויקיפדיה.

קישור ישיר להודעה
שתף באתרים אחרים

Zpower
  • זיו
  • 153
  • 2.7k הודעות
פשוט עשית העתק הדבק מויקיפדיה. במקום לפתוח אשכול על c פשוט תיתן קישור לעמוד של זה בויקיפדיה.

את האשכול על html הכנתי לבד מ-0 :)

מוזמן להסתכל :)

וליניב יש אחלה אשכול זה יותר מסודר מוויקיפדיה

קישור ישיר להודעה
שתף באתרים אחרים

lol2k
  • 10
  • 254 הודעות
את האשכול על html הכנתי לבד מ-0 :)

מוזמן להסתכל :)

וליניב יש אחלה אשכול זה יותר מסודר מוויקיפדיה

ראיתי כבר. הכנת אחלה מדריך. :like:

קישור ישיר להודעה
שתף באתרים אחרים

יוצר/ת האשכול MargotRobbie
  • יניב
  • 10
  • 772 הודעות
ראיתי כבר. הכנת אחלה מדריך. :like:

כמו שזיו אמר המדריך יותר מסודר.

בנוסף,בקרוב אשכול על c#

קישור ישיר להודעה
שתף באתרים אחרים

התחבר או הרשם על מנת להגיב.

עליך להיות משתמש רשום על מנת להגיב

צור חשבון

צור חשבון חדש בקהילה בקלי קלות.

רישום חשבון חדש

התחבר

משתמש קיים? התחבר.

התחבר עכשיו

תתי פורומים

בפורום זה אין תתי פורומים

מנהלי הפורום

בפורום זה אין מנהלים

אולי יעניין אותך גם

×
×
  • צור חדש...