עבור לתוכן

שפת C| סדר קדימויות

Featured Replies

פורסם

int main()
{
   int a = 1;
   int b = a++;
//now a = 2
   int c = a++ * a++;
   }

למה בקוד הבא c שווה ל-6 ולא ל- 4. מדוע הוא מתנהג אחרת מ- b ששווה ל-1

 

פורסם

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

סדר הקדימויות מחולק לשלבים:

step 1:
a = 2
c = a++ * a++

step 2:
c = 2 * a++
a = 3

step 3:
c = 2 * 3
a = 4

 

פורסם
  • מחבר

אז לפי ההסבר הזה למה b=2 ולא b=1?

ובכלל, איפה מופיע האופרטור ++ postincrement בטבלת הקדימויות

 

פורסם

http://en.cppreference.com/w/c/language/operator_precedence

 

b=1 כי אופרטור ה-postincrement קודם מחזיר את הערך הנוכחי של a ז"א 1 ומהרגע שהאופרטור החזיר ערך אז זה כבר קבוע זה כבר לא המשתנה a אלא ממש המספר אחד. אחר כך מקדמים את a ואז מבצעים את האופרטור שווה = על מה שיש עכשיו בצד ימין של הפעולה שזה כאמור הערך הקבוע אחד.

פורסם
  • מחבר

אוקיי. כעת ברור. ממש תודה!

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

פורסם

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

פורסם
  • מחבר

אוקיי, אז פתרתי לפי הטבלה שלך את הקוד הבא. וקיבלתי y=3 אבל בהרצה קיבלתי y=6. היכן הטעות שלי?

 int x=1;
  int y= ++x * x++;

   /* 1. y= ++x * 1 //x==2
      2.  y = ++2 * 1
      3.  y = 3 * 1
      4.  y = 3
    */

 

פורסם

פעולת ה: x++ עובדת קצת אחרת כי היא מקדמת את x ואז מחזירה את x עצמו.

מעבר לזה עושה רושם שאתה כבר נכנס לדקויות שלפי http://en.cppreference.com/w/c/language/eval_order הם Undefined behavior וכל קומפילר רשאי לעשות מה שבא לו.

 

מה שנראה שקורה זה:

int x = 1;
int y = ++x * x++;

1. y = x * x++
    x = 2
2. y = x * 2
    x = 3
3. y = 3 * 2

 

פורסם
  • מחבר

תודה על הסבלנות!
למה פתרת משמאל לימין? לפי הטבלה ++x קודם לפעולת x++

פורסם

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

פורסם
  • מחבר

רוב תודות על תשובותך!!

 

ארכיון

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

דיונים חדשים