שיחה:פקודת תנאי

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה לניווט קפיצה לחיפוש

אני לא מסכים עם הרעיון הוא שקיומה של פקודת If היא המבדילה בין שפת תכנות לשפת מחשב (דרך אגב, גם בפרולוג יש פקודת If). דוגמאות לא חסרות, בעיקר של Resource-ים, Preprocess-ים וכדומה שמכילים פקודת If פרמיטיבית. טרול רפאים 16:12, 30 אפר' 2005 (UTC)

גם לי זה נשמע קצת תמוה. Yonidebest Ω Talk 11:20, 17 פברואר 2006 (UTC)

תנאי מובנה[עריכת קוד מקור]

כל הפסקה לא ברורה לי ואיני מבין מדוע היא בערך. איני מכיר PHP, אך ב-C וב-++C, מדובר פשוט בסוג של אופרטור (טרינרי, במקרה זה). באופן כללי ניתן להשתמש בו בדרכים רבות ולא רק בתבנית של variable=cond ? x:y (כלומר, לא תמיד חייבים לבצע השמה ל-variable). בכל מקרה אין דמיון רב בינו לבין if (פרט לכך שבשני המקרים בודקים קיום תנאי) מכיוון ש-if מבצע statements, ואילו התנאי המובנה רק מעריך expressions. גדי אלכסנדרוביץ' 16:00, 10 באוקטובר 2006 (IST)

הפיסקה אכן שגויה (אפשר לתקן, כמובן), וגם מיקומה שגוי, אך אני מתקשה לחשוב על ערך שבו עדיף שתימצא. רעיונות? הא? 17:18, 10 באוקטובר 2006 (IST)
אולי בערך אודות אופרטור (תכנות). מה דעתך? הא? 17:19, 10 באוקטובר 2006 (IST)
קצת בעייתי (כי בערך ההוא לא מפורטים כל האופרטורים ולכן לא ברור אם יש בו מקום לפסקה שלמה על אופרטור אחד, אבל ברור שזה יותר טוב מכאן. גדי אלכסנדרוביץ' 18:17, 10 באוקטובר 2006 (IST)
תנאי מובנה זו צורת כתיבה אחרת לפקודת if. הזזתי את הפסקה הזו לרמה פנימית יותר. גדי ו. (שיחה) 02:19, 18 באוקטובר 2006 (IST)
אבל זה פשוט לא נכון. התנאי המובנה הוא expression, בזמן שפקודת if היא statement, ולכן יש מקומות שבהם ניתן להשתמש בתנאי המובנה אבל לא ניתן להשתמש בפקודת if. מצד שני, שני ערכי ההחזרה של התנאי המובנה הם expressions ולכן הוא לא יכול לבצע statements כמו פקודת if, ולכן יש דברים שניתן לכתוב עם if ולא ניתן לכתוב עם התנאי המובנה. בנוסף, התנאי המובנה לא משמש רק למטרות הצבה במשתנים, ומה שכתוב כרגע בערך נותן את הרושם שהוא כן. עוד דבר שלא ברור לי הוא למה הוא מכונה כאן "תנאי מובנה" בזמן שהשם המקובל באנגלית הוא "Conditional operator", מה שנשמע יותר כמו "אופרטור מותנה" (אבל אני לא מכיר את השם ה"רשמי" בעברית ואשמח לקבל הפניות למקורות שכבר תרגמו זאת). גדי אלכסנדרוביץ' 08:47, 18 באוקטובר 2006 (IST)

הוצאתי את האופרטור אל מחוץ לפסקה על התחביר, כיוון שהוא וריאציה אחרת של התניה ולא רק צורת כתיבה שונה.גדי ו. (שיחה) 15:50, 18 באוקטובר 2006 (IST)

טעות בערך?[עריכת קוד מקור]

לפי הדוגמה בערך, הפקודות של IF בפסקל ובבייסיק דומות, אולם למיטב ידיעתי בביסיק אין נקודה פסיק בסוף פקודה, ולכן הדוגמה שניתנת כאן לא נכונה לבייסיק. אולי אני טועה.צהוב עולה 01:09, 18 באוקטובר 2006 (IST)

יכול להיות שבאיזה וריאנט של בייסיק יש נקודה פסיק בסוף. זה בהחלט מצריך בדיקה. גדי ו. (שיחה) 02:24, 18 באוקטובר 2006 (IST)
כל עוד אנו לא יודעים שיש נקודה פסיק בבייסיק, אולי כדאי למחוק את זה. צהוב עולה 23:39, 18 באוקטובר 2006 (IST)

הצורה שהודגמה לעיל[עריכת קוד מקור]

בהתאם לפסאודו קוד:

if (condition-1) then statement1True
else if (condition-2) then statement2True
else if (condition-3) then statement3True
else statementAllFalse;

ניתן לכתוב:

(condition-1) ? statement1True
: (condition-2) ? statement2True
: (condition-3) ? statement3True
: statementAllFalse;

אבל, אם זה לא היה מספיק ברור, אז מגיע לי שזה נמחק. גדי ו. (שיחה) 23:21, 18 באוקטובר 2006 (IST)

אני לא חושב שזה נכון, מפני שאלו אמורים להיות expressions ולא statements, כפי שציין גדי מספר פעמים. זה לפחות המצב ב-C ו-Cpp. הא? 23:27, 18 באוקטובר 2006 (IST)
כבר כתבתי דברים כאלו. זה עובד ללא ספק.
statment1False הוא התנאי השני עד הסוף,
statment2False הוא התנאי השלישי עד הסוף,
statment3False הוא statementAllFalse.
גדי ו. (שיחה) 00:30, 19 באוקטובר 2006 (IST)
אם כתבת דברים כאלו ודאי תוכל להביא דוגמא שעובדת. עבורי למשל הדוגמה הבאה לא עוברת קומפילציה ב-++g:
  • (3<5)?(if (3<5) cout << "true\n"):(if (3>5) cout << "false\n");"
ייתכן שיש קומפיילרים שכן תומכים ב-statements שם, אבל יש גם קומפיילרים שתומכים במערכים מגודל דינמי. גדי אלכסנדרוביץ' 19:06, 22 באוקטובר 2006 (IST)
מצטער על אי הדיוק המשווע. במקום statments צריך להיות expressions (כפי שמצויין בפסקה שמדברת על אופרטור). גדי ו. (שיחה) 21:34, 22 באוקטובר 2006 (IST)
זה כמובן נכון, אבל עכשיו לא ברור לי מה נמחק, ומתי. גדי אלכסנדרוביץ' 21:55, 22 באוקטובר 2006 (IST)
מה שנמחק זה זה. גדי ו. (שיחה) 10:39, 23 באוקטובר 2006 (IST)

דוגמה לאסמבלי?[עריכת קוד מקור]

מה עם דוגמה לאסמבלי?

דוגמה שעולה לי לראש (אולי יש לי טעויות קטנות): בודקת האם EAX שווה ל-EBX.

cmp eax, ebx
je statementTrue
statementFalse:‎ (השורה הזו לא חובה כמובן)
[פקודות למקרה שהם שונים]
jmp Continue
statementTrue:‎
[פקודות למקרה שהם שווים]
Continue:‎
[המשך התוכנית]

צהוב עולה 23:32, 18 באוקטובר 2006 (IST)

בהמשך לדוגמה זו, בשפת הסף המוכרת לי (אסמבלר 370), האפשרות "אם הערך באוגר R2 גדול מהערך באוגר R4 הקטן את הערך באוגר R2 ב-1" שמוצגת בערך ממומשת בסדרה של פקודות. אופתע לשמוע על שפת סף שעושה זאת בשתי פקודות בלבד. דוד שי 07:06, 19 באוקטובר 2006 (IST)
באסמבלי של PowerPC יש פקודת cmp שמדליקה ביט carry וקיימת פקודת sub בשילוב עם סיבית הנשא, כך שאפשר בשתי פקודות לבצע את זה. אבל את הדוגמא בערך תיקנתי כי רציתי להדגים שם פקודה מותנת שלמה ולא חצי. גדי ו. (שיחה) 10:10, 19 באוקטובר 2006 (IST)
באסמבלי של מעבד ה MIPS זה אפשרי. SLT R1,R4,R2 ולאחר מכן SUB R2,R2,R1. אני בטוח שיש גם וריאציה של זה באסמבלי של ה 8086 Wraith - שיחה 15:35, 28 ביולי 2012 (IDT)

משוב מ-9 בפברואר 2012[עריכת קוד מקור]

יהי נחמד אם יהיו קצט יותר פירוטים בדוגמאות של if ארוך שמרכיב כמה ifים כגון a>b?(c>a)?:b 109.65.195.118 20:04, 9 בפברואר 2012 (IST)

שם הערך[עריכת קוד מקור]

כל פקודות המחשב בויקיפדיה (לדוגמא: קטגוריה:פקודות יוניקס) אינן מכילות את הקידומת "פקודת XXX", לדעתי יש לשנות את שם הערך ל-if ולהוסיף הפניה לפירושונים שיכילו את שאר המשמעויות, יש מתנגדים? הוי ארצי - שיחה 13:55, 10 בספטמבר 2012 (IDT)

אם כבר מה רע בתנאי (תכנות) או משהו בסגנון, כמו לולאה ולא פקודת for? -יונה בנדלאק - שיחה 21:47, 10 בספטמבר 2012 (IDT)
מסכים עם יונה. כדאי להחליף לתנאי (תכנות) או התניה (תכנות). אני מכיר לפחות שפת תכנות אחת שבה תנאי לא כולל מילה IF. גיא - שיחה 12:59, 11 בספטמבר 2012 (IDT)
"תנאי" זה לא המונח המתאים, כי מדובר בפקודה ולא סתם בהתניה. למילה תנאי יש משמעויות נוספות מאשר בהקשר של פקודה. גיא, הנקודה היא לא המילה הספציפית, ואין שפת תכנות אימפרטיבית שאיננה כוללת את המבנה הזה (smalltalk לצורך הדיון לא אימפרטיבית, ובאמת אין אצלה תנאים בכלל. רק קישור דינמי). --אלעזר - שיחה 22:18, 13 בספטמבר 2012 (IDT)
אפשר פקודת תנאי. גיא - שיחה 13:46, 15 בספטמבר 2012 (IDT)
אפשר. --אלעזר - שיחה 20:00, 19 בספטמבר 2012 (IDT)
העברתי. גיא - שיחה 13:16, 23 בספטמבר 2012 (IST)