פיקוד לינוקס / יוניקס: expr

שֵׁם

expr - הערכת ביטוי

תַקצִיר

expr ARG? arg ... ?

מתווכת של (הוספת רווחים מפריד ביניהם), מעריך את התוצאה כמו ביטוי Tcl, ומחזירה את הערך. המפעילים המורשים בביטויים של TCL הם קבוצת משנה של המפעילים המורשים בביטויים C, ויש להם אותה משמעות וקדימות כמו אופרטורים C המתאימים. ביטויים כמעט תמיד מניבים תוצאות מספריות (מספר שלם או ערכי נקודה צפה). לדוגמה, הביטוי

expr 8.2 + 6

מעריכה ל - 14.2. ביטויי TCL שונים מביטויי C באופן שבו מפורטות אופרנדות. כמו כן, ביטויים TCL תמיכה אופרדים נומרית השוואות מחרוזת.

אופרנדס

ביטוי Tcl מורכב משילוב של אופרטורים, אופרטורים וסוגריים. ניתן להשתמש בחלל הלבן בין האופרטורים והמפעילים והסוגריים; היא מתעלמת מהוראות הביטוי. במידת האפשר, אופרנדים מתפרשים כערכים של מספרים שלמים. ערכים שלמים יכולים להיות מפורטים בעשרונית (המקרה הרגיל), באוקטל (אם התו הראשון של המפעיל הוא 0 ), או הקסדצימלי (אם שתי התווים הראשונים של האופראנד הם 0x ). אם אופראנד אין אחד פורמטים שלמים שניתנו לעיל, אז זה מטופל כמספר נקודה צפה אם זה אפשרי. ניתן לציין מספרי נקודה צפה בכל אחת מהדרכים המקובלות על ידי מהדר C התואם ל- ANSI (למעט העובדה שסיומות f , F , l ו- l לא יותרו ברוב ההתקנות). לדוגמה, כל הפרטים הבאים הם מספרי נקודה צפה: 2.1, 3., 6e4, 7.91e + 16. אם אין פרשנות מספרת אפשרית, אופרנד נשאר כמחרוזת (ורק קבוצה מוגבלת של אופרטורים ניתן להחיל על זה).

ניתן לציין אופרטורים בכל אחת מהדרכים הבאות:

[1]

כערך מספרי, מספר שלם או נקודה צפה.

[2]

כמשתנה TCL, תוך שימוש בסימון $ סטנדרטי. ערך המשתנה ישמש כאופראנד.

[3]

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

[4]

כמו מחרוזת מוקפת הפלטה. הדמויות בין הסד פתוח לבין הסוגר קרוב תואם ישמש אופרנד ללא כל תחליפים.

[5]

בתור פקודה Tcl סוגר בסוגריים. הפקודה תבוצע ותוצאותיה ישמשו כאופרנד.

[6]

כפונקציה מתמטית אשר טיעוניה יש את כל הטפסים לעיל עבור operands, כגון חטא ($ x) . ראה להלן רשימה של פונקציות מוגדרות.

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

עבור כמה דוגמאות לביטויים פשוטים, נניח שלמשתנה יש את הערך 3 והמשתנה b הוא בעל הערך 6. ואז הפקודה בצד שמאל של כל אחת מהשורות הבאות תייצר את הערך בצד ימין של השורה:

אקספר 3.1 + $ a6.1 expr 2 + "$ a $ b" 5.6 expr 4 * [llength "6 2"] 8 expr {{word one} <"word $ a"} 0

אופרטורים

המפעילים החוקיים רשומים למטה, מקובצים בסדר יורד של קדימות:

- + ~!

Unary מינוס, unary פלוס, קצת חכם לא, הגיוני לא. אף אחד אופרנדים אלה עשויים להיות מיושמים על אופרנדות מחרוזת, ו bit- חכם לא ניתן להחיל רק מספרים שלמים.

* /%

הכפל, מחלק, נשאר. אף אחד מן האופראנים האלה לא ניתן להחיל על אופרטורים של מחרוזות, והשאר עשוי להיות מוחל רק על מספרים שלמים. לשאר תמיד יש את אותו סימן כמו המחלק וערך מוחלט קטן יותר מאשר המחלק.

Map -

הוסף וחסר. תקף עבור כל אופרנדים מספריים.

<< >>

שמאל ומשמאל. תקף עבור אופרנדים שלמים בלבד. משמרת ימנית תמיד מפיצה את חתימת הסימנים.

<> <=> =

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

==! =

בוליאני שווה ולא שווה. כל מפעיל מייצר תוצאה אפס / אחת. תקף עבור כל סוגי האופראנים.

&

קצת חכם ו. תקף עבור אופרנדים שלמים בלבד.

^

ביט או בלעדי חכם. תקף עבור אופרנדים שלמים בלבד.

|

קצת חכם או. תקף עבור אופרנדים שלמים בלבד.

Ball

לוגי ו. מייצרת תוצאה אחת אם שתי האופראציות הן לא אפס, 0 אחרת. תקף עבור אופרטורים בוליאניים ומספריים בלבד (מספרים שלמים או צפים).

||

לוג לוגי. יוצרת תוצאה 0 אם שני האופראנים הם אפס, 1 אחרת. תקף עבור אופרטורים בוליאניים ומספריים בלבד (מספרים שלמים או צפים).

x? y : z

אם-אז-אחר, כמו ב- C. אם x מעריך לא אפס, אז התוצאה היא הערך של y . אחרת, התוצאה היא הערך של z . האופראן x חייב להיות בעל ערך מספרי.

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

expr 4 * 2 <7

מחזיר 0.

&& , || , ו?: אופרטורים יש "הערכה עצלן", בדיוק כמו ב C, כלומר, אופרנדים לא מוערכים אם הם לא נחוצים כדי לקבוע את התוצאה. לדוגמה, בפקודה

expr {$ v? [a]: [b]}

רק אחד [a] או [b] יהיה למעשה מוערך, בהתאם לערך של $ v . שים לב, עם זאת, כי זה נכון רק אם הביטוי כולו מוקף הפלטה; אחרת, מנתח ה- TCL יעריך את [a] ו- [b] לפני הפעלת הפקודה expr .

פונקציות מתמטיות

Tcl תומך בפונקציות המתמטיות הבאות בביטויים:

abs cosh יומן sqrt acos כפול log10 srand asin exp pow tan atan קומה rand tanh atan2 fmod בסיבוב ceil היפוט חטא cos int sinh

ABS ( arg )

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

acos ( arg )

מחזירה את הקוסינוס arc של arg , בטווח [0, pi] radians. ארג צריכה להיות בטווח [-1,1].

asin ( arg )

מחזירה את סינוס arc של arg , בטווח [-pi / 2, pi / 2] radians. ארג צריכה להיות בטווח [-1,1].

atan ( arg )

מחזירה את המשיק arc של arg , בטווח [-pi / 2, pi / 2] radians.

atan2 ( x, y )

מחזירה את המשיק arc של y / x , בטווח [-pi, pi] radians. x ו- y לא יכול להיות שניהם 0.

ceil ( arg )

מחזירה את הערך השלם הקטן ביותר לא פחות מאשר ארגומנט .

cos ( arg )

מחזירה את הקוסינוס של ארגומנט , שנמדד ברדיאנים.

cush ( arg )

מחזירה את הקוסינוס ההיפרבולי של ארגומנט . אם התוצאה תגרום לגלישה, תוחזר שגיאה.

כפול ( ארג )

אם arg הוא ערך צף, מחזירה ארגומנט , אחרת ממירה את ההתנגשות ומחזירה את הערך המומר.

exp ( arg )

מחזירה את האקספוננציאל של arg , המוגדר כ- ** arg . אם התוצאה תגרום לגלישה, תוחזר שגיאה.

קומה ( arg )

מחזירה את הערך האינטגרלי הגדול ביותר לא גדול מ- arg .

fmod ( x, y )

מחזירה את שארית הנקודה הצפה של חלוקת X על ידי y . אם y הוא 0, מוחזרת שגיאה.

hypot ( x, y )

מחשב את אורך hypotenuse של משולש זווית ישרה ( x * x + y * y ).

int ( arg )

אם arg הוא ערך שלם, מחזירה ארגומנט , אחרת ממיר את המספר השלם באמצעות חתך ומחזיר את הערך המומר.

יומן ( ארג )

