# C (שפת תכנות)

### מתוך ויקיפדיה, האנציקלופדיה החופשית

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

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

## [עריכה] מאפייני שפת C

שפת C תוכננה לראשונה על ידי דניס ריצ'י במעבדות בל על מערכות UNIX שרצו על מחשבי PDP-11. הצורך בשפה עלה לשם כתיבת מערכת הפעלה. באותה עת הייתה קיימת שפת ה-B, ובאמצעותה נכתבה שפת C בתחילה. כאשר התפתחה שפת C, הגיעה למצב בו המהדר בו מהדרים את השפה כתוב אף הוא בשפת C עצמה, תהליך הנקרא Bootstrapping. מקור השם של השפה הוא באותה שפת B, תוך התקדמות אות אחת באלפבית.

כיום C אינה קשורה למערכת הפעלה מסוימת או מחשב מסוים.
רוב הגרעין (Kernel) של מערכת ההפעלה לינוקס כתוב ב-C, כמו גם הרבה תוכנות אחרות המהוות את מערכת ההפעלה GNU/Linux.

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

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

## [עריכה] "Hello World" בשפת C

תוכנית פשוטה זו מדפיסה את המחרוזת "!Hello, World" לפלט הסטנדרטי.

     #include <stdio.h>
     int main(void)
     {
        printf("Hello, World!\n");
        return 0;
     }

## [עריכה] מושגים בתכנות ומימושם בשפת C

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

  לדוגמה, הגדרת משתנה מסוג `int`, המייצג מספר שלם בן ארבעה בתים:

     int x;

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

  לדוגמה, מצביע למשתנה מסוג `short`, או מערך של מספרים מסוג זה, שהוא משתנה המייצג מספר שלם בן שני בתים:

     short *x;

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

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

  לדוגמה, איתחול משתנה מסוג `char`, המייצג תו בייצוג ASCII:

     char ch = 'a';

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

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

     float n[5];

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

     double n[] = {3.14, 2.71, 0.8, 5, 32};

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

  לדוגמה, רשומה (או מבנה) המתארת שם וגיל של אדם. היא מכילה שני שדות:

     struct person {
       char *name;
       int age;
     };

- מחרוזת - לא קיימת בשפת C כטיפוס בודד אלא כמערך של תווים. מחזורת בגודל n צורכת מקום של n+1 משום שמצטרף תו 0 (0\ או NULL). הטיפול במחרוזת נעשה על ידי פונקציות של הספריה הסדרתית.

  לדוגמה, המחרוזת

     char *name = "John";

  השקולה למערך

     char name[] = {'J', 'o', 'h', 'n', '\0'};

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

  לולאת `for`:

     int i;
     for (i=0; i < 5; i++) {
       /*your code here... */
     }

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

     while (/*some boolean condition*/) {
       /*your code here... */
     }

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

     do {
       /*your code here... */
     } while (/*some boolean condition*/);

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

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

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

- הערה - שימוש בשפה המדוברת להסברת שלבי התוכנית. אינו משפיע על ריצת התוכנית עצמה, אך הכרחי להבנתה בידי מתכנתים אחרים או בזמן מאוחר יותר. (מופיע בין התווים /* */). ראה דוגמאות למעלה.
- ספריה - אוסף של פקודות המאוגדות יחד במקום אחד המאפשר לנו להשתמש בהן ללא צורך לכתיבתן מחדש. בשפת C יש צורך לבצע פקודת include# לקובץ שמכיל את ההגדרה של הספריה בשביל להשתמש בה.

  לדוגמה, הכללת הספריה `string`, המכילה פונקציות לטיפול במחרוזות:

     #include <string.h>

  לפני תרגום התוכנית לשפת מכונה, תוכנית הנקראת "קדם מעבד" (pre-processor) יוצרת קובץ חדש הכולל בנקודה בה מוכרזת ההכללה את תוכן הקובץ המוכלל, ואז מועבר הקובץ להידור לשפת מכונה.

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

## [עריכה] ראו גם

- מונחים בתוכנה
- C++‎

## [עריכה] קישורים חיצוניים

מיזמי קרן ויקימדיה |  |
ספר לימוד בוויקיספר: שפת C

- מדריך בשפת C, אתר איתן
- קורס C שניתן באוניברסיטה העברית
- קורס C שניתן בחיפוקס, מועדון הלינוקס החיפאי
- מדריך שפת C באתר UnderWarrior

מקור: http://he.wikipedia.org../../../c/_/%28/C_%28%D7%A9%D7%A4%D7%AA_%D7%AA%D7%9B%D7%A0%D7%95%D7%AA%29.html

קטגוריה: שפות תכנות

##### Views

- ערך
- שיחה
- גרסה נוכחית

##### קהילה

- שער הקהילה
- עזרה
- דלפק ייעוץ
- מזנון
- יצירת קשר
- ספר אורחים

##### חיפוש

##### שפות אחרות

- English
- Afrikaans
- አማርኛ
- Aragonés
- العربية
- Asturianu
- Azərbaycan
- Беларуская
- Български
- Bosanski
- Català
- Česky
- Dansk
- Deutsch
- Ελληνικά
- Esperanto
- Español
- Eesti
- Euskara
- Suomi
- Français
- Gaeilge
- Galego
- Hrvatski
- Magyar
- Interlingua
- Bahasa Indonesia
- Íslenska
- Italiano
- 日本語
- 한국어
- Kurdî / كوردي
- Latina
- Lietuvių
- Latviešu
- Bahasa Melayu
- Nederlands
- Norsk (nynorsk)
- Norsk (bokmål)
- Polski
- Português
- Română
- Русский
- Srpskohrvatski / Српскохрватски
- Simple English
- Slovenčina
- Slovenščina
- Shqip
- Српски / Srpski
- Svenska
- தமிழ்
- ไทย
- Türkçe
- Українська
- Tiếng Việt
- 中文
- 粵語