פורסם 2017 בנובמבר 168 שנים int main() { int a = 1; int b = a++; //now a = 2 int c = a++ * a++; } למה בקוד הבא c שווה ל-6 ולא ל- 4. מדוע הוא מתנהג אחרת מ- b ששווה ל-1 נערך 2017 בנובמבר 168 שנים על-ידי assaf99
פורסם 2017 בנובמבר 168 שנים האופרטור ++ קודם מחזיר את הערך הנוכחי של a ואח"כ מקדם אותו. מעבר לזה סדר הקדימויות הוא לפי סוג האופרטור ומשמאל לימין במקרה של שוויון בקדימויות, האופרטור = הוא אחרון כמובן. סדר הקדימויות מחולק לשלבים: step 1: a = 2 c = a++ * a++ step 2: c = 2 * a++ a = 3 step 3: c = 2 * 3 a = 4
פורסם 2017 בנובמבר 168 שנים מחבר אז לפי ההסבר הזה למה b=2 ולא b=1? ובכלל, איפה מופיע האופרטור ++ postincrement בטבלת הקדימויות
פורסם 2017 בנובמבר 168 שנים http://en.cppreference.com/w/c/language/operator_precedence b=1 כי אופרטור ה-postincrement קודם מחזיר את הערך הנוכחי של a ז"א 1 ומהרגע שהאופרטור החזיר ערך אז זה כבר קבוע זה כבר לא המשתנה a אלא ממש המספר אחד. אחר כך מקדמים את a ואז מבצעים את האופרטור שווה = על מה שיש עכשיו בצד ימין של הפעולה שזה כאמור הערך הקבוע אחד. נערך 2017 בנובמבר 168 שנים על-ידי etal
פורסם 2017 בנובמבר 168 שנים מחבר אוקיי. כעת ברור. ממש תודה! אם כן בטבלת קדימות שאיתה אני לומד C גרסה98, אם יש פעמיים ++ בשורה אז מבצעים מימין לשמאל. אבל בתשובתך ראית שכתבת משמאל לימין וכן בטסלת קדימויות שאתה צירפת רשום משמאל לימין. איזו טבלה צודקת?
פורסם 2017 בנובמבר 168 שנים בטבלה שהבאתי יש שני סוגים של ++ כל אחד מהם מתבצע לכיוון שונה, בטבלה שלך האופרטור postincrement בכלל לא מופיע. הטבלה שהבאתי מבוססת גם על תקנים יותר חדשים של שפת c כמו שכתוב למטה אבל אני די בטוח שבכל מקרה סדר פעולות החשבון לא השתנה ככה שזה לא משנה איזה גרסה של שפת c תבחר.
פורסם 2017 בנובמבר 198 שנים מחבר אוקיי, אז פתרתי לפי הטבלה שלך את הקוד הבא. וקיבלתי 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 */
פורסם 2017 בנובמבר 198 שנים פעולת ה: 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 נערך 2017 בנובמבר 198 שנים על-ידי etal
פורסם 2017 בנובמבר 198 שנים מחבר תודה על הסבלנות! למה פתרת משמאל לימין? לפי הטבלה ++x קודם לפעולת x++
פורסם 2017 בנובמבר 198 שנים כמו שאמרתי התוצאה של הדוגמה שלך לא מוגדרת, מותר לכל קומפיילר לתת תוצאה שונה וזה עדיין יחשב תקין. אני רק מנסה להסביר איך הוא הגיע לתוצאה שהוא הגיע.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.