עבור לתוכן

קידום PRE ו POST

Featured Replies

פורסם

לפי מה שידוע לי קיימים שני סוגי קידום PRE ו POST

קידום PRE:


++var;

קידום POST:


var++;

עכשיו אני שואל את עצמי מה ההבדל? כבר הרבה זמן אני מנסה להבין את ההבדל..

והאם ה FOR הזה:


for(i=0;i<n;++i)

שונה מה FOR הזה


for(i=0;i<n;i++)

?

אם כן במה?

תדוה רבה על העזרה.

פורסם

שתי הלולאות אינן שונה.

נסה את הקוד הבא:


int f=1;
cout << f++ << endl;
f=1;
cout << ++f << endl;

הראשון ידפיס 1 ואילו השני 2 כיוון שבראשון פעולת ההוספת התבצעה אחרי ההדפסה ואילו בשני לפני ההדפסה.

פורסם

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

פורסם

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

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

פורסם

התכוונתי להימנע מלהשתמש בערך עצמו. לדוגמה, קוד כזה:

while (--i > 0)

הוא מכוער.

פורסם

בסופו של דבר זה עניין של סגנון.

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

לטוב או לרע, להרבה דברים ב-C יש side effects, ויש הרבה ביטויים של C שכל מתכנת C נורמלי צריך להכיר ולעקוב אחריהם בקלות.

לדוגמא הלולאה הבאה, שממש ברור מה היא עושה.


while (len--) *dst++ = *src++;

אני מאמין שהקוד פחות קריא כשכותבים אותו ככה:


while(len != 0)
{
len--;
*dst = *src;
src++;
dst++;
}

פורסם

בדוגמה הראשונה שלך, לקח לי זמן להבין אם הלולאה תרוץ len או len+1 פעמים.

בדוגמה השנייה לא.

אישית, הייתי כותב את הקוד ככה:

for ( ; len != 0 ; --len)
{
*dst = *src;
++dst;
++src;
}

לדעתי זה הכי ברור. זה ברור ש-len משמש כאינדקס עבור הלולאה.

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

פורסם

אם כבר -


for ( ; len != 0 ; *dst++ = *src++, --len);

חוסך קצת שורות :-).

פורסם

כמו שאמרתי, שאלה של סגנון.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים