מאקרו הורג !!!

The Mystique

New member
מאקרו הורג !!! ../images/Emo18.gif

לא ולא - רק מכשל. נכון תמיד נראה כאילו פקודות מאקרו באו לעזור לנו. יש לי דוגמא לאחד מאד מפתיע. נסו בעצמכם להריץ וראו איזה תוצאות קיבלתם. האם זה מתאים למה שחשבתם שתקבלו??? נכון שלא אם לא עליתם על הטריק, שאלו אותי
#include <stdio.h> #define ADD(A,B) (A+B) void main (void) { int x=5,y=2,z; z=ADD(x,++ y); printf("%d\t%d\t%d\t",x,y,z); }​
 

antidot

New member
מאקרו בהחלט לא הורג אם מגדירים נכון

כיוון שהגדרת לא נכון את המאקרו קיבלת מה שנקרא SIDE EFFECT זה אמור להיות: #define ADD(a,b) ((a)+(b)) מהשקרא אצלך זה שהפרה פרוססור הפך את הפעולת כפל ל z=x+++y אני אישית הייתי מצפה להתנהגות בלתי מוגדרת במקרה הזה, על יוניקס זה היה לדעתי נותן תוצאה אחרת
 

elhayany

New member
התשובה הנכונה ../images/Emo1.gif

התשובה היא כמובן: x=6 y=2 z=7 מה ייתן: (add(++x,y?
 

The Mystique

New member
גם זה מפתיע

הוא מחזיר 8=6 y=2 z=7 הוא קודם מחשב את הפלוס פלוס של X ואח"כ מחשב את Z בניגוד לקודם שהוא חישב תחילה את Z ואח"כ קידם את הערך של X ב-1. זה בגלל המיקום של הפלוס פלוס ? פעם מימין ופעם משמאל ?
 

antidot

New member
הסבר קצר

הפעולות מחושבות משמאל לימין כאשר יש פעולות שיש להן עדיפות יותר גבוהה כגון: פעולת כפל קודמת לחיבור הרחבה בנושא בלינק המצורף דבר נוסף: צריך מאוד להזהר בהגדרות המאקרו מכמה סיבות: - אי אפשר לדבג מאקרו הדבגר לא יכול להכנס לתוך הגדרת המאקר. - התופעות של SIDE EFFECT צריך למנוע ע"י הוספה פאראנוידאלית של סוגריים מסביב לכל משתנה. - מומלץ לא להשתמש במאקרו שמשנה את הערכים של של הפרמטרים - כאשר אפשר לכתוב פונקציה במקום מאקרו עדיף לכתוב פונקציה. ברכות ANTIDOT
 

The Mystique

New member
מאקרו מסקרן נוסף !

זה המאקרו וההצבה עליו:
#define SQUARE(X) ((X)*(X)) main() { int j,i=3; j=SQUARE(++i); }​
למה i מקודם פעמים, התוצאה הסופית של j היא 25 ??? מי יודע ?
 

antidot

New member
חחחח

כמו שאומרים המרצים "נפרק לשלבים" יש לנו j=((++i)*(++i)) 1) the left "i" is incremented ==> i=4 2) the right "i" is incremented ==> i=5 3) as we multiply variables and not values we get 5*5=25 אם את מתעקשת על מאקרו אז משהו כמו הקוד למטה יעזור #include <iostream.h> #include <math.h> #define SQUARE(X) (int)(pow(X,2)) main() { int j,i=3; j=SQUARE(++i); }
 

The Mystique

New member
אתה לא מיישר לשמאל

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

Hari

New member
תשובה

כי זה יוחלף ב- i++*i++ ז"א 5*5 כי יש קידום מוקדם של i אמיר
 
למעלה