שאלה בסי

ד"א

אמרו לי שזה לא מוגדר בגלל הסדר של העיבוד שלהם אבל בדוגמא הזאת לא משנה הסדר כי ה ++ מתבצע רק אחרי המשפט. אבל למשל בדוגמא הזאת:
a=++i;

אני מבין למה הוא לא מוגדר, כי ה ++ הוא לפני ה i וזה משתנה ברגע שזה מעבד אותו, אבל לא הבנתי למה כשה ++ אחרי ה i זה גם לא מוגדר
 

erezsh

New member
הוא לא מוגדר

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

annefan

New member
מה אתה לא מבין?

למה זה לא מוגדר? כי ועדת הסטנדרט החליטה שזו התנהגות לא מוגדרת... למה החליטו ככה? אולי בגלל שעל מנת לכפות את ההתנהגות האינטואיטיבית היה צורך להגדיר את = כ-sequence point, דבר שהיה משפיע על מקומות אחרים בשפה. אולי בגלל שעל מנת להגדיר חד-משמעית מה פעולה כזו עושה, אתה חייב לממש את ההשמה הנסתרת בתוך ++i לפני ההשמה ב-=. אולי בגלל שקשה למממשי קומפיילרים, לממש את ההתנהגות הזו, על פלטרפורמות מסוימות.
 

selalerer

New member
לא.

כאן i מופיע לך רק בצד אחד של השווה, אין שאלה (כמו קודם) של "את מי צריך לעדכן בערך?". גם קודם הערך שיושם היה ידוע, מה שלא ידוע זה היה לאן הוא יושם. ה"לאן" הוא יכול להיות שונה בקומפיילרים שונים.
 
יענו

אם ה ++ יופעל על ה i הראשון או השני? אז זה עדיין לא ממש משנה כי הוא מתבצע אחרי המשפט. ??
 
למה להסתבך בכלל?

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

גיל14

New member
נו, באמת.

Always avoid controversy. אתה לא תרשים אף אחד, ועם עוד סטייטמנט אחת תפתר הבעיה.
 
למעלה