שפת C/נספחים
טווחי טיפוסים שלמים
[עריכה]השפה קובעת שגודלו של char הוא בית אחד בדיוק. לגבי שאר הטיפוסים, השפה אינה מגדירה במדויק את גדלי וטווחי המשתנים. ברוב המחשבים, לדוגמה, משתנה שלם תופס 4 בתים, אך קיימים מעבדי 64-ביט שבהם משתנה שלם תופס 8 בתים. תקן השפה קובע לרוב רק טווחים מינימליים:
טיפוס בסיסי | גודל (בבתים) | ערך מינימלי (signed) | ערך מקסימלי (signed) | ערך מקסימלי (unsigned) |
---|---|---|---|---|
char | 1 | -128 | 127 | 255 |
short int | לפחות 2 | -32,768 | 32,767 | 65,535 |
int | לפחות 2 | -32,768 | 32,767 | 65,535 |
long int | לפחות 4 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 |
מילים שמורות
[עריכה]להלן פירוט של מילים שמורות, כלומר מילים שאין להשתמש בהן כשמות משתנים ופונקציות. מהפירוט למטה עולה שאין אחידות בנושא. חלק מהמילים הללו שמורות בכל המהדרים, חלק רק במהדרים חדישים מספיק, וחלק רק במהדרים שהחליטו על דעת עצמם שהמילים שמורות. כדאי בכל מקרה להמנע משימוש במילים אלה כשמות משתנים ופונקציות, גם אם המהדר בו אתה משתמש אינו מתייחס אליהן כך.
מילים שמורות סטנדרטיות
[עריכה]הרשימה הבאה מכילה מילים שמורות בכל מהדר תקני:
- auto
- break
- case
- char
- const
- continue
- default
- do
- double
- else
- enum
- extern
- float
- for
- goto
- if
- int
- long
- register
- return
- short
- signed
- sizeof
- static
- struct
- switch
- typedef
- union
- unsigned
- void
- volatile
- while
מילים שמורות חדשות
[עריכה]מילים אלה הוגדרו כשמורות בתקן חדש יחסית, C99. לא כל המהדרים מכירים בהן:
- _Bool
- _Complex
- _Imaginary
- inline
- restrict
מילים שמורות בחלק מהמהדרים
[עריכה]חלק מהמהדרים מכירים במילים אלה כמילים שמורות, למרות שלפי התקן אינן:
- asm
- cdecl
- far
- fortran
- huge
- interrupt
- near
- pascal
- typeof
מילים לא-שמורות במהדרים ישנים מאד
[עריכה]מהדרים ישנים עשויים לא להכיר במילים אלה כשמורות:
- const
- enum
- signed
- void
- volatile
כמובן שמהדרים ישנים-מאד אלה גם אינם מכירים במילים השמורות החדשות שראינו.
דגלי הידור
[עריכה]מהם דגלי הידור?
[עריכה]בתהליך הבניה, המהדר הופך את שורות הקוד שכתבנו לפקודות שאותן יכול המחשב לבצע. לרוב יש יותר מדרך אחת לבצע זאת. לדוגמה, לפעמים יכול המהדר לבנות מאותו קוד תוכנית קטנה אך איטית יחסית, או תוכנית מהירה אך גדולה יחסית. בזמן הבניה אפשר להודיע למהדר מהן העדפותינו.
דגלי ההידור
[עריכה]פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.
רוב המערכות תומכים בדגלי הידור רבים מאד. נציג כאן רק את החשובים שבהם. בדוגמאות שנראה, נניח שfile1.c ו-file2.c הם קבצי תוכניות שכתבנו.
- קביעת קובץ הפלט: הדגל
-o <file>
מודיע למהדר מה שם קובץ הפלט שיווצר לאחר ההידור.- gcc בלינוקס או Cygwin: ברירת המחדל בלינוקס היא a.out כאשר מדובר בקובץ ריצה, וקובץ עם שם זהה אם מדובר בהידור בלבד ללא קישור (ראו בהמשך). דוגמת שימוש:
gcc file1.c file2.c -o Program
- gcc בלינוקס או Cygwin: ברירת המחדל בלינוקס היא a.out כאשר מדובר בקובץ ריצה, וקובץ עם שם זהה אם מדובר בהידור בלבד ללא קישור (ראו בהמשך). דוגמת שימוש:
- קביעת רמת האזהרות:
- gcc בלינוקס או Cygwin: הדגל
-Wall
מסמן למהדר לציין כל Warning אפשרי. Warning - אזהרה - הוא מונח בתכנות שמתייחס לבעיות בקוד שאינן מונעות לגמרי הידור, אבל ברוב המקרים מצביעות על בעייה מסויימת. דוגמה: הסבה ישירה של משתנים שהיא חוקית אך מסבה סוגים לא קשורים של משתנים. דוגמת שימוש:
- gcc בלינוקס או Cygwin: הדגל
gcc -Wall file1.c
- הידור בלבד: הדגל
-c
מסמן למהדר שלא ליצור קישור אלא להדר בלבד. שימושי כאשר בונים פרוייקטים המורכבים מיותר מקובץ אחד, כאשר לא מעוניינים להדר ולקשר מחדש את כל הקבצים, אלא רק חלק מהם.- gcc בלינוקס או Cygwin: כברירת מחדל, הפעולה יוצרת קובץ בשפת מכונה, תחת שם זהה אך עם הקידומת .o, שאינו בר הרצה (ניתן לבחור כל שם קובץ אחר בעזרת הדגל -o). דוגמת שימוש:
gcc -c file1.c file2.c
לאחר מכן, ניתן לקשר את הקבצים שנוצרו בצורה הבאה, כאשר הפעולה הבאה תיצור קובץ הרצה בשם Program:
gcc file1.o file2.o -o Program
- הוספת מידע לניפוי שגיאות: הדגל
-g
מסמן למהדר להוסיף סימונים מיוחדים שמסייעים לתוכנות ניפוי שגיאות.- gcc בלינוקס או Cygwin: אם אתם בודקים את הקוד בעזרת מנפה שגיאות כלשהו (gdb, למשל), יש להדר בעזרת הדגל הזה. אם תבדקו קובץ בעזרת Valgrind תוכלו לקבל מידע רב יותר על התקלות שיימצאו. דוגמת שימוש:
gcc -g file1.c file2.c -o Program
- הדגל
-E
מציג כיצד נראה הקובץ אחרי פעולת הקדם-מהדר. כאשר מפעילים את ה-gcc עם דגל זה לא מתבצע הידור כלשהו בפועל. דוגמת שימוש:
gcc -E file1.c
- הדגל
-O
(שימו לב - O גדולה) יורה למהדר לבצע אופטימיזציה של התוכנית, כלומר - יבצע שינויים בקוד התוכנית כדי להביא לפעולה מהירה יותר. בדרך כלל ניתן להשיג שיפור מרשים בביצועים כאשר משתמשים באופטימיזציה. מצד שני, זוהי פעולה שעשויה לגרום לבעיות. יש כמה דרגות אפשריות של אופטימיזציה (מ-0 ועד 3), כאשר ככל שהדרגה גבוהה יותר מתבצעים שינויים רבים יותר והסכנה בפגמים שיווצרו - גדולה יותר. ככל שעולה דרגת האופטימיזציה גם ידרש המהדר לזמן פעולה ארוך יותר. הדגל -O (ללא מספר) מקביל לדרגה 1. עבור דרגות אחרות יש לכתוב בצמוד לאות O את דרגת האופטימיזיה: O1, O2 או O3 (ברירת המחדל, אם לא כותבים דגל כלל, היא O0). דוגמת שימוש:
gcc -Wall -O file1.c -o MyProgram
אופטימיזציה בדרגה 3:
gcc -Wall -O3 file1.c -o MyFastProgram
הידור (וקישור) במערכות שונות
[עריכה]gcc בלינוקס או Cygwin
[עריכה]אם תעבדו עם מהדר ה-gcc משורת הפקודה, ישנם כמה דגלים שכדאי להכיר.
סביבת פיתוח בחלונות
[עריכה]פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.
קדימות ואסוציאטיביות אופרטורים
[עריכה]הטבלה הבאה מראה את הקדימות (precedence בלעז) והקישוריות (associativty בלעז) של האופרטורים בשפת C.
אופרטור | קישוריות |
---|---|
() [] -> . | שמאל לימין |
! ~ ++ -- +אונרי
& (<type>) sizeof |
ימין לשמאל |
* . % / | שמאל לימין |
בינרי
|
שמאל לימין |
<< >> | שמאל לימין |
< <= > >= | שמאל לימין |
== != | שמאל לימין |
& | שמאל לימין |
| | שמאל לימין |
&& | שמאל לימין |
|| | שמאל לימין |
?: | ימין לשמאל |
= >>= <<= | ימין לשמאל |
, | שמאל לימין |
כמו לדוגמה ב-3
כמו לדוגמה ב3 + 5
סדר הקדימות של אופרטורים הוא גבוה יותר ככל שמיקומם הוא בשורה גבוהה יותר (אופרטורים באותה שורה הם בעלי אותה קדימות). כך, לדוגמה, פרשנות הביטוי 13 / 5 + 2 היא (13 / 5) + 2 (כפי שנהוג באלגברה בסיסית), מפני ש/ מופיע בשורה גבוהה יותר מ+.
הקישוריות של אופרטורים קובע האם מספר אופרטורים כאלה ברצף מתקשרים משמאל לימין או ההיפך. לדוגמה, פרשנות הביטוי 2 - 3 - 4 היא ( 2 - 3) - 4, מפני שקישוריות - היא משמאל לימין.
סימונים בספר
[עריכה]סוגריים משולשים
[עריכה]לעתים אפשר לראות בספר הסברים כגון: "באופן כללי בונים קוד בצורה:
gcc <source_file> -o <executable>
כאשר source_file הוא שם קובץ הקוד, וexecutable הוא שם קובץ התוכנית המתקבלת." (ראה, לדוגמה בניית התוכנית שלום עולם!).
כאשר רואים דבר כזה, יש להחליף את מה שנמצא בתוך הסוגריים המשולשים (לדוגמה source_file) במשהו אחר ללא הסוגריים המשולשים. לדוגמה, את הפקודה הקודמת אפשר להחליף במשהו כזה:
gcc hello_world.c -o hello_world.out
ולא כך:
<gcc <hello_world.c> -o <hello_world.out
היוצא היחידי מן הכלל הוא בשורות מהסוג:
#include <stdio.h>
בהן אכן יש להשתמש בסוגריים משולשים.
קוד תוכניות לעומת קטעי קוד
[עריכה]בחלק מהמקומות בספר כתוב קוד המתאים לתוכניות שלמות. הקוד הבא, לדוגמה, מופיע בשלום עולם!:
#include <stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
קוד זה מספיק לתוכנית מלאה. אפשר לבנות ממנו תוכנית, ולהריצה.
לעומת זאת, במקומות רבים אנו רוצים להתמקד בנקודה מסויימת. לדוגמה, במשתנים, מופיע קטע הקוד הבא:
int grade = 80;
קטע קוד זה מתמקד בנושא שעליו מדבר הפרק - משתנים. הוא אינו מכיל את כל הנדרש לתוכנית שלמה. אם ננסה לבנות קטע קוד זה, המהדר יתלונן.
כיצד נבדיל בין השניים, וכיצד נהפוך קטעי קוד לתוכניות שלמות?
- קוד המספיק לתוכנית שלמות חייב להכיל את הפונקציה main, כלומר, חייב להראות כך
int main()
{
<code_snippets>
return 0;
}
- אם מופיע רק קטע קוד, אז כדי להפכו לתוכנית שלמה, יש להכניס אותו בין הסוגריים המסולסלים, במקום code_snippets בסוגריים המסולסלים לעיל.