פקודת תנאי

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

קיומה של פקודה מותנית (כדוגמת הפקודה if) בשפה הוא אחד הקריטריונים הראשונים להבחנה בין שפת תכנות לשפת מחשב שאינה שפת תכנות.

## עקרונות
כדי שתוכנת מחשב תהיה יותר מסתם רצף פקודות היא צריכה להכיל מנגנון להתניית ביצוע של קטעי קוד. לדוגמה, כדי להציג מספר שהוא הגדול מבין שניים נתונים, התוכנה חייבת לבחור לפי תנאי כלשהו מהי הפעולה הנכונה לביצוע.

בכל שפת תכנות יש פקודות התניה או פקודות מותנות. המבנה הכללי של פקודות ההתניה הוא:

* *condition* הוא משפט עם ערך בוליאני של אמת או שקר.
* *statements-1* זו קבוצה הפקודות שיבוצעו רק אם ערך התנאי הוא אמת.
* *statements-2* זו קבוצה הפקודות שיבוצעו רק אם ערך התנאי הוא שקר.

## תנאי מורחב או מקונן
**תנאי מקונן** הוא משפט תנאי שמופיע בתוך קבוצת הפקודות המותנות.

הרחבה של משפט התנאי אפשרית ברוב השפות העיליות במבנה הבא:

למעשה **תנאי מורחב** הוא צורת כתיבה מסודרת של **תנאי מקונן** כך שאוסף התנאים נראים כמשפט בקרה מרובה בחירות.

## ביטוי תנאי
בשפות תכנות מסוימות, כגון: C, C++&lrm; ו-PHP קיימים ביטויי תנאי, שבמקום רק לקבוע איזה פעולות יקרו הוא גם מחזיר ערך (Expression), כתלות בתנאי שהוא מקבל. בשפות מסוימות כמו Haskell לא קיימים פקודות תנאי, אלא רק ביטויי תנאי.

דוגמה לביטוי תנאי היא ternary, שמאפשר לבדוק תנאי ולהחזיר ערך לפי הבדיקה בשורה אחת:

ומשמעותו: אם התנאי *condition* מתקיים, מחושב ערכו של *expressionTrue* ומוחזר כערכו של הביטוי כולו, אחרת מחושב ומוחזר ערכו של *expressionFalse*.

רק אחד משני ביטויים אלו מחושב.

שימוש נפוץ לביטוי תנאי הוא מימוש של מעין אופרטורים max ו-min. מימוש של (max(a,b יכול להיכתב כך: 

## דוגמאות לתחביר הפקודה בשפות עיליות
### [[C (שפת תכנות)|C]], [[C plus plus|C++]], [[C sharp|C#]], [[Java]], [[PHP]] ו־[[JavaScript]]

`
 '''if''' (''condition'')
 {
   ''statementTrue'';
 }
 '''else'''
 {
   ''statementFalse'';
 }
`


בשפות אלה גם קיימת פקודת תנאי בשורה אחת:

```text
condition ? evaluated-when-true : evaluated-when-false
```


### [[Pascal]]

`
 '''if''' ''condition'' '''then'''
   '''begin'''
     ''statementTrue'';
   '''end'''
 '''else'''
   '''begin'''
     ''statementFalse'';
   '''end;'''
`


### [[Basic]]

`
 '''if''' ''condition'' '''then'''
   ''statementTrue''
 '''else'''
   ''statementFalse''
 '''end if'''
`


### [[לוגו (שפת תכנות)|לוגו]]
בניגוד לשפות אחרות, בלוגו ההבחנה בין שתי צורות הפקודה נעשית על ידי שינוי שם הפקודה.

`
 '''if''' ''condition'' [''statementTrue'']

 '''ifelse''' ''condition'' [''statementTrue''] [''statementFalse'']
`


## תחביר הפקודה ב[[שפת סף|שפות סף]]
בשפות סף אין התניה לביצוע קבוצת פקודות, אלא ביצוע מותנה של פקודה בודדת. ברוב המקרים, בלוקים מורכבים של תנאים, מתורגמים בשפת הסף לפקודות קפיצה, והחלקים השונים של התנאי נקראים ענפים  או הסתעפות.

דוגמאות אפשריות לפקודת אסמבלי מותנית:
* אם הערך באוגר R2 הוא 0 עבור לפקודה שכתובתה נמצאת באוגר R7.
* אם הערך באוגר R2 גדול מהערך באוגר R4 הדלק ביט באוגר סטטוס. (הביט הזה יוכל לשמש בפקודות הבאות)
באסמבלי אין תנאים מקוננים או מורחבים, כל בקרת הזרימה של הקוד מבוצעת על ידי ביצוע מותנה של פקודות בודדות ובעיקר של פקודות מהסוג: אם  עבור ל 

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

```bnf

```


לפרטים נוספים: 

## קישורים חיצוניים

קטגוריה:תכנות