מאמר זה מספק מדריך מקיף שיסייע לך ללמוד על אסוציאטיביות וקדימות מפעילים ב-C.
עדיפות מפעיל ב-C
עדיפות מפעיל מתאר את הרצף שבו מוערכים מספר אופרטורים בזמן הערכת ביטויים. לדוגמה, אם לביטוי יש גם אופרטורים של חיבור וגם כפל, איזה מהם יש להעריך קודם? התשובה פשוטה, C עוקב אחר כללים מסוימים כדי לפתור אי בהירות כזו, הידוע בכינויו עדיפות מפעיל . ב-C, עדיפות מפעיל מסווג ל-17 רמות, החל מאופרטורים לא-נריים ועד לאופרטור מותנה שליש. רוב האופרטורים בשימוש כמו אופרטורים אריתמטיים, אופרטורים יחסיים, אופרטורים לוגיים ואופרטורים סיביים פועלים לפי תקן C עדיפות מפעיל נוהל.
עֲדִיפוּת כללים מכתיבים לאילו אופרטורים יש עדיפות גבוהה יותר מאחרים בעת הערכת ביטויים. למספר סוגים של אופרטורים בשפת התכנות C יש דרגות שונות של עֲדִיפוּת . לדוגמה, לאופרטורים אונריים יש עדיפות גבוהה יותר מאופרטורים בינאריים. להלן רשימה של אופרטורים ממוינים בסדר עולה של עֲדִיפוּת :
מַפעִיל | המשמעות של מפעיל | אסוציאטיביות |
() [] -> . |
שיחה פונקציונלית הפניה לרכיבי מערך בחירת חברים עקיפה בחירת חברים ישירה |
משמאל לימין |
! ~ + – ++ — & * מידה של (סוּג) |
שלילה לוגית משלים Bitwise (1's). Unary plus מינוס לא נורמלי תוֹסֶפֶת ירידה הפניה (כתובת) הפניה למצביע מחזירה את הגודל של אובייקט Typecast (המרה) |
מימין לשמאל |
* / % |
לְהַכפִּיל לחלק היתרה |
משמאל לימין |
+ – |
בינארי פלוס (תוספת) מינוס בינארי (חיסור) |
משמאל לימין |
<< >> |
שמאל משמרת העברה ימינה |
משמאל לימין |
< <= > >= |
פחות מ פחות מ או שווה גדול מ גדול או שווה |
משמאל לימין |
== != |
שווה ל לא שווה ל |
משמאל לימין |
& | Bitwise AND | משמאל לימין |
^ | OR בלעדי קצת | משמאל לימין |
| | Bitwise OR | משמאל לימין |
&& | AND הגיוני | משמאל לימין |
|| | OR לוגי | משמאל לימין |
?: | מפעיל מותנה | מימין לשמאל |
= *= /= %= += -= &= ^= |= <<= >>= |
משימה פשוטה הקצה מוצר הקצה מנה הקצה שארית להקצות סכום הקצה הבדל הקצה AND הקצה XOR בצורה סיבית הקצה OR הקצה משמרת שמאלה הקצה משמרת ימינה |
מימין לשמאל |
, | מפריד ביטויים | משמאל לימין |
כללים אלה מנחים את המהדר כיצד להעריך ביטויים עם מספר אופרטורים באותו ביטוי. לאופרטור הכפל, למשל, יש עדיפות גדולה יותר מאופרטור החיבור במשוואה A + B * C, בהתאם ל- עֲדִיפוּת כללים. לכן, המהדר יעריך תחילה את הביטוי B * C לפני הוספת A לתוצאה.
בואו נסתכל על דוגמה של עדיפות מפעיל באמצעות קוד.
#includeint רָאשִׁי ( ) {
int א = 43 , ב = אחד עשר , ג = 16 , ד = 31 ;
int תוֹצָאָה = ++ א * ב -- + ג / -- ד ;
printf ( 'a = %d \n ' , א ) ;
printf ( 'b = %d \n ' , ב ) ;
printf ( 'c = %d \n ' , ג ) ;
printf ( 'd = %d \n ' , ד ) ;
printf ( 'תוצאה = %d \n ' , תוֹצָאָה ) ;
לַחֲזוֹר 0 ;
}
ארבעת המשתנים a, b, c ו-d, מוצהרים בקוד לעיל, והערכים ההתחלתיים שלהם הם 43, 11, 16 ו-31 בהתאם. לאחר מכן, הוא מחיל מגוון של אופרטורים אריתמטיים והקצאה על משתנים אלה בביטוי. הביטוי מגדיל את הערך של a על ידי שימוש באופרטור לפני ההגדלה ++a, מכפיל את התוצאה באופרטור שלאחר ההפחתה b–, ולאחר מכן מוסיף את התוצאה לחלוקה של c בערך שהופחת מראש של d. (באמצעות האופרטור pre-decrement –d). התוצאה המשתנה משמשת לאחר מכן כדי להחזיק את התוצאה הכוללת של ביטוי זה.
תְפוּקָה
אסוציאטיביות ב-C
אסוציאטיביות מתייחס לסדר שבו האופרטורים מוערכים במהלך ביטוי עם אותה קדימות. משמאל לימין ומימין לשמאל אסוציאטיביות הן שתי צורות האסוציאטיביות ב-C. אם לשני אופרטורים יש אותו הדבר עֲדִיפוּת , הם מוערכים משמאל לימין לפי הרעיון של שמאל לימין אסוציאטיביות . עם זאת, אם נצפתה אותה קדימות, האופרטורים מוערכים מימין לשמאל לפי ימין לשמאל אסוציאטיביות .
לדוגמה, לאופרטור ההגדלה ++ יש מימין לשמאל אסוציאטיביות , כלומר התוספת מַפעִיל מוערך לאחר המשתנה. ואילו ה-AND ההגיוני מַפעִיל יש משמאל לימין אסוציאטיביות , כלומר האופרטור מוערך משמאל לימין.
#includeint main() {
int a = 6 , ב = 3 , ג = 2 ;
int result = a * b / c;
printf( 'תוצאה = %d \n ' , תוצאה);
לַחֲזוֹר 0 ;
}
שלושת המשתנים a, b ו-c מוכרזים בקוד זה, והם מאותחלים ל-6, 3 ו-2 בהתאמה. לאחר מכן, הוא מחיל פעולות כפל וחילוק על משתנים אלה בביטוי. הכפל והחילוק מדורגים משמאל לימין ב-C על סמך שלהם אסוציאטיביות מכיוון שיש להם אותה רמת עדיפות. זה מצביע על כך שפעולת החלוקה באה במקום הראשון, ואחריה פעולת הכפל בעת הערכת הביטוי, a * b / c.
תְפוּקָה
סיכום
עדיפות מפעיל ו אסוציאטיביות הם מושגים מכריעים בתכנות C שעוזרים לקבוע את סדר הביצוע של ביטויים. מפעילים עם הגבוהים ביותר עֲדִיפוּת רמת מוערכים תחילה ו אסוציאטיביות כללים עוזרים לקבוע את הסדר כאשר משתמשים במספר אופרטורים עם אותה קדימות. הֲבָנָה עדיפות מפעיל ו אסוציאטיביות הוא חיוני בעת תכנון תוכניות מורכבות, והוא עוזר לייצר קוד נקי ויעיל יותר עם פחות שגיאות.