The numbers are manipulated by expressions and statements. Since the language was designed to be interactive, statements and expressions are executed as soon as possible. There is no main program. Instead, code is executed as it is encountered. (Functions, discussed in detail later, are defined when encountered.)
A simple expression is just a constant.
bc converts constants
into internal decimal numbers using the current input base, specified by
the variable ibase. (There is an exception in functions.) The
legal values of ibase are 2 through 16. Assigning a value outside
this range to ibase will result in a value of 2 or 16. Input
numbers may contain the characters 0-9 and A-F. (Note: They must be
capitals. Lower case letters are variable names.) Single digit numbers
always have the value of the digit regardless of the value of
ibase. (i.e. A = 10.) For multi-digit numbers,
changes all input digits greater or equal to ibase to the value of
ibase-1. This makes the number
FFF always be the largest
3 digit number of the input base.
Full expressions are similar to many other high level languages. Since there is only one kind of number, there are no rules for mixing types. Instead, there are rules on the scale of expressions. Every expression has a scale. This is derived from the scale of original numbers, the operation performed and in many cases, the value of the variable scale. Legal values of the variable scale are 0 to the maximum number representable by a C integer.
In the following descriptions of legal expressions, "expr" refers to a complete expression and "var" refers to a simple or an array variable. A simple variable is just a
and an array variable is specified as
Unless specifically mentioned the scale of the result is the maximum scale of the expressions involved.
expr + expr
expr - expr
expr * expr
expr / expr
expr % expr
expr ^ expr
( expr )
var = expr
var <op>= expr
Relational expressions are a special kind of expression that always
evaluate to 0 or 1, 0 if the relation is false and 1 if the relation is
true. These may appear in any legal expression. (POSIX
requires that relational expressions are used only in
for statements and that only one relational
test may be done in them.) The relational operators are
expr1 < expr2
expr1 <= expr2
expr1 > expr2
expr1 >= expr2
expr1 == expr2
expr1 != expr2
Boolean operations are also legal. (POSIX
bc does NOT have
boolean operations). The result of all boolean operations are 0 and 1
(for false and true) as in relational expressions. The boolean
expr && expr
expr || expr
The expression precedence is as follows: (lowest to highest)
|| operator, left associative && operator, left associative ! operator, nonassociative Relational operators, left associative Assignment operator, right associative + and - operators, left associative *, / and % operators, left associative ^ operator, right associative unary - operator, nonassociative ++ and -- operators, nonassociative
This precedence was chosen so that POSIX compliant
will run correctly. This will cause the use of the relational and
logical operators to have some unusual behavior when used with
assignment expressions. Consider the expression:
a = 3 < 5
Most C programmers would assume this would assign the result of "3 <
5" (the value 1) to the variable "a". What this does in
assign the value 3 to the variable "a" and then compare 3 to 5. It is
best to use parentheses when using relational and logical operators
with the assignment operators.
There are a few more special expressions that are provided in
bc. These have to do with user-defined functions and standard
functions. They all appear as
)". See section Functions, for
user-defined functions. The standard functions are:
length ( expression )
read ( )
readfunction (an extension) will read a number from the standard input, regardless of where the function occurs. Beware, this can cause problems with the mixing of data and program in the standard input. The best use for this function is in a previously written program that needs input from the user, but never allows program code to be input from the user. The value of the
readfunction is the number read from the standard input using the current value of the variable ibase for the conversion base.
scale ( expression )
scalefunction is the number of digits after the decimal point in the expression.
sqrt ( expression )
sqrtfunction is the square root of the expression. If the expression is negative, a run time error is generated.
Go to the first, previous, next, last section, table of contents.