אופרטור (תכנות) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
←‏תחביר: הרחבה
עריכה והרחבה
שורה 1:
ב[[שפת תכנות|שפות תכנות]], '''אופרטור''' (בעברית: '''מפעיל, סימן פעולה''') הוא [[פונקציה (תכנות)|פונקציה]] הפועלת על [[אופרנד]]יחידה תכנותית כלשהי (יחידתקבועים, נתוניםמשתנים, שמתבצעתטיפוסים עליה פעולהוכדומה), אושתיקרא מספר אופרנדים. פונקציה זו מופיעה כ[[תו (מחשב)|תואופרנד]], או אוסףעל תווים (מילה) הנכתבים בסמוך לאופרנד או בין שנימספר אופרנדים. למעשה, האופרטורומחזירה בשפותערך תכנותמטיפוס מקביל ל[[אופרטור (מתמטיקה)|אופרטור המתמטי]]מוגדר.
פונקציה זו נכתבת כ[[תו (מחשב)|תו]] או אוסף תווים (מילה) הנכתבים בסמוך לאופרנד או בין שני אופרנדים.
דוגמאות לאופרטורים נפוצים הן אופרטור החיבור '''+''' (בביטוי a'''+'''b) ואופרטור ההשמה ('''=:''' ב[[פסקל (שפת תכנות)|פסקל]]).
 
למעשה, אופרטור בשפות תכנות הוא צורת [[תחביר]] שונה לפונקציה בעלת 1-3 ארגומנטים.
אופרטורים רבים דומים בשפות התכנות השונות (למשל אופרטורים של פעולות חשבון), אחרים שונים משפה לשפה (כגון אופרטור "[[פקודת השמה|השמה]]") וחלקם קיימים רק בשפות מסוימות. מכלול האופרטורים משפיע על מידת גמישותה וחוזקה של השפה, משום שאופרטורים הם אבן יסוד בכל שפת תכנות.
עיקר תפקידו של האופרטור בתכנות הוא לשפר את קריאות התוכנית, את הדמיון בינה לבין טקסט מתימטי, לוגי או שפה טבעית, או להדגיש משמעות של פעולה כלשהי.
האופרטורים הנפוצים הם על פי רוב כאלה שפעולתם מקבילה לפעולת [[אופרטור (מתמטיקה)|אופרטור מתמטי]] כלשהו, כגון אופרטורים אריתמטיים: חיבור, כפל, חילוק וכדומה. בחלק מהמקרים משתמשים באופרטורים על מנת לסמן פעולות להן יש מיפוי ישיר אל פקודת מעבד בודדת (כגון פעולות אריתמטיות או פעולות על סיביות בזיכרון).
 
על פי רוב כללי מתן השמות לאופרטורים שונים מאלה של מזהים אחרים בשפה, ומאפשרים סימונים מתמטיים ואחרים, אך גם מילה אנגלית עשויה להיות אופרטור בחלק משפות התכנות (למשל sizeof ב[[C (שפת תכנות)|שפת C]], או not ב[[פייתון]]).
 
==תחביר==
ישנן שלוש דרכים לכתיבת אופרטורים:
האופרטורים מתחלקים לשני סוגים עיקריים:
* infix - כתיבת האורפטור בין שני אופרנדים (או יותר) עליהם הוא פועל (כמו בדוגמת A+B שהוזכרה למעלה). זוהי הצורה הנפוצה.
* '''אופרטור אונרי''' הוא אופרטור הפועל על אופרנד יחיד, כגון A!, כאשר סימן הקריאה מייצג [[שלילה]].
* prefix (נקראת גם "כתיב פולני") - כתיבת האופרטור משמאל לאופרנד עליו הוא פועל (למשל אופרטור השלילה ! בביטוי (A!) בשפת C). שימוש בצורת prefix עבור יותר מאופרנד יחיד איננה נפוצה, אך שימושית ב[[שפת סף|שפות סף]] ו[[שפת מכונה|שפות מכונה]].
* '''אופרטור בינארי''' הוא אופרטור הפועל על שני אופרנדים, כגון A*B. במקרה זה, לאופרטור הכפל שני אופרנדים: A ו-B.
* postfix - כתיבת האופרטור מימין לאופרנד עליו הוא פועל (למשל שימוש באופרטור הקידום בצורה ++x בשפת C) נקראת גם "כתיב פולני הפוך".
 
אופרטור הפועל על אופרנד יחיד נקרא '''אונרי''', אופרטור הפועל על שני אופרנדים נקרא '''בינארי'''.
אופרטור יכול להיות גם אונרי וגם בינארי. כך, לדוגמה, בפעולה A-B סימן המינוס משתמש בשני האופרנדים בדומה לפעולת הכפל, אולם ניתן להשתמש באופרטור המינוס בפעולה על אופרנד יחיד: C- (למעשה מדובר במקרה פרטי של [[העמסת אופרטורים]]).
בסביבות מסוימות קיימים גם '''אופרטורים טרינאריים''', שפועליםהפועלים על שלושה אופרנדים. הדוגמה המוכרת ביותר היא אופרטור :? בשפת C ונגזרותיה, שנכתב בצורה (A ? B : C) ומשמעותו "אם A אז B אחרת C".
 
