THE PROGRAMMER'S GUIDE.   BASIC 7.1
APPENDIX C:   OPERATORS AND EXPRESSIONS

              S   U   B   T   I   T   L   E   S   :  
              OPERATORS AND EXPRESSIONS DEFINED
              HIERARCHY OF OPERATIONS
              ARITHMETIC OPERATORS
              INTEGER DIVISION
              MODULO ARITHMETIC
              OVERFLOW AND DIVISION BY ZERO
              RELATIONAL OPERATORS
              LOGICAL OPERATORS
              FUNCTIONAL OPERATORS
              STRING OPERATORS

THIS APPENDIX DISCUSSES HOW TO COMBINE, MODIFY, COMPARE, OR GET INFORMATION ABOUT EXPRESSIONS BY USING THE FIVE KINDS OF OPERATORS AVAILABLE IN BASIC.

( TOP ) OPERATORS AND EXPRESSIONS DEFINED ( TOP )

ANYTIME YOU DO A CALCULATION OR MANIPULATE A STRING, YOU ARE USING EXPRESSIONS AND OPERATORS. AN EXPRESSION CAN BE A STRING OR NUMERIC CONSTANT, A VARIABLE, OR A SINGLE VALUE OBTAINED BY COMBINING CONSTANTS, VARIABLES, AND OTHER EXPRESSIONS WITH OPERATORS.

OPERATORS PERFORM MATHEMATICAL OR LOGICAL OPERATIONS ON VALUES.
THERE ARE FIVE CATEGORIES OF OPERATORS IN BASIC:

ARITHMETIC
RELATIONAL
LOGICAL
FUNCTIONAL
STRING

( TOP ) HIERARCHY OF OPERATIONS ( TOP )

THE BASIC OPERATORS HAVE AN ORDER OF PRECEDENCE. WHEN SEVERAL OPERATIONS TAKE PLACE WITHIN THE SAME PROGRAM STATEMENT, OPERATIONS ARE EXECUTED IN THE FOLLOWING ORDER:

1.–   ARITHMETIC OPERATIONS:
    A.–   EXPONENTIATION (^)
    B.–   NEGATION (–)
    C.–   MULTIPLICATION AND DIVISION (*,   /)
    D.–   INTEGER DIVISION (\)
    E.–   MODULO ARITHMETIC (MOD)
    F.–   ADDITION AND SUBTRACTION (+,   –)
2.–   RELATIONAL OPERATIONS:   (=,   >,   <,   < >,   <=,   >=)
3.–   LOGICAL OPERATIONS:    NOT,   AND,   OR,   XOR,   EQV,   IMP

AN EXCEPTION TO THE PRECEDING ORDER OF OPERATIONS OCCURS WHEN AN EXPRESSION HAS ADJACENT EXPONENTIATION AND NEGATION OPERATORS. IN THIS CASE, THE NEGATION IS DONE FIRST. FOR EXAMPLE, THE FOLLOWING STATEMENT PRINTS THE VALUE .0625 (EQUIVALENT TO 4–2), NOT  16 (EQUIVALENT TO –(42)):

PRINT 4 ^ – 2

IF THE OPERATIONS ARE DIFFERENT AND ARE OF THE SAME LEVEL, THE LEFTMOST OPERATION IS EXECUTED FIRST AND THE RIGHTMOST LAST:

A = 3 + 6 / 12 * 3 - 2 'A = 2.5

THE ORDER OF OPERATIONS IN THE PRECEDING EXAMPLE IS AS FOLLOWS:

6 / 12 0.5
0.5 * 3 1.5
3 + 1.5 4.5
4.5 - 2 2.5

IN A SERIES OF ADDITIONS OR A SERIES OF MULTIPLICATIONS, THERE IS NO FIXED EVALUATION ORDER. EITHER: 3 + 5 OR 5 + 6
MAY BE CALCULATED FIRST IN THE FOLLOWING STATEMENT:
C = 3 + 5 + 6

USUALLY THIS DOES NOT CAUSE PROBLEMS. HOWEVER, IT MAY CAUSE A PROBLEM IF YOU HAVE A SERIES OF FUNCTION PROCEDURE CALLS:

C = INCR(X) + DECR(X) + F(X)

IF ANY OF THE THREE FUNCTION PROCEDURES MODIFY X OR CHANGE SHARED VARIABLES, THE RESULT DEPENDS ON THE ORDER IN WHICH BASIC DOES THE ADDITIONS. YOU CAN AVOID THIS SITUATION BY ASSIGNING THE RESULTS OF THE FUNCTION CALLS TO TEMPORARY VARIABLES AND THEN PERFORMING THE ADDITION:

