עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

פורסם

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

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

 

נערך על-ידי assaf99

פורסם

האופרטור ++ קודם מחזיר את הערך הנוכחי של 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 ואז מבצעים את האופרטור שווה = על מה שיש עכשיו בצד ימין של הפעולה שזה כאמור הערך הקבוע אחד.

נערך על-ידי etal

פורסם
  • מחבר

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

אם כן בטבלת קדימות שאיתה אני לומד 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

 

נערך על-ידי etal

פורסם
  • מחבר

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

פורסם

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

פורסם
  • מחבר

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

 

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.