מחזירה את הלוגריתם הטבעי של ארגומנט . ארג חייב להיות ערך חיובי.

log10 ( arg )

מחזירה את הלוגריתם הבסיסי של ארגומנט . ארג חייב להיות ערך חיובי.

pow ( x, y )

מחשב את הערך של x מורם אל y . אם x הוא שלילי, y חייב להיות ערך שלם.

rand ()

מחזירה מספר נקודה צפה מאפס ליותר מאחד או, במונחים מתמטיים, טווח [0,1]. הזרע מגיע מן השעון הפנימי של המכונה או ניתן להגדיר ידנית עם הפונקציה srand.

Round ( arg )

אם arg הוא ערך שלם, מחזירה את arg , אחרת ממיר את המספר השלם על ידי עיגול ומחזיר את הערך המומר.

חטא ( ארג )

מחזירה את הסינוס של arg , שנמדד ברדיאנים.

sinh ( arg )

מחזירה את הסינוס ההיפרבולי של ארגומנט . אם התוצאה תגרום לגלישה, תוחזר שגיאה.

sqrt ( arg )

מחזירה את השורש הריבועי של arg . ארג חייב להיות לא שלילי.

srand ( arg )

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

טאן ( ארג )

מחזירה את המשיק של הארגון, נמדד ברדיאנים.

טאנה ( ארג )

מחזירה את המשיק ההיפרבולי של ארגומנט .

בנוסף לפונקציות מוגדרות מראש אלה, יישומים יכולים להגדיר פונקציות נוספות באמצעות Tcl_CreateMathFunc ().

סוגי, גלישה, ו Precision

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

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

expr 5/4

חזר/, בעוד

expr 5 / 4.0 expr 5 / ([אורך מחרוזת "abcd"] + 0.0)

שניהם חוזרים 1.25. ערכים של נקודה צפה מוחזרים תמיד עם `` . '' או e כך שהם לא ייראו כמו ערכים שלמים. לדוגמה,

expr 20.0 / 5.0

חזר 4.0 , לא 4 .

פעולות מחרוזת

ניתן להשתמש בערכי מחרוזות כפעולות של מפעילי ההשוואה, אם כי מעריך הביטויים מנסה לבצע השוואות כמספר שלם או נקודה צפה כאשר הוא יכול. אם אחד האופראנים של השוואה הוא מחרוזת והשני יש ערך מספרי, המופרז המספרי מוחזר חזרה מחרוזת באמצעות C cfrff פורמט המפרט % d עבור מספרים שלמים ו % g עבור ערכי נקודה צפה. לדוגמה, הפקודות

expr {"0x03"> "2"} expr {"0y" <"0x12"}

שניהם חוזרים .1 ההשוואה הראשונה מתבצעת באמצעות השוואה של מספרים שלמים, והשנייה נעשית באמצעות השוואת מחרוזות לאחר שהמפעיל השני עובר למחרוזת 18 . בגלל נטייתו של Tcl לטפל בערכים כמספרים בכל מקום אפשרי, אין זה רעיון טוב להשתמש במפעילים כמו == כאשר אתה באמת רוצה השוואה מחרוזת ואת הערכים של אופרנים יכול להיות שרירותי; עדיף במקרים אלה להשתמש בפקודה מחרוזת במקום זאת.

שיקולי ביצועים

צרף ביטויים של הפלטה עבור המהירות הטובה ביותר ואת דרישות האחסון הקטן ביותר. זה מאפשר מהדר TCL bytecode ליצור את הקוד הטוב ביותר.

כאמור, ביטויים מוחלפים פעמיים: פעם על ידי מנתח TCL ופעם על ידי הפקודה expr . לדוגמה, הפקודות

הגדר קבוצה ב 3 {$ a + 2} expr $ b * 4

לחזור 11, לא מרובה של 4. זה בגלל מנתח TCL יהיה הראשון להחליף $ + 2 עבור המשתנה ב , אז הפקודה expr יהיה להעריך את הביטוי $ + 2 * 4 .

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

מילות מפתח

אריתמטי, בוליאני , להשוות, ביטוי, השוואה מטושטשת

חשוב: השתמש בפקודת הגבר ( % man ) כדי לראות כיצד נעשה שימוש בפקודה במחשב הספציפי שלך.