C 031214

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 7

‫מכללת אורט כפר‪-‬סבא‬

‫תכנות מערכות‬
‫בשפת ‪C‬‬
‫סוגי משתנים‬
‫‪03.12.14‬‬

‫אורי וולטמן‬
‫‪uri.weltmann@gmail.com‬‬
‫משתנים‬
‫בשפת ‪ C‬לכל משתנה קיים תחום הכרה (‪ )scope‬שזהו האיזור בקוד שבו‬ ‫‪‬‬

‫המשתנה מוכר וניתן לגשת אליו‪.‬‬


‫כזכור‪ ,‬קובץ תכנית בשפת ‪ C‬מורכב מבלוקים המתחילים בסימן } ומסתיימים‬ ‫‪‬‬

‫בסימן { ‪ .‬בלוק יכול להיות פונקציה או גוף של משפט מורכב‪.‬‬


‫בתחילת כל בלוק כזה ניתן להגדיר משתנים‪ ,‬המכונים משתני בלוק‪.‬‬ ‫‪‬‬

‫ניתן לפנות אל משתנה באמצעות המזהה (‪ )identifier‬שלו רק בבלוק בו הוא‬ ‫‪‬‬

‫מוגדר‪ ,‬כולל בבלוקים המוכלים בו‪.‬‬


‫מזהה מבלוק חיצוני תקף בתוך בלוק פנימי‪ ,‬אלא אם הוגדר בבלוק הפנימי‬ ‫‪‬‬

‫משתנה בעל מזהה (שם) זהה‪ .‬במילים אחרות‪ ,‬מזהה המוגדר בבלוק פנימי‬
‫"מסתיר" מזהה בעל שם זהה בבלוק חיצוני‪.‬‬
‫משתנה המוגדר מחוץ לכל הבלוקים נקרא משתנה גלובלי‪ .‬מזהה של‬ ‫‪‬‬

‫משתנה גלובלי מוכר בכל הבלוקים החל ממקום הגדרתו‪.‬‬


‫ישנו סוג מיוחד של משתנה בלוק הנקרא משתנה בלוק סטטי‪ ,‬המוגדר על‪-‬ידי‬ ‫‪‬‬

‫הוספת המילה השמורה ‪ static‬לפני שם הטיפוס‪.‬‬


‫משתנים‬
‫משתנים‬
‫כזכור‪ ,‬משתני בלוק אוטומטיים (או בקיצור‪ :‬משתנים אוטומטיים) שאינם מאותחלים‬ ‫‪‬‬

‫במפורש‪ ,‬ערכם ההתחלתי הוא "זבל"‪.‬‬


‫משתנה בלוק אוטומטי נוצר מחדש (ומאותחל‪ ,‬במידה וקיים אתחול מפורש) בכל‬ ‫‪‬‬

‫כניסה לבלוק‪ ,‬ולכן ערכו אינו נשמר בין ריצות עוקבות של הבלוק‪.‬‬
‫משתנה בלוק סטטי מאותחל פעם אחת ויחידה‪ ,‬ולא בכל כניסה לבלוק‪.‬‬ ‫‪‬‬

‫דוגמא לשימוש במשתנה סטטי‪ :‬נניח שכותבים תכנית השולטת על מערכת חומרה‬ ‫‪‬‬

‫ובה מנורה‪ .‬נכתוב פונקציה המבצעת שינוי של מצב האור‪:‬‬


‫)‪void toggle_light (void‬‬
‫{‬
‫;‪static int light_status = OFF‬‬ ‫‪ */‬האתחול יתבצע רק בפעם הראשונה *‪/‬‬
‫{ )‪if (light_status == OFF‬‬
‫;)(‪turn_light_on‬‬
‫;‪light_status = ON‬‬
‫{ ‪} else‬‬
‫;)(‪turn_light_off‬‬
‫;‪light_status = OFF‬‬
‫}‬
‫}‬
‫משתנים‬
?‫מה יהיה הפלט של התכנית הבאה‬ 
#include <stdio.h>

int main(void)
{
int x = 2;
{
int x;
x = 3;
}
printf (“%d”, x);

return 0;
}
‫משתנים‬
?‫ומה יהיה הפלט של התכנית הבאה‬ 
#include <stdio.h>

void foo(); void foo()


{
static int x = 0;
int main(void)
int y = 0;
{
int i; printf (“x is %d and y is %d\n”, x, y);
for (i = 0; i < 4; i++) ++x;
foo(); ++y;
}

return 0;
}

?x ‫האם הפלט היה משתנה אם לא היינו מאפסים את‬ 

?y ‫והאם הפלט היה משתנה אם לא היינו מאפסים את‬ 


‫משתנים‬
:‫נתונה התכנית הבאה‬ 
#include <stdio.h> void add (int number)
{
static int sum;
void add (int);
sum +=number;
int main(void) printf("%d ",sum);
{ }
int i;

for (i = 1; i <= 4; i++)


add(i);
return 0;
}

?‫מהו הפלט של התכנית‬ 

:‫ ל‬add ‫האם הפלט ישתנה אם נחליף את השורה הראשונה של‬ 


static int sum = 0

:‫ ל‬add ‫האם הפלט ישתנה אם נחליף את השורה הראשונה של‬ 


int sum = 0

You might also like