שאלה קטנה ב C --->

שאלה קטנה ב C --->

האם ההוראה הבאה מותרת :
while(x>y>2) {}​
לדוגמה:
int x=5,y=4; while(x>y>2) {x++; } מה הלולאה הזו בודקת
את מה היא משווה למה
תודה
 

yair24

Member
ניסיתי להריץ

וזה לא נותן לי תוצאות עם משמעות. אם מה שאתה מנסה לעשות זה את הדבר הבא: כל עוד X גדול מY וגם Y גדול מ2 אז תשתמש באופרטור && בצורה הבאה:
while(x>y && y>2) { x++; } יאיר​
 

gilad_no

New member
מותר, כן, אבל לא צפוי

זה בעצם שקול ל:
(x>y) > 2​
בC כל ערך השונה מ0 הוא אמת (גם מספר שלילי) יכול להיות מצב שהתוצאה של הביטוי הראשון תהיה חיובית ויכול להיות שהיא תהיה שלילית. זה תלוי במספרים
 

yair24

Member
תסביר בבקשה למה שלילי?

לדעתי אם X גדול מY אז זה יהיה מספר חיובי כלשהו (שזה אמת, יכול להיות גם שלילי אבל למה?) ואם X שווה או קטן מY אז זה יהיה 0 (שקר) בכל מקרה אין לזה משמעות ולדעתי מה שהוא מנסה לעשות שם זה את מה שכתבתי בתשובה הראשונה. יאיר
 
OK על השוויון אין ויכוח אבל מה שלא

הבנתי בהתחלה הוא מה המשמעות של הביטוי (זה שאלה מתוך מבחן ) והעניין שלא היה : x>y&&y>2 זה לא בעייתי במיוחד,פשוט לא הבנתי איך הקומפיילר מתייחס לביטוי והאם הלולאה תתבצע ואם כן אז כמה פעמים(מה למעשה הוא משווה למה). נ.ב.תודה על התשובות.
 

yair24

Member
לא נכון

שים לב: X=5 Y=4 X>Y כן לכן הביטוי מקבל 1 1>2 לא לכן לא נכנס לWHILE. יאיר
 

yair24

Member
קבל תוכנית לבדיקה:

#include<stdio.h> void main() { printf("true value=%d false value=%d", (5>2) , (5>10) ); }​
אם תריץ את התוכנית תראה שערך אמת זה 1 וערך שקר זה 0 יאיר
 
נו,את זה אני יודע, הבעיה היא הבנת

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

gilad_no

New member
למה שלילי

ברוב המהדרים, הבדיקה באמת מחזירה 0 או 1. אבל ראיתי כבר כמה מקומות שהשוויון נבדק ע"י חיסור או אפילו ע"י XOR. מחסירים את אחד המשתנים מהשני: אם קיבלנו 0, הם היו שווים, אם לא, אז הם שונים. במקרה כזה, אם המספק הראשון קטן יותר מהשני, התוצאה של החיבור הנ"ל תיתן מספר שלילי שהוא עדיין TRUE. שוב, זה לא בכל מהדר ולפעמים זה תלוי בפרמטרים של אופטימיזציה, אבל כדאי לדעת את זה כאשר בונים תוכנית ולא להניח הנחות יסוד שלא תמיד נכונות.
 

yair24

Member
אבל אתה שוכח משהו קטן...

כאן אתה בודק אם X גדול מY ולא אם הוא שווה לו כאן ה-0 צריך להיות אם X גדול מ Y ואם הוא שווה לו אז דוקא צריך להיות 1 מה שאתה אומר יהיה נכון למקרה שבו אתה שואל האם X שונה(!!) מY ואז מבצעים חיסור אם יצא מספר חיובי או שלילי אז זה אמת (X שונה מY) ואם יוצא 0 אז זה שקר (X=Y) יאיר
 

yair24

Member
האמת שגם לי יש פה טעות

במשפט הראשון אז בגלל זה ה"תשכח מזה"
אבל בוא אני אתן לך חידה שפעם כבר נתתי פה :
unsigned int x; int y; x=6; y=-20; if((x+y)>0) printf("true"); else printf("false"); }​
מה יהיה הפלט ולמה? (נא להיות הוגנים ולפתור מבלי להריץ) יאיר
 

zontar

New member
הפלט יהיה TRUE בגלל שעם פעולות

על UNSIGNED התוצאה המתקבלת היא UNSIGNED אפילו אם רק אחד מהאיברים הוא מהטיפוס הנ"ל.
 

zontar

New member
X+Y = -14 כמובן אולם התייחסות

הקומפיילר בהשוואה היא כאל UNSIGNED .
 

zontar

New member
לא הבנתי את כוונתך: אם תדפיס את

התוצאה תקבל 14- !
 

yair24

Member
אם התוצאה היתה -14...

אז הוא היה מדפיס FALSE... הכוונה בשאלה שלי לאיזה מספר בדיוק המחשב מתייחס כאשר הוא מבצע את בדיקת הIF. יאיר
 
למעלה