| Home CBM ASCII-X BASIC Disk Commands Enter RUN mode Program Format Secret Variables Variable Format Expressions Keywords (divide) (equal) (less) (minus) (more) (multiply) (plus) (power) Abs And Append Asc Atn Auto Backup Bank Begin Bend Bload Boot Box Bsave Bump Catalog Char Chr Circle Close Clr Cmd Collect Collision Color Concat Cont Copy Cos Data Dclear Dclose Dec Def Delete Dim Directory Dispose Dload Do Dopen Draw Ds Ds string Dsave Dverify El Else End Envelope Er Err Exit Exp Fast Fetch Filter Fn For Fre Get Get num Getkey Go Gosub Goto Graphic Gshape Header Help Hex If Input Input num Instr Int Joy Key Left Len Let List Load Locate Log Loop Mid Monitor Movspr New Next Not Off On Open Or Paint Peek Pen Pi Play Pointer Poke Pos Pot Print num Pudef Quit Rclr Rdot Read Record Rem Rename Renumber Restore Resume Return Rgr Right Rlum Rnd Rreg Rspcolor Rsppos Rsprite Run Rwindow Save Scale Scnclr Scratch Sgn Sin Sleep Slow Sound Spc Sprcolor Sprdef Sprite Sprsav Sqr Sshape St Stash Step Stop Str Swap Sys Tab Tan Tempo Then Ti Ti string To Trap Troff Tron Until Using Usr Val Verify Vol Wait While Width Window Xor Syntax Tokens C128 D64plus Disk Escape Codes Hardware PCxface PETSCII Pet2asc Futurama IBM PC-AT Contact Games Glossary Hall of fame Hall of shame Miscellaneous Privacy policy Programming Twisty puzzles |
IF condition { GOTO lineNumTrue | THEN [ lineNumTrue | BEGIN ] } [ statementT ] [ : statementT ] ... [ statementT : ] ... BEND [ junk1 ] [ : ELSE [ lineNumFalse | BEGIN ] [ statementF ] [ : statementF ] ... [ statementF : ] ... BEND [ junk2 ] ]
* The selected command/statement must be valid for the current Interpreter mode
(valid for Direct Mode, or Run Mode, per the current state of the BASIC Interpreter).
Program flow control. Conditionally execute statement(s) or change program execution line.
First, IF evaluates the condition. The condition is often a mathematical relation, such as X < Y (evaluates to true [-1] or false [0]), or a simple numeric variable (such as B), or even (vary rarely) a numeric constant like 0. Sometimes (rarely) the condition is a "generic" expression such as X + Y*2. Second, a decision is made. If the condition evaluated to non-zero (true), the THEN clause is executed; otherwise the ELSE clause is executed (if present). If the condition evaluted to false (zero) and there is no ELSE clause, the program will continue on the next line (if any). Versions of BASIC that lack ELSE will often follow an IF/THEN construct with an unconditional GOTO (on a seperate line). Really the ELSE clause only makes programs a bit shorter by allowing the entire IF/THEN/ELSE to work on a single line... in theory! In practice, ELSE is also helpful because it avoids the use of the GOTO statement which is error-prone due to literal line numbers. (If BASIC allowed labels to refer to program lines [instead of only line numbers], this wouldn't be such a big deal.) The first statement following lineNumTrue, lineNumFalse, BEGIN, ELSE, or THEN (if any) does not need a leading colon (:). This makes typing programs a bit easier and saves a byte; however, many BASIC extensions will fail if a leading colon is not present. It seems this is a hack written by Microsoft in the original version of BASIC. It essentially short-circuits the normal BASIC execution logic, with some ugly side-effects. Besides causing trouble for BASIC extensions, HELP will highlight the entire IF / THEN / ELSE construct when the error occured in the THEN clause; similarly error trapping is messed up; the hacked implementation also delays execution of a COLLISION routine. The Syntax allows THEN (but not ELSE) to be replaced with GOTO for program branching, but attempting to use GO TO in this case will cause SYNTAX ERROR. You can blame Commodore for this bug. Contrary to the Syntax shown above, the entire IF/THEN/ELSE may (often does)
reside on a single program line; and BEND should only be paired with a preceding BEGIN.
Only BASIC v7.0 allows the IF/THEN/ELSE construct to span multiple lines. To accomplish this,
the keywords BEGIN and BEND are used to enclose the THEN clause and/or the ELSE clause.
The entire THEN clause may be contained on the same line as the IF statment;
in such cases BEGIN/BEND are unneccessary but allowed. Similarly the entire ELSE clause
may be contained in a single line (not neccessarily the same line containing IF),
in which case BEGIN/BEND are unneccessary but allowed.
In all cases, BEGIN/BEND are required when the executed clause (THEN or ELSE clause selected by IF)
spans multiple lines; and when BEGIN is included, a corresponding BEND should follow.
Technically, a BEND is only required to follow if the opposite clause is actually choosen for execution.
For example, IF 0 THEN BEGIN (and nothing else follows) will generate a BEND NOT FOUND ERROR;
this is because BASIC was trying to skip the THEN clause to find the (opposite) ELSE clause.
Trivia: there is no BEND WITHOUT BEGIN ERROR. Any BEND encountered will (normally)
be treated like an end-of-line (identical to REM), unless BASIC is searching for an ELSE clause
(like the example just given).
Sorry if that is confusing! I've included examples to hopefully clarify the mess!
Example:
© H2Obsession, 2014 |