T1 = INCR(X): T2 = DECR(X): T3 = F(X)
C = T1 + T2 + T3

( TOP ) ARITHMETIC OPERATORS ( TOP )

PARENTHESES CHANGE THE ORDER IN WHICH ARITHMETIC OPERATIONS ARE PERFORMED. OPERATIONS WITHIN PARENTHESES ARE PERFORMED FIRST. INSIDE PARENTHESES, THE USUAL ORDER OF OPERATION IS MAINTAINED.

GENERALLY, YOU MUST SEPARATE TWO CONSECUTIVE OPERATORS WITH PARENTHESES. EXCEPTIONS TO THIS RULE ARE * - , * +, ^ -, AND ^+. YOU COULD ALSO WRITE X*(-Y) AS X*-Y. SEE THE PRECEDING SECTION FOR INFORMATION ABOUT ORDER OF ARITHMETIC OPERATIONS.

( TOP ) INTEGER DIVISION ( TOP )

INTEGER DIVISION IS DENOTED BY THE BACKSLASH (\) INSTEAD OF THE FORWARD SLASH (/) (WHICH INDICATES FLOATING-POINT DIVISION). BEFORE INTEGER DIVISION IS PERFORMED, OPERANDS ARE ROUNDED TO INTEGERS OR LONG INTEGERS, SO THEY MUST BE GREATER THAN -2,147,483,648.5 AND LESS THAN 2,147,483,647.5. THE QUOTIENT OF AN INTEGER DIVISION IS TRUNCATED TO AN INTEGER.

EXAMPLE.~   THE FOLLOWING EXAMPLE CONTRASTS INTEGER AND FLOATING-POINT DIVISION:

PRINT 10\4, 10/4, -32768.499\10, -32768.499/10

OUTPUT:

2    2.5    -3276    -3276.8499

( TOP ) MODULO ARITHMETIC ( TOP )

MODULO ARITHMETIC IS DENOTED BY THE MODULUS OPERATOR, MOD. MODULO ARITHMETIC PROVIDES THE REMAINDER, RATHER THAN THE QUOTIENT, OF AN INTEGER DIVISION.
EXAMPLE.~   THE FOLLOWING EXAMPLE SHOWS A MODULO OPERATION:

X% = 10.4\4
REMAINDER% = INT(10.4) - 4*X% '10\4 = 2, WITH REMAINDER 2
PRINT REMAINDER%, 10.4 MOD 4

OUTPUT: 2 2

( TOP ) OVERFLOW AND DIVISION BY ZERO ( TOP )

DIVIDING BY ZERO, RAISING ZERO TO A NEGATIVE POWER, AND ARITHMETIC OVERFLOW PRODUCE RUN-TIME ERRORS. THESE ERRORS CAN BE TRAPPED BY AN ERROR-TRAPPING ROUTINE. SEE CHAPTER 8, "ERROR HANDLING", FOR MORE INFORMATION ABOUT ERROR TRAPPING.

( TOP ) RELATIONAL OPERATORS ( TOP )

YOU CAN USE RELATIONAL OPERATORS TO COMPARE TWO VALUES. THE RESULT OF THE COMPARISON IS EITHER TRUE (NONZERO) OR FALSE (ZERO). YOU CAN USE THE RESULT TO MAKE A DECISION REGARDING PROGRAM FLOW. ALTHOUGH BASIC TREATS ANY NONZERO VALUE AS TRUE, TRUE IS USUALLY REPRESENTED BY -1.

TABLE C.1 LISTS THE RELATIONAL OPERATORS. IF YOU COMBINE ARITHMETIC AND RELATIONAL OPERATORS IN ONE EXPRESSION, THE ARITHMETIC OPERATIONS ARE ALWAYS DONE FIRST. FOR EXAMPLE, THE FOLLOWING EXPRESSION IS TRUE IF THE VALUE OF X + Y IS LESS THAN THE VALUE OF (T-1)/Z:

X + Y < (T - 1)/Z

BE CAREFUL USING RELATIONAL OPERATORS WITH SINGLE- AND DOUBLE-PRECISION VALUES. CALCULATIONS MAY GIVE EXTREMELY CLOSE BUT NOT IDENTICAL RESULTS. IN PARTICULAR, AVOID TESTING FOR IDENTITY BETWEEN TWO VALUES. FOR EXAMPLE, THE PRINT STATEMENT IN THE FOLLOWING IF STATEMENT IS NOT EXECUTED UNLESS A! IS EXACTLY EQUAL TO 0.0:

IF A! = 0.0 THEN PRINT "EXACT RESULT."

WHEN A! IS AN EXTREMELY SMALL VALUE, FOR EXAMPLE 1.0E -23, THE PRINT STATEMENT IS NOT EXECUTED. IN ADDITION, A COMPILED PROGRAM (.EXE FILE) MAY GIVE DIFFERENT RESULTS THAN THE SAME PROGRAM RUN IN THE QBX ENVIRONMENT.

FILES WITH THE .EXE EXTENSION CONTAIN MORE EFFICIENT CODE THAT MAY CHANGE THE WAY SINGLE- AND DOUBLE-PRECISION VALUES ARE COMPARED. FOR EXAMPLE, THE FOLLOWING FRAGMENT PRINTS EQUAL WHEN RUN IN THE QBX ENVIRONMENT, BUT PRINTS NOT EQUAL WHEN COMPILED:

B!=1.0
A!=B!/3.0
IF A!=B!/3.0 THEN PRINT "EQUAL" ELSE PRINT "NOT EQUAL"

BECAUSE THE COMPILED VERSION MAKES MORE EXTENSIVE USE OF A MATH COPROCESSOR CHIP (OR COPROCESSOR EMULATION), A! AND B!/3.0 ARE SLIGHTLY DIFFERENT VALUES. YOU CAN AVOID PROBLEMS IN COMPARISONS BY PERFORMING CALCULATIONS OUTSIDE COMPARISONS. THE FOLLOWING REWRITTEN FRAGMENT PRODUCES THE SAME RESULTS WHETHER YOU RUN IT UNDER QBX OR COMPILE IT:

B!=1.0
A!=B!/3.0
TMP!=B!/3.0
IF A!=TMP! THEN PRINT "EQUAL" ELSE PRINT "NOT EQUAL"

( TOP ) LOGICAL OPERATORS ( TOP )

LOGICAL OPERATORS PERFORM TESTS ON MULTIPLE RELATIONS, BIT MANIPULATIONS, OR BOOLEAN OPERATIONS. THEY RETURN A TRUE (NONZERO) OR FALSE (ZERO) VALUE TO BE USED IN MAKING A DECISION.

IF D < 200 AND F < 4 THEN 80
WHILE I > 10 OR K < 0
...
WEND
IF NOT P THEN PRINT "NAME NOT FOUND"

THE SIX BASIC LOGICAL OPERATORS ARE LISTED IN TABLE C.2 IN ORDER OF PRECEDENCE. EACH OPERATOR RETURNS RESULTS AS INDICATED IN TABLE C.3. "T" INDICATES A TRUE VALUE AND "F" INDICATES A FALSE VALUE. OPERATORS ARE LISTED IN ORDER OF OPERATOR PRECEDENCE.

IN AN EXPRESSION, LOGICAL OPERATIONS (ALSO KNOWN AS BOOLEAN OPERATIONS) ARE PERFORMED AFTER ARITHMETIC AND RELATIONAL OPERATIONS. OPERANDS ARE CONVERTED TO INTEGERS (OR, IF NECESSARY, LONG INTEGERS) BEFORE THE LOGICAL OPERATION IS DONE.

THE OPERANDS OF LOGICAL OPERATORS MUST BE IN THE RANGE -2,147,483,648 TO 2,147,483,647. IF THE OPERANDS ARE NOT IN THIS RANGE, AN ERROR RESULTS. IF THE OPERANDS ARE EITHER 0 OR -1, LOGICAL OPERATORS RETURN 0 OR -1 AS THE RESULT, AS IN THE FOLLOWING EXAMPLE.

