שאלה תיאורטית - CPP - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שאלה תיאורטית - CPP


binyamin1001

Recommended Posts

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

const int a = 5;
int *b = (int *(&a;
*b++;
cout<<a<<endl;
cout<<*b<<;

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

הוא יספר שהקוד נבדק על מהדר VisualStudio, וגם על Unix - ובשניהם הריץ את התוצאה המזעזעת 5,6.

השאלה שלי היא כזאת - האם אין כאן סתירה לתקן? התקן לא מגדיר את ה const כמו define, ולכן אין לו כתובת כלל?

(שאלה נוספת שעולה בעקבות השאלה הקודמת היא, אם התקן מגדיר את const כמשתנה ללא כתובת, איך מתקיים const_cast?)

יהיה נחמד לקבל תשובה ברמת התיאוריה

תודה מראש!

נ.ב - מתנצל אם הסוגריים טיפ'לה לא מסודרת.

קישור לתוכן
שתף באתרים אחרים

לא התקן לא מגדיר את ה-const כמו define, אלא מרשה לקומפיילר "להעלים" משתנה כזה במידת האפשר. אחד התנאים שבהם הקומפיילר בפירוש לא יעלים קבוע זה כאשר מבקשים את הכתובת שלו, שזה בדיוק מה שהקוד עושה.

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

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

קישור לתוכן
שתף באתרים אחרים

השאלה שלי, היא האם התקן לא מגדיר את ה const כ"משתנה" שאין לו כתובת בכלל, והוא בכלל לא בזיכרון.

אני יודע שאחרי קומפילציה השורה האחרונה היא בכלל cout << 5, השאלה שלי היא מה משמעות הפנייה לכתובת של משתנה קבוע.

קישור לתוכן
שתף באתרים אחרים

השאלה שלי, היא האם התקן לא מגדיר את ה const כ"משתנה" שאין לו כתובת בכלל, והוא בכלל לא בזיכרון.

לא, הוא לא. למילה const יש עוד משמעויות חוץ מזה - לדוגמה, פונקציה יכולה לקבל פרמטר שהוא const int, ככה:

void foo(const int x) {
x = 5; // error!
}

בפונקציה הזו, x הוא משתנה לכל דבר ולא קבוע (כי מי שקורא לפונקציה יכול לקבוע אותו).

קישור לתוכן
שתף באתרים אחרים

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

(משום מה התגית של קוד מתחרבשת פה אז שמתי בלי)

cout >> 5

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

קישור לתוכן
שתף באתרים אחרים

הביטוי

cout << 5

הוא בעצם הפעלת האופרטור >> של cout, שהוא בעצם הפונקציה >>operator, על הערך 5. כלומר זה זהה לביטוי הבא:

cout.operator<<(5);

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...