Home > CBM > BASIC > Keywords > Then
180 Subpages: (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, 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, Ti, Ti string, To, Trap, Troff, Tron, Until, Using, Usr, Val, Verify, Vol, Wait, While, Width, Window, Xor

KeywordAbbreviationToken (hex)Version(s)Classification
THENT{Shift+H}A71.0 to 7.0Preposition

 Syntax 
IF condition GOTO lineNumTrue | THEN [ lineNumTrue | BEGIN ] } [ statementT ] [ : statementT ] ...
[ statementT : ] ... BEND junk1 ] [ : ELSE lineNumFalse BEGIN ] [ statementF ] [ : statementF ] ...
[ statementF : ] ... BEND junk2 ] ]
 
ParametersTypeLegal Value(s)Default ValueNote(s)
conditionBoolean  all numeric 
lineNumTrue
Unsigned integer
0 ~ 63999
Must be a literal number
Branched to when condition is true (not 0)
statementT
Command or Statementall*
Must be valid in current direct/RUN mode
Executed when condition is true (not 0)
junk1
Literal character(s)
any but colon (:)
ignored; similar to DATA
lineNumFalse
Unsigned integer
0 ~ 63999
Only valid in v3.5, 4.7, and 7.0
Must be a literal number.
Branched to when condition is false (0)
statementF
Command or Statement
all* 
Only valid in v3.5, 4.7, and 7.0
Must be valid in current direct/RUN mode
Executed when condition is false (0)
junk2
Literal character(s)
all
ignored; just like REM

 
 Purpose 
Program flow control.  Conditionally execute statement(s) or change program execution line.

 
 Remarks 
Because the syntax shown above is rather complex, let me explain the 3 possibilities with the THEN clause.  THEN may be followed by:
  1. a literal line number (a numeric variable or expression is forbidden),
  2. or a series of statements that must all fit on the same line,
  3. or the BEGIN keyword (allows for multiple lines, but only in v7.0).
The THEN clause is only executed when the condition is true (evaluates to non-zero).
 
Like most prepositions, attempting to use THEN by itself (as a command or statement) will generate a SYNTAX ERROR.
 
The first statement following THEN (or lineNumTrue, lineNumFalse, BEGIN, or ELSE), 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.
 
* The selected command/statement(s) must be valid for the current Interpreter mode (Direct Mode or Run Mode, per the current state of the BASIC Interpreter).
  
Example 1:
IF 1 THEN PRINT "TRUE"
TRUE

READY.
X=0: IF X=1 THEN PRINT "TRUE"

READY.
IF X=0 THEN PRINT "EQUALS ZERO IS TRUE" : ELSE PRINT "UNTRUE"
EQUALS ZERO IS TRUE

READY.
NEW

READY.
10 X=1 : IF X=1 THEN BEGIN
20 : PRINT "TRUE" : X = 2 : BEND : ELSE PRINT "FALSE" : X = 0
30 PRINT X
RUN
TRUE 2

READY.
  
Example 2 is for BASIC v1.0 and v2.x which lack an ELSE clause (uses GOTO):
NEW

READY.
10 X=1 : IF X=1 THEN PRINT "TRUE" : X=2 : GOTO 30 :REM THEN clause + GOTO to skip ELSE clause
20 PRINT "FALSE" : X = 0 : REM the ELSE clause
30 PRINT X
RUN
TRUE 2

READY.
 
 See Also 
 
 Compare With 

© H2Obsession, 2014