EXAMPLE.~   THE FOLLOWING EXAMPLE PRINTS A "TRUTH TABLE":
PRINT " X       Y      NOT     AND     OR      ";
PRINT "XOR     EQV     IMP"
PRINT
I = 10: J = 15
X = (I = 10): Y = (J = 15) 'X IS TRUE (-1); Y IS TRUE (-1)
CALL TRUTHTABLE (X,Y)
X = (I > 9): Y = (J > 15) 'X IS TRUE (-1); Y IS FALSE (0)
CALL TRUTHTABLE (X,Y)
X = (I <> 10): Y = (J < 16) 'X IS FALSE (0); Y IS TRUE (-1)
CALL TRUTHTABLE (X,Y)
X = (I < 10): Y = (J < 15) 'X IS FALSE (0); Y IS FALSE (0)
CALL TRUTHTABLE (X,Y)
END
SUB TRUTHTABLE(X,Y) STATIC
PRINT X "    " Y "    "; NOT X "  " X AND Y "     " X OR Y;
PRINT "    " X XOR Y "    " X EQV Y "    " X IMP Y
PRINT
END SUB
OUTPUT:
 X   Y  NOT AND OR  XOR EQV IMP
-1  -1   0  -1  -1   0  -1  -1
-1   0   0   0  -1  -1   0   0
 0  -1  -1   0  -1  -1   0  -1
 0   0  -1   0   0   0  -1  -1
NOTE THE SIMILARITY OF THE OUTPUT FROM THIS PROGRAM TO THE TABLE C.3: "T" BECOMES -1 AND "F" BECOMES 0. LOGICAL OPERATORS COMPARE EACH BIT OF THE FIRST OPERAND WITH THE CORRESPONDING BIT IN THE SECOND OPERAND TO COMPUTE THE BIT IN THE RESULT. IN THESE BIT-WISE COMPARISONS, A 0 BIT IS EQUIVALENT TO A FALSE VALUE (F) IN THE TABLE C.3, WHILE A 1 BIT IS EQUIVALENT TO A TRUE VALUE (T).

IT IS POSSIBLE TO USE LOGICAL OPERATORS TO TEST BYTES FOR A PARTICULAR BIT PATTERN. FOR EXAMPLE, THE AND OPERATOR CAN BE USED TO MASK ALL BUT ONE OF THE BITS OF A STATUS BYTE, WHILE THE OR OPERATOR CAN BE USED TO MERGE TWO BYTES TO CREATE A PARTICULAR BINARY VALUE.

PRINT 63 AND 16
PRINT -1 AND 8
PRINT 10 OR 9
PRINT 10 XOR 10, 'ALWAYS 0
PRINT NOT 10, NOT 11, NOT 0 'NOT X = -(X + 1)

OUTPUT:
 16
 0 -11-12-1
THE FIRST PRINT STATEMENT USES AND TO COMBINE 63 (111111 BINARY) AND 16 (10000). WHEN BASIC CALCULATES THE RESULT OF AN AND, IT COMBINES THE NUMBERS BIT BY BIT, PRODUCING A 1 ONLY WHEN BOTH BITS ARE 1. BECAUSE THE ONLY BIT THAT IS A 1 IN BOTH NUMBERS IS THE FIFTH BIT, ONLY THE FIFTH BIT IN THE RESULT IS A 1.

THE RESULT IS 16, OR 10000 IN BINARY. IN THE SECOND PRINT STATEMENT, THE NUMBERS -1 (BINARY 1111111111111111) AND 8 (BINARY 1000) ARE COMBINED USING ANOTHER AND OPERATION. THE ONLY BIT THAT IS A 1 IN BOTH NUMBERS IS THE FOURTH BIT, SO THE RESULT IS 8 DECIMAL OR 1000 BINARY.

THE THIRD PRINT STATEMENT USES AN OR TO COMBINE 10 (BINARY 1010) AND 9 (BINARY 1001). AN OR PRODUCES A 1 BIT WHENEVER EITHER BIT IS A 1, SO THE RESULT OF THE OR IN THE THIRD PRINT IS 11 (BINARY 1011). THE XOR IN THE FOURTH PRINT STATEMENT COMBINES THE NUMBER 10 (1010 BINARY) WITH ITSELF. THE RESULT IS A 0 BECAUSE AN XOR PRODUCES A 1 ONLY WHEN EITHER, BUT NOT BOTH, BITS ARE 1.

PERFORMING A NOT ON A NUMBER CHANGES ALL 1S TO 0S AND ALL 0S TO 1S. BECAUSE OF THE WAY TWO'S COMPLEMENT NUMBERS WORK, TAKING THE NOT OF A VALUE IS THE SAME AS ADDING ONE TO THE NUMBER AND THEN NEGATING THE NUMBER. IN THE FINAL PRINT STATEMENT, THE EXPRESSION NOT 10 YIELDS A RESULT OF -11.

( TOP ) FUNCTIONAL OPERATORS ( TOP )

