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

תוכן הדף אינו נתמך בשפות אחרות.
מתוך ויקיפדיה, האנציקלופדיה החופשית

אני לא מסכים עם הרעיון הוא שקיומה של פקודת 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)[תגובה]