With the IF
statement you can test a condition and then run code based on whether the condition test passed or failed.
IF <condition> THEN <statements> END IF
The IF
clause runs the statements under it when the <condition> is evaluated to be TRUE (pass). If the <condition> evaluates to FALSE (fail), nothing is run.
You can optionally include <statements> that are run when the <condition> fails by adding an ELSE
clause
IF <condition> THEN <statements> ELSE <statements> END IF
XC=BASIC doesn't contain a boolean data type to represent true or false, it uses a BYTE
instead. The value of 0 represents FALSE. Any other value greater than 0 represents TRUE.
When the <condition> contains a comparison operator, such as =
or >
, the result of the comparison is set to 255 when the comparison passes, and 0 when it fails. The result is then processed as normal, with 0 representing FALSE and any other number representing TRUE.
If the <condition> is a numerical expression, such as 1
or 10 - 10
, the result is evaluated the same way as previously described.
The IF
statement can be written on a single line:
IF <condition> THEN <statements> [ELSE <statements>]
One or more code <statements> must be added to the THEN clause. If multiple statements are added, they must be separated by a colon.
The ELSE
clause is optional, and must contain at least one code <statement>. Multiple statements can be used if separated by a colon.
The single line IF
statement runs the same as the normal multi line IF
statement described in the previous section.
The ON statement allows you to define multiple branches and an index expression. This expression will be evaluated as a number N and the program will continue at the Nth label in the list of branches.
Note
The maximum allowed number of labels in the list is 256.
DIM x$ AS STRING * 8 INPUT "enter a number "; x$ ON SGN(VAL(x$)) + 1 GOTO negative, zero, positive negative: PRINT "you entered a negative number" END zero: PRINT "you entered zero" END positive: PRINT "you entered a positive number"
Warning
Unlike CBM BASIC, where the first label (or line number) corresponds to the number 1, in XC=BASIC labels are zero-based. The first label is used for value 0, the second for 1, and so on.
Warning
If index is evaluated to a number that has no matching label in the list, for example if the number is bigger than the allowed number of labels, the program may crash or behave abnormally.
ON
can also be used in combination with GOSUB.
Syntax:
FOR <variable> [AS <type>] = <start_value> TO <end_value> [STEP <step_value>] <statements> NEXT [<variable>]
The FOR … NEXT
loop initializes a counter variable and executes the statements until the counter variable equals the value in the TO
clause. After each iteration, the counter variable is incremented by the step value or 1 in case the step value was not specified. For example:
DIM i AS BYTE FOR i = 1 TO 30 STEP 3 PRINT i NEXT i
In the above, the counter variable is pre-defined. If the variable is not pre-defined, you can use the AS
keyword to specify the type and this way the compiler will automatically define the variable before starting the loop. The following code is identical to the one above:
FOR i AS BYTE = 1 TO 30 STEP 3 PRINT i NEXT i
Warning
The counter variable, the start value, the end value and the step value must all be of the same numeric type and this type is concluded from the counter variable. All the other expresions will be converted to this type if possible, otherwise a compile-time error will be thrown.
Note
The variable name can be omitted in the NEXT
statement.
You can use the CONTINUE FOR
command to skip the rest of the statements in the FOR … NEXT
block and go to the next iteration, for example:
REM -- print numbers from 1 to 10, except 5 and 7 FOR num AS BYTE = 1 TO 10 IF num = 5 OR num = 7 THEN CONTINUE FOR PRINT num NEXT
Finally, you can use the EXIT FOR
statement to early exit a FOR … NEXT
loop.
DIM a$ AS STRING * 1 FOR i AS BYTE = 1 TO 10 PRINT "iteration #"; i : INPUT "do you want to continue? (y/n)"; a$ IF a$ = "n" THEN EXIT FOR PRINT i NEXT i
The DO … LOOP
loop can be used as either a pre-test or post test loop.
DO WHILE|UNTIL <condition> <statements> LOOP
DO <statements> LOOP WHILE|UNTIL <condition>
The former is used to test the condition before entering the loop body and the latter is used to test the condition after each iteration. This effectively means that post-test loop will be executed at least once, whereas in a pre-test loop the condition may fail the very first time and therefore it may happen that the statements in the loop will not be executed at all.
In both types, you can either use the WHILE
or the UNTIL
keywords. WHILE
means that the loop is entered if the condition evaluates to true, UNTIL
means that the loop is exited if the condition evaluates to true.
Similarly to EXIT FOR
, you can use the EXIT DO
command to prematurely exit a DO … LOOP
block, or CONTINUE DO
to skip rest of the block and go to the next iteration.