עבור לתוכן

2 שאלות קטנות בC - לא מצליח להבין את ההגיון

Featured Replies

פורסם

שלום,

כאשר מופיע לי הקוד הבא:


#include <stdio.h>
#define square(x) x*x
void main() {
int x;
int a = 4;
x = square(a+1);
printf("%d", x);
}

הקומפיילר מבצע את זה ככה: x = 4+1*4+1 ואז התשובה תצא 9. לא הבנתי למה זה סדר הפעולות של הקומפיילר?

שאלה 2:

מה בדיוק מבצע השורה הבאה?

#define MAX(A, B) ( (A) > (B) ? (A) : (B) )

תודה לעוזרים

פורסם

שאלה 1:

הקומפיילר בעצם עובד בשני שלבים. שלב ראשון הוא שלב ה-preprocessor, שמבצע עיבוד מקדים על הקוד שלך. כל הפקודות שמתחילות ב-# הן פקודות ל-preprocessor.

פקודת include# לדוגמה פשוט מדביקה את התוכן של קובץ אחר בתוך הקובץ שלך (כלומר, במקרה של הקוד הזה, האינקלוד מדביק את התוכן של הקובץ stdio.h בתוך קובץ ה-c).

פקודת define# מגדירה מאקרו שעובר על החלפה פשוטה. בכל פעם שה-preprocessor נתקל בביטוי (square(x (כש-x יכול להיות כל דבר) הוא מחליף אותו בביטוי x*x. כלומר, הביטוי (square(a+1 מוחלף בביטוי a+1*a+1.

רק אחרי שה-preprocessor מסיים לחלוטין את עבודתו, הקומפיילר מתחיל לעבוד. כלומר, הקומפיילר בשום שלב לא נתקל בכלל במילה square והוא רק רואה את השורה הסופית ;x = a+1*a+1.

יש מבין?

שאלה 2:

בפני עצמה השורה הזו לא עושה כלום. היא רק מגדירה מאקרו בשם MAX שמקבל שני ארגומנטים. כלומר, כל פעם שהוא נתקל בקוד בביטוי (MAX(A,B (כמו קודם, A ו-B כאן יכולים להיות כל דבר) הוא מחליף אותו בביטוי ( (A) > (B) ? (A) : (B) ). לדוגמה, (MAX(3,5 יוחלף בזה

( (3) > (5) ? (3) : (5) )

פורסם
  • מחבר

הבנתי תודה.

לגבי שאלה מספר 2... נגיד שהצבתי 3 ו 5 כמו שהראת מה הוא מחזיר? הוא אמור להחזיר את הגדול מביניהם לא?

למה אז יש סימן שאלה? ולמה יש גם נקודותיים ?


#include <stdio.h>
#define MAX(A, B) (A) > (B) ? (A) : (B)
void main() {
int a=3, b=5;
printf("The maximum is %d\n", MAX(a, ++b));
}

למה יוחזר 7? למה הוא בעצם מקודם פעמיים?

פורסם

תחשוב מה קורה בדיוק כשאתה עושה ככה. תזכור - קודם כל ה-MAX מוחלף בתוכן של המאקרו, ורק אחר כך הקומפיילר רץ. איזו פקודה תהיה שם אחרי שה-preprocessor יסיים לרוץ?

פורסם
  • מחבר

הבנתי ואני יודע שלפני שהתוכנית תרוץ אז הפקודהב עצמה כאילו מופיעה בתוכנית אבל לא הבנתי מה עושה השורת קוד הזאת!

#define MAX(A, B) (A) > (B) ? (A) : (B)

איך תכלס היא עובדת? מדוע יש סימן שאלה? מדוע יש נקודותיים

פורסם
  • מחבר

תודה :xyxthumbs:

פורסם
  • מחבר

אני רוצה לשאול אם יש לך אולי מדריך להבין איך הדברים האלה עובדים:


int main()
{
int i = 32, j = 4, k, *q;
k = --i / j;
q = &j;
{
int i, j = 10;
i = j - ++(*q);
printf("i = %d, j = %d\n", i, j);
}
printf("i = %d, j = %d\n", i, j);
return 0;
}

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

פורסם

אין "מדריך". אתה פשוט צריך להכיר את סדר הפעולות (מה בא לפני מה, איזה פעולות מחושבות מימין לשמאל ואיזה משמאל לימין) ולעקוב אחריהן שלב אחר שלב. צריך לזכור שהפעולה x++ קודם כל מוסיפה 1 ל-x ואחר כך מחזירה את התוצאה שלאחר ההוספה (כלומר, אם לדוגמה x = 5 אז הערך של הביטוי x++ הוא 6). אותו דבר לגבי x--, עם חיסור במקום חיבור.

פשוט תבצע את הפעולות בזו אחר זו, אפילו עם דף ועפרון.

ארכיון

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

דיונים חדשים