בסביבות מסוימות קיימים גם '''אופרטורים טרינאריים''', שפועלים על שלושה אופרנדים.
 
==לוגיקה פנימית של האופרטור==
למעשה אופרטור הוא דרך שונה תחבירית לכתיבת פונקציה ששמה הוא סימן מסוים, המקבלת ערך, מבצעת בו פעולה ומחזירה אותו.
כך למשל בשפת [[Prolog]] (ובשפות נוספות) הביטויים "3 + 4" ו "(4,4)+" זהים לחלוטין. הצורה האחרונה לכתיבת קריאה לאופרטור נקראת "כתיב פולני".
 
ב[[תכנות מונחה עצמים|שפות מונחות עצמים]] בהן ניתן להגדיר אופרטורים השייכים למחלקה, כמו שפת [[C++|++C]], קריאה לאופרטור כזה בצורה A+B שקולה לקריאה (A.+(B (או ב++C, לקריאה מהצורה (A.operator+(B), כאשר נקודה (.) היא אופרטור הגישה.
 
==סוגי אופרטורים==
שורה 25:
 
===אופרטורי השמה===
קבוצה זו של אופרטורים מבצעים פעולות [[פקודת השמה|השמה]] אל תוך [[משתנה (תכנות)|משתנים]]. האופרטור הידוע ביותר בהקשר זה הוא אופרטור השמה, הנכתב לרוב באמצעות סימן השווה (=) או שילובבשילוב סימן השווהשלו עם תו נוסף.

בשפות תכנות מסוימותשהושפעו מ[[ALGOL|ALGOL 68]] קיימים אופרטורים הכוללת פעולה מתמטית ופעולה השמה. כך לדוגמה, האופרטור (=+) (בדוגמה A += B) מקביל לפעולת ההשמה והחיבור A = A + B.<br />
ניתן להחשיב כל אופרטור הגורם לתוצאת לוואי על אחד האופרנדים שלו כאופרטור השמה, ובפרט אופרטור השמה עשוי להיות אונרי - למשל האופרטור ++ בשפת C, שמקדם משתנה המופיע לפניו או אחריו בערך אחד (עבור טיפוסים דיסקרטיים כגון מספרים שלמים), ומקבילכך שהביטוי ++A שקול לפעולהלביטוי A=A+1.
 
בשפות פונקציונליות בהן משתנים אינם משנים את תוכנם, אופרטורקיימים אלהאופרטורים משמים(ובפרט עלהאופרטור פי=) רובהמשמשים ליצירת קישור (binding) בין מזהה לערך אותו הוא מקבל, או להגדרת ערך החזרה של פונקציה.
 
===אופרטורים השוואתיים===
שורה 35 ⟵ 37:
===אופרטורים לוגיים===
{{הפניה לערך מורחב|פעולה בוליאנית}}
אופרטורים לוגיים משמשים לפעולה בין אופרטורים בוליאניים, וכל אופרטור כזה מייצג [[טבלת אמת]] כלשהי. דוגמאות לאופרטורים אלו: [[וגם (לוגיקה)|וגם]] (סימונים נפוצים: &, &&, ^, and), [[או (לוגיקה)|או]] (סימונים נפוצים: |, ||, or), [[NAND לוגי|NAND]] ו[[לא (לוגיקה)|לאשלילה]] (סימונים נפוצים: !, not, +\).
 
===אופרטורים נוספים===
שורה 44 ⟵ 46:
* אופרטורים של גישה לאינדקס במערך או ברשימה ([], !!).
* אופרטור מצביע ל"חברים" של [[אובייקט (הנדסת תוכנה)|אובייקטים]] (. או <- ).
* אופרטורי תחום, (Scope)- למשל האופרטור :: ב++C - באמצעותם ניתן להבדיל בין משתנים מתחומים שונים., (ב++Cולמנוע ::)התנגשות בין שמות או אי בהירות.
* אופרטורים הבודקים מאפיינים שונים באופרנד, כגון האם אובייקט הוא מטיפוס כלשהו, או ירש מטיפוס כלשהו, מה גודל הזיכרון אותו האובייקט תופס, וכדומה.
* אופרטורים המבצעים המרה של ערכים מטיפוס לטיפוס, או שמשנים את התיחסות המהדר לאובייקט מסויים כאילו הוא מטיפוס אחר.
* אופרטורי תנאי כמו אופרטור :? שהוזכר למעלה. ההבדל העקרוני בין שימוש באופרטור כזה לבין שימוש ב[[פקודת if]] הוא שאופרטור התנאי מיועד לבחירה בין ביטויים, בעוד הפקודה מיועדת ל[[בקרת זרימה]].
* אופרטורי תנאי בדומה ל[[פקודת if]]. ב C ונגזרותיה קיים אופרטור טרנארי כזה מהצורה (A ? B : C) שמשמעותו "אם A אז B אחרת C".
* בשפות מונחות עצמים קיימים לעיתים אופרטורים כגון new, delete המטפלים ביצירת אובייקטים והריסתם.
קיימים סוגים נוספים של אופרטורים נדירים יותר שלא נמצאים בשימוש נרחב.
 
==העמסת אופרטורים==
בחלקחלק משפות התכנות ניתןמאפשרות למתכנת לבצע [[העמסת אופרטורים]], כלומר להגדיר אותם כך שיפעלו על טיפוסים נוספים, או להגדיר להם פעולות שונות מאלו שנקבעו בשפה. לדוגמה, האופרטורבשפת ++C אופרטור + שמשמשמשמש לפעולה חשבונית בין מספרים, אך מוגדר לעיתים לביצוע פעולות שרשור מחרוזתמחרוזות או לחיבור בין משתנים מורכבים כמו מערכים או אובייקטים.
יש לציין כי תכונה זו איננה מוגבלת לתכנות מונחה עצמים,. וישנןישנן שפות שאינן מונחות עצמים (כמו למשל [[LISP]]) המאפשרות העמסת אופרטורים, ושפות מונחות עצמים (כגון [[Java]]) שנמנעות מלספק את האפשרות הזאת (לצורכי בהירות וחד משמעיות).
 
חלק מהשפות מאפשרות למתכנת לבצע העמסת אופרטורים רק על קבוצת האופרטורים שהוגדרה מראש על ידי השפה. בשפות אחרות ניתן ליצור אופרטורים חדשים, אף כאלו שלא הוגדרו על ידי השפה.
שורה 104 ⟵ 106:
 
==קדימות==
קדימות האופרטורים (Associativity) מציינת את חוזק הקשר בין הביטויים השונים. והיא נקבעת הן לפי סדר עדיפויות קבועה מראש בין האופרטורים השונים, והן לפי הסדר שבו הם כתובים (משמאל לימין או ימין לשמאל). כך למשל, פעולתהאסוציאטיביות המקובלת בפעולות אריתמטיות היא שפעולת העלאה בחזקה קודמת לכפל וחילוק, וכפל וחילוק קודמותשקודמות לפעולות חיבור וחיסור, ופעולותוכן חיבורמקובל וחיסורשפעולות אלה קודמות לפעולת השמה. במקרה של ספק או רצון לחרוג מסדר העדיפויות, ניתן להשתמש בסוגריים שגוברים בקדימותם על רוב האופרטורים. (לדוגמה: 2+2*3 יחזיר 8 ואילו (2+2)*3 יחזיר 12.)
 
במקרה של ספק או רצון לחרוג מסדר העדיפויות, ניתן על פי רוב להשתמש בסוגריים שקובעים את סדר הקדימויות הרצוי (לדוגמה: 2+2*3 יחזיר 8 ואילו (2+2)*3 יחזיר 12). אך יש לשים לב לכך ששימוש זה בסוגריים שונה מהשימוש בהם כ'''אופרטור קריאה לפונקציה''', בשפות תכנות רבות, וכן לכך שבשפות מסויימות (למשל Haskell) הדבר עלול לתת משמעות שונה מהצפוי לביטוי כולו.
כאשר קיימים שני אופרטורים שווים בקדימותם, בדרך כלל האופרטור השמאלי גובר על הימני, אך גם יכולים להיות אופרטורים בעלי קדימות שווה שבהם דווקא הימני יגבר על השמאלי. ישנם מקרים מעטים בהם אין סדר עדיפויות (כמו אופרטורים בוליאניים בשפת ADA) ובמספר שפות כגון [[פרולוג (שפת תכנות)|פרולוג]] ניתן לשנות את הסדר הקבוע מראש.
 
כאשר קיימיםישנם שניבביטוי מספר אופרטורים שוויםלהם בקדימותםעדיפות שווה, בדרךהעדיפות כללתקבע האופרטורעל השמאליפי גוברסדר עלהכתיבה הימנישלהם, אךלעיתים גםהקדימות יכוליםהיא להיותשל אופרטוריםהאיבר בעליהשמאלי קדימותמביניהם שווהולעיתים שבהם דווקאשל הימני, יגברבאופן עלשתלוי השמאליבהקשר ובשפה הספציפית. ישנם מקרים מעטים בהם אין סדר עדיפויות (כמו אופרטורים בוליאניים בשפת ADA) ובמספר שפות כגון [[פרולוג (שפת תכנות)|פרולוג]] ניתן לשנות את הסדר הקבוע מראש.
<!--
==טבלת השוואה לאופרטורים==
השוואה של שתי קונספטים של אופרטורים בשפות ישנות וחדשות. <br />
שורה 170 ⟵ 174:
| align="right"| קידום עצמי
| ++ || ++ || אין|| אין
|} -->
 
== הערות שוליים ==