YOU CAN USE A FUNCTION IN AN EXPRESSION TO CALL A PREDETERMINED OPERATION TO BE PERFORMED ON AN OPERAND. FOR EXAMPLE, SQR IS A FUNCTIONAL OPERATOR USED TWICE IN THE FOLLOWING ASSIGNMENT STATEMENT:

A = SQR (20.25) + SQR (37)

BASIC INCORPORATES TWO KINDS OF FUNCTIONS: INTRINSIC AND USER-DEFINED. MANY PREDEFINED (INTRINSIC) FUNCTIONS ARE BUILT INTO THE LANGUAGE. EXAMPLES ARE THE SQR (SQUARE ROOT) AND SIN (SINE) FUNCTIONS.

YOU CAN DEFINE YOUR OWN FUNCTIONS WITH THE FUNCTION... END FUNCTION CONSTRUCTION AND THE OLDER, OBSOLETE DEF FN... END DEF CONSTRUCTION. SUCH FUNCTIONS ARE DEFINED ONLY FOR THE LIFE OF THE PROGRAM (UNLESS THEY ARE IN A QUICK LIBRARY) AND ARE NOT PART OF THE BASIC LANGUAGE.

IN ADDITION TO FUNCTION AND DEF FN, YOU CAN DEFINE SUBPROGRAMS WITH SUB. FOR MORE INFORMATION ON DEFINING YOUR OWN FUNCTIONS AND SUBPROGRAMS, SEE APPENDIX D, "MODULES AND PROCEDURES", AND CHAPTER 2, "SUB AND FUNCTION PROCEDURES". ALSO, SEE THE BASIC LANGUAGE REFERENCE.

( TOP ) STRING OPERATORS ( TOP )

A STRING EXPRESSION CONSISTS OF STRING CONSTANTS, STRING VARIABLES, AND OTHER STRING EXPRESSIONS COMBINED BY STRING OPERATORS. THERE ARE TWO CLASSES OF STRING OPERATIONS:
CONCATENATION AND STRING FUNCTION.

THE ACT OF COMBINING TWO STRINGS IS CALLED CONCATENATION. THE PLUS SYMBOL (+) IS THE CONCATENATION OPERATOR FOR STRINGS.
EXAMPLE.~   THE FOLLOWING EXAMPLE PROGRAM FRAGMENT COMBINES THE STRING VARIABLES A$ AND B$ TO PRODUCE THE OUTPUT SHOWN.

A$ = "FILE": B$ = "NAME"
PRINT A$ + B$
PRINT "NEW " + A$ + B$

OUTPUT:
FILENAME
NEW FILENAME

YOU CAN COMPARE STRINGS USING THE FOLLOWING RELATIONAL OPERATORS (SEE TABLE C.1):
<,   >,   =,   <>,   <=,   >=

NOTE THAT THESE ARE THE SAME RELATIONAL OPERATORS USED WITH NUMBERS. STRING COMPARISONS ARE MADE BY TAKING CORRESPONDING CHARACTERS FROM EACH STRING AND COMPARING THEIR ASCII CODES. IF THE ASCII CODES ARE THE SAME FOR ALL THE CHARACTERS IN BOTH STRINGS, THE STRINGS ARE EQUAL. IF THE ASCII CODES DIFFER, THE LOWER CODE NUMBER PRECEDES THE HIGHER.

IF THE END OF ONE STRING IS REACHED DURING STRING COMPARISON, THE SHORTER STRING IS SMALLER IF THEY ARE EQUAL UP TO THAT POINT. LEADING AND TRAILING BLANKS ARE SIGNIFICANT. THE FOLLOWING ARE EXAMPLES OF TRUE STRING EXPRESSIONS:

"AA" < "AB"
"FILENAME" = "FILE" + "NAME"
"X&" > "X#"
"CL " > "CL"
"KG" > "KG"
"SMYTH" < "SMYTHE"
B$ < "9/12/78" 'WHERE B$ = "8/12/85"

YOU CAN USE STRING COMPARISONS TO TEST STRING VALUES OR TO ALPHABETIZE STRINGS. ALL STRING CONSTANTS USED IN COMPARISON EXPRESSIONS MUST BE ENCLOSED IN QUOTATION MARKS. FOR MORE INFORMATION ABOUT ASCII CODES, SEE APPENDIX A, "KEYBOARD SCAN CODES AND ASCII CHARACTER CODES", IN THE BASIC LANGUAGE REFERENCE.

( TOP )