עבור לתוכן

שפת c - סדר קדימויות

Featured Replies

פורסם

אם אופרטורים ++ ואפילו  && קודמים ל || אז למה בתכנית הבאה הביטויים סביב && כלל לא רצים והתשובה מתקבלת רק מאגף שמאל של הביטוי הארוך?

int i=2, j=2, k=2, m;
m = ++i ||  ++j&&++k;
printf("%d %d %d %d", i, j, k ,m);

            /*answer: 3 2 2 1 */

 

פורסם

קדימות של אופרטורים רק אומר שמה שמתבצע לוגית זה:

++i ||  (++j && ++k)

ולא זה:

(++i ||  ++j) && ++k

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

פורסם
  • מחבר

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

אז למה הבטוי בסוגריים לא מחושב לפני הביטוי מחוץ לסוגריים?

++i ||  (++j && ++k)
פורסם

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

 

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

https://en.wikipedia.org/wiki/Short-circuit_evaluation

פורסם
  • מחבר

הבנתי! תודה רבה

 

 

ארכיון

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

דיונים חדשים