ABA


"קדימיות אופרטורים"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15570 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15570
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   19:24   22.11.09   
אל הפורום  
  קדימיות אופרטורים  
 
   ערכתי לאחרונה בתאריך 22.11.09 בשעה 19:30 בברכה, ronen333
 
ניתן לי המצב הזה:

int c,a,b;
a=1;
c=(a||(a++))*a;

וזה מדפיס לי c=1 a=1.
למה? =/

a++

תמיד מתבצע בסוף.. אז זה 1||1 נותן 1.
ואז 1*1. סבבה אז בC יש 1.
אבל למה הוא לא מקדם בסוף את הa?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אופרטור ''או'' בודק אם מתקיים התנאי הראשון. Zippo  22.11.09 19:56 1
     אווו נכון ... תודה אח שלי =] ronen333  22.11.09 19:58 2
     שניה אני מבולבל שוב P= ronen333  22.11.09 20:02 3
         תסתכל על האסמבלי אם יש ספק... קשה לזכור את כל השטיקים של הקומפיילר DLN 22.11.09 23:07 4
         אם אתה מדבר על שפת C (זה לא בהכרח נכון לשפות אחרות) ldan192  22.11.09 23:11 5
             כע מדובר בC. ronen333  22.11.09 23:21 7
                 אני משער שמדברים אצלכם על קומפיילרים סטנדרטיים ל-C ldan192  22.11.09 23:30 8
  ב c++ יש העמסת אופרטורים VeNom  22.11.09 23:16 6
  יש תשובה מוחלטת, פשוט צריך לעקוב אחרי הכללים. Deuce  22.11.09 23:59 9
  תודה לכולם על העזרה :). ronen333  23.11.09 19:02 10

       
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   19:56   22.11.09   
אל הפורום  
  1. אופרטור ''או'' בודק אם מתקיים התנאי הראשון.  
בתגובה להודעה מספר 0
 
אם לא מתקיים הוא בודק את התנאי השני, אם הוא מתקיים, הוא אפילו לא בודק את התנאי השני.ובטח שלא מבצע אותו...

מאחר ואין פה איזה שאלת תנאי, אלא רק השמה, אז החלק הראשון אמיתי.
ולכן מתקיים, ומה שאחרי ה- || בכלל לא נקרא.

אם אתה רוצה שזה יתבצע (ואני בכלל לא מבין למה לכתוב קוד שכזה) תשתמש ב- && (וגם).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   19:58   22.11.09   
אל הפורום  
  2. אווו נכון ... תודה אח שלי =]  
בתגובה להודעה מספר 1
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   20:02   22.11.09   
אל הפורום  
  3. שניה אני מבולבל שוב P=  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 22.11.09 בשעה 20:07 בברכה, ronen333
 
אי פלוס פלוס הוא בסוגריים. זה לא נותן לו עדיפות על ה"או"?

פאק קומפילר זה דבר מסובך...

נב- זה לא שעשיתי את זה בתוכנית שלי זה פשוט שאלה מתוך מבחן.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   23:07   22.11.09   
אל הפורום  
  4. תסתכל על האסמבלי אם יש ספק... קשה לזכור את כל השטיקים של הקומפיילר  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:11   22.11.09   
אל הפורום  
  5. אם אתה מדבר על שפת C (זה לא בהכרח נכון לשפות אחרות)  
בתגובה להודעה מספר 3
 
אז תראה דוגמא שאולי תסביר לך את המקרה
if (x==3 || c==2) do ... od
תסכים איתי שאם x==3 אין צורך לבדוק האם c==2.
זה בדיוק מה שקורה פה.
אם a (ב-C הכוונה האם a!=0 ==> true) אז c=a*a;
אם תיקח כערך התחלתי a=0, אזי a!=0 ==> false, הוא יבצע ++a והאמת היא שאתה דיי גורם פה לסתירה בסדרה הקדימויות של הקומפיילר וזה תלוי קומפיילר מכאן והלאה.
אם תרשום a++ לא תהיה סתירה (ב-VS השניים הנ"ל יעבדו אותו הדבר במקרה שלך).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   23:21   22.11.09   
אל הפורום  
  7. כע מדובר בC.  
בתגובה להודעה מספר 5
 
   ערכתי לאחרונה בתאריך 22.11.09 בשעה 23:27 בברכה, ronen333
 
ואני יודע שברגע שתנאי אחד מתקיים באו אז זה מספיק.. זה פשוט מבלבל רצח בגלל הסוגריים שהם דרגה מעל לכאורה (?)

אם זה תלוי קומפילר זה דפוק רצח.. חלק משאלת מעקב במבחן גם כן :|


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:30   22.11.09   
אל הפורום  
  8. אני משער שמדברים אצלכם על קומפיילרים סטנדרטיים ל-C  
בתגובה להודעה מספר 7
 
כגון GCC, VS.
הקומפיילרים שיודעים למקבל חלק מהקוד - שמה זה באמת יכול להיות אי-דטרמיניסטי (לא צפוי).
למרות שאני דיי בטוח שקומפיילרים כאלה ברגע שאחד הפרמטרים משתנה הופכים את הבדיקה לסדרתית כמו בשאר הקומפיילרים או שכן מורצים במקביל, אבל המשתנים בסקופ משוכפלים (לא יכול לומר בוודאות).


שורה תחתונה, מה שביקשו ממך זה מה שעניתי.
שים לב שעבור a=0 אכן מקודם המשתנה.


בנוגע לדרגה מעל - דרגה מעל ביחס לחיצוני.
כלומר מחושב הערך בתוך הסוגריים לפני המכפלה עצמה.
אבל מה שמחושב בתוך הסוגריים עצמפ יש להם סדר קדימויות בלתי תלוי כבר.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   23:16   22.11.09   
אל הפורום  
  6. ב c++ יש העמסת אופרטורים  
בתגובה להודעה מספר 0
 
   ורואים בדיוק מה קורה..
בקיצור מה שקורה זה שב++ שאחרי המשתנה נוצר אובייקט זמני בעל אותו ערך ואותו מחזירים..ובעצם מאחורי הקלעים עושים קידום ל a המקורי החל מסוף הביטוי כלומר שורה אחת אח"כ.
ב++ שלפני המשתנה אין שום יצירה של אובייקט זמני ואת השינוי עושה במיידי ב a המקורי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:59   22.11.09   
אל הפורום  
  9. יש תשובה מוחלטת, פשוט צריך לעקוב אחרי הכללים.  
בתגובה להודעה מספר 0
 
האופרטור או הזה || משערך כל ביטוי עד שהוא מקבל ביטוי אמת. מכיוון ש-a עצמו אמת אז הוא לא משערך בכלל את הביטוי השני, ולכן הוא לא מבוצע. לכן A נשאר 1 ו-C שווה ל-1.

שווה לך לבדוק אגב מה קורה אם תחליף בין a ל-a++ - זה שווה בדיקה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   19:02   23.11.09   
אל הפורום  
  10. תודה לכולם על העזרה :).  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net