|
|
1.1 root 1: .\" @(#)bc 6.1 (Berkeley) 5/23/86
2: .\"
3: .EH 'USD:6-%''BC \- An Arbitrary Precision Desk-Calculator Language'
4: .OH 'BC \- An Arbitrary Precision Desk-Calculator Language''USD:6-%'
5: .\".RP
6: .TL
7: BC \- An Arbitrary Precision Desk-Calculator Language
8: .AU
9: Lorinda Cherry
10: .AU
11: Robert Morris
12: .AI
13: .MH
14: .AB
15: BC is a language and a compiler for doing arbitrary precision arithmetic
16: on the PDP-11 under the
17: .UX
18: time-sharing
19: system. The output of the compiler is interpreted and executed by
20: a collection of routines which can input, output, and do
21: arithmetic on indefinitely large integers and on scaled fixed-point
22: numbers.
23: .PP
24: These routines are themselves based on a dynamic storage allocator.
25: Overflow does not occur until all available core storage
26: is exhausted.
27: .PP
28: The language has a complete control structure as well as immediate-mode
29: operation. Functions can be defined and saved for later execution.
30: .PP
31: Two five hundred-digit numbers can be multiplied to give a
32: thousand digit result in about ten seconds.
33: .PP
34: A small collection of library functions is also available,
35: including sin, cos, arctan, log, exponential, and Bessel functions of
36: integer order.
37: .PP
38: Some of the uses of this compiler are
39: .IP \-
40: to do computation with large integers,
41: .IP \-
42: to do computation accurate to many decimal places,
43: .IP \-
44: conversion of numbers from one base to another base.
45: .AE
46: .PP
47: .SH
48: Introduction
49: .PP
50: BC is a language and a compiler for doing arbitrary precision
51: arithmetic on the
52: .UX
53: time-sharing system [1].
54: The compiler was written to make conveniently available a
55: collection of routines (called DC [5]) which are capable of doing
56: arithmetic on integers of arbitrary size. The compiler
57: is by no means intended to provide a complete programming
58: language.
59: It is a minimal language facility.
60: .PP
61: There is a scaling provision that permits the
62: use of decimal point notation.
63: Provision is made for input and output in bases other than
64: decimal. Numbers can be converted from decimal to octal by
65: simply setting the output base to equal 8.
66: .PP
67: The actual limit on the number of digits that can
68: be handled depends on the amount of storage available on the machine.
69: Manipulation of numbers with many hundreds of digits
70: is possible even on the smallest versions of
71: .UX .
72: .PP
73: The syntax of BC has been deliberately selected to agree
74: substantially with the C language [2]. Those who
75: are familiar with C will find few surprises in this language.
76: .SH
77: Simple Computations with Integers
78: .PP
79: The simplest kind of statement is an arithmetic expression
80: on a line by itself.
81: For instance, if you type in the line:
82: .DS
83: .ft B
84: 142857 + 285714
85: .ft P
86: .DE
87: the program responds immediately with the line
88: .DS
89: .ft B
90: 428571
91: .ft P
92: .DE
93: The operators \-, *, /, %, and ^ can also be used; they
94: indicate subtraction, multiplication, division, remaindering, and
95: exponentiation, respectively. Division of integers produces an
96: integer result truncated toward zero.
97: Division by zero produces an error
98: comment.
99: .PP
100: Any term in an expression may be prefixed by a minus sign to
101: indicate that it is to be negated (the `unary' minus sign).
102: The expression
103: .DS
104: .ft B
105: 7+\-3
106: .ft P
107: .DE
108: is interpreted to mean that \-3 is to be added to 7.
109: .PP
110: More complex expressions with several operators and with
111: parentheses are interpreted just as in
112: Fortran, with ^ having the greatest binding
113: power, then * and % and /, and finally + and \-.
114: Contents of parentheses are evaluated before material
115: outside the parentheses.
116: Exponentiations are
117: performed from right to left and the other operators
118: from left to right.
119: The two expressions
120: .DS
121: .ft B
122: a^b^c and a^(b^c)
123: .ft P
124: .DE
125: are equivalent, as are the two expressions
126: .DS
127: .ft B
128: a*b*c and (a*b)*c
129: .ft P
130: .DE
131: BC shares with Fortran and C the undesirable convention that
132: .DS
133: \fBa/b*c\fP is equivalent to \fB(a/b)*c\fP
134: .ft P
135: .DE
136: .PP
137: Internal storage registers to hold numbers have single lower-case
138: letter names. The value of an expression can be assigned to
139: a register in the usual way. The statement
140: .DS
141: .ft B
142: x = x + 3
143: .ft P
144: .DE
145: has the effect of increasing by three the value of the contents of the
146: register named x.
147: When, as in this case, the outermost operator is an =, the
148: assignment is performed but the result is not printed.
149: Only 26 of these named storage registers are available.
150: .PP
151: There is a built-in square root function whose
152: result is truncated to an integer (but see scaling below).
153: The lines
154: .DS
155: .ft B
156: x = sqrt(191)
157: x
158: .ft P
159: .DE
160: produce the printed result
161: .DS
162: .ft B
163: 13
164: .ft P
165: .DE
166: .SH
167: Bases
168: .PP
169: There are special internal quantities, called `ibase' and `obase'.
170: The contents of `ibase', initially set to 10,
171: determines the base used for interpreting numbers read in.
172: For example, the lines
173: .DS
174: .ft B
175: ibase = 8
176: 11
177: .ft P
178: .DE
179: will produce the output line
180: .DS
181: .ft B
182: 9
183: .ft P
184: .DE
185: and you are all set up to do octal to decimal conversions.
186: Beware, however of trying to change the input base back
187: to decimal by typing
188: .DS
189: .ft B
190: ibase = 10
191: .ft P
192: .DE
193: Because the number 10 is interpreted as octal, this statement will
194: have no effect.
195: For those who deal in hexadecimal notation,
196: the characters A\-F are permitted in numbers
197: (no matter what base is in effect)
198: and are
199: interpreted as digits having values 10\-15 respectively.
200: The statement
201: .DS
202: .ft B
203: ibase = A
204: .ft P
205: .DE
206: will change you back to decimal input base no matter what the
207: current input base is.
208: Negative and large positive input bases are
209: permitted but useless.
210: No mechanism has been provided for the input of arbitrary
211: numbers in bases less than 1 and greater than 16.
212: .PP
213: The contents of `obase', initially set to 10, are used as the base for output
214: numbers. The lines
215: .DS
216: .ft B
217: obase = 16
218: 1000
219: .ft P
220: .DE
221: will produce the output line
222: .DS
223: .ft B
224: 3E8
225: .ft P
226: .DE
227: which is to be interpreted as a 3-digit hexadecimal number.
228: Very large output bases are permitted, and they are sometimes useful.
229: For example, large numbers can be output in groups of five digits
230: by setting `obase' to 100000.
231: Strange (i.e. 1, 0, or negative) output bases are
232: handled appropriately.
233: .PP
234: Very large numbers are split across lines with 70 characters per line.
235: Lines which are continued end with \\.
236: Decimal output conversion is practically instantaneous, but output
237: of very large numbers (i.e., more than 100 digits) with other bases
238: is rather slow.
239: Non-decimal output conversion of
240: a one hundred digit number takes about
241: three seconds.
242: .PP
243: It is best to remember that `ibase' and `obase' have no effect
244: whatever on the course of internal computation or
245: on the evaluation of expressions, but only affect input and
246: output conversion, respectively.
247: .SH
248: Scaling
249: .PP
250: A third special internal quantity called `scale' is
251: used to determine the scale of calculated
252: quantities.
253: Numbers may have
254: up to 99 decimal digits after the decimal point.
255: This fractional part is retained in further computations.
256: We refer to the number of digits after the decimal point of
257: a number as its scale.
258: .PP
259: When two scaled numbers are combined by
260: means of one of the arithmetic operations, the result
261: has a scale determined by the following rules. For
262: addition and subtraction, the scale of the result is the larger
263: of the scales of the two operands. In this case,
264: there is never any truncation of the result.
265: For multiplications, the scale of the result is never
266: less than the maximum of the two scales of the operands,
267: never more than the sum of the scales of the operands
268: and, subject to those two restrictions,
269: the scale of the result is set equal to the contents of the internal
270: quantity `scale'.
271: The scale of a quotient is the contents of the internal
272: quantity `scale'. The scale of a remainder is
273: the sum of the scales of the quotient and the divisor.
274: The result of an exponentiation is scaled as if
275: the implied multiplications were performed.
276: An exponent must be an integer.
277: The scale of a square root is set to the maximum of the scale
278: of the argument and the contents of `scale'.
279: .PP
280: All of the internal operations are actually carried out in terms
281: of integers, with digits being discarded when necessary.
282: In every case where digits are discarded, truncation and
283: not rounding is performed.
284: .PP
285: The contents of
286: `scale' must be no greater than
287: 99 and no less than 0. It is initially set to 0.
288: In case you need more than 99 fraction digits, you may arrange
289: your own scaling.
290: .PP
291: The internal quantities `scale', `ibase', and `obase' can be
292: used in expressions just like other variables.
293: The line
294: .DS
295: .ft B
296: scale = scale + 1
297: .ft P
298: .DE
299: increases the value of `scale' by one, and the line
300: .DS
301: .ft B
302: scale
303: .ft P
304: .DE
305: causes the current value of `scale' to be printed.
306: .PP
307: The value of `scale' retains its meaning as a
308: number of decimal digits to be retained in internal
309: computation even when `ibase' or `obase' are not equal to 10.
310: The internal computations (which are still conducted in decimal,
311: regardless of the bases) are performed to the specified number
312: of decimal digits, never hexadecimal or octal or any
313: other kind of digits.
314: .SH
315: Functions
316: .PP
317: The name of a function is a single lower-case letter.
318: Function names are permitted to collide with simple
319: variable names.
320: Twenty-six different defined functions are permitted
321: in addition to the twenty-six variable names.
322: The line
323: .DS
324: .ft B
325: define a(x){
326: .ft P
327: .DE
328: begins the definition of a function with one argument.
329: This line must be followed by one or more statements,
330: which make up the body of the function, ending
331: with a right brace }.
332: Return of control from a function occurs when a return
333: statement is executed or when the end of the function is reached.
334: The return statement can take either
335: of the two forms
336: .DS
337: .ft B
338: return
339: return(x)
340: .ft P
341: .DE
342: In the first case, the value of the function is 0, and in
343: the second, the value of the expression in parentheses.
344: .PP
345: Variables used in the function can be declared as automatic
346: by a statement of the form
347: .DS
348: .ft B
349: auto x,y,z
350: .ft P
351: .DE
352: There can be only one `auto' statement in a function and it must
353: be the first statement in the definition.
354: These automatic variables are allocated space and initialized
355: to zero on entry to the function and thrown away on return. The
356: values of any variables with the same names outside the function
357: are not disturbed.
358: Functions may be called recursively and the automatic variables
359: at each level of call are protected.
360: The parameters named in a function definition are treated in
361: the same way as the automatic variables of that function
362: with the single exception that they are given a value
363: on entry to the function.
364: An example of a function definition is
365: .DS
366: .ft B
367: define a(x,y){
368: auto z
369: z = x*y
370: return(z)
371: }
372: .ft P
373: .DE
374: The value of this function, when called, will be the
375: product of its
376: two arguments.
377: .PP
378: A function is called by the appearance of its name
379: followed by a string of arguments enclosed in
380: parentheses and separated by commas.
381: The result
382: is unpredictable if the wrong number of arguments is used.
383: .PP
384: Functions with no arguments are defined and called using
385: parentheses with nothing between them: b().
386: .PP
387: If the function
388: .ft I
389: a
390: .ft
391: above has been defined, then the line
392: .DS
393: .ft B
394: a(7,3.14)
395: .ft P
396: .DE
397: would cause the result 21.98 to be printed and the line
398: .DS
399: .ft B
400: x = a(a(3,4),5)
401: .ft P
402: .DE
403: would cause the value of x to become 60.
404: .SH
405: Subscripted Variables
406: .PP
407: A single lower-case letter variable name
408: followed by an expression in brackets is called a subscripted
409: variable (an array element).
410: The variable name is called the array name and the expression
411: in brackets is called the subscript.
412: Only one-dimensional arrays are
413: permitted. The names of arrays are permitted to
414: collide with the names of simple variables and function names.
415: Any fractional
416: part of a subscript is discarded before use.
417: Subscripts must be greater than or equal to zero and
418: less than or equal to 2047.
419: .PP
420: Subscripted variables may be freely used in expressions, in
421: function calls, and in return statements.
422: .PP
423: An array name may be used as an argument to a function,
424: or may be declared as automatic in
425: a function definition by the use of empty brackets:
426: .DS
427: .ft B
428: f(a[\|])
429: define f(a[\|])
430: auto a[\|]
431: .ft P
432: .DE
433: When an array name is so used, the whole contents of the array
434: are copied for the use of the function, and thrown away on exit
435: from the function.
436: Array names which refer to whole arrays cannot be used
437: in any other contexts.
438: .SH
439: Control Statements
440: .PP
441: The `if', the `while', and the `for' statements
442: may be used to alter the flow within programs or to cause iteration.
443: The range of each of them is a statement or
444: a compound statement consisting of a collection of
445: statements enclosed in braces.
446: They are written in the following way
447: .DS
448: .ft B
449: if(relation) statement
450: while(relation) statement
451: for(expression1; relation; expression2) statement
452: .ft P
453: .DE
454: or
455: .DS
456: .ft B
457: if(relation) {statements}
458: while(relation) {statements}
459: for(expression1; relation; expression2) {statements}
460: .ft P
461: .DE
462: .PP
463: A relation in one of the control statements is an expression of the form
464: .DS
465: .ft B
466: x>y
467: .ft P
468: .DE
469: where two expressions are related by one of the six relational
470: operators \fS <, >, <=, >=, ==, or !=.\fP
471: The relation \fS==\fP
472: stands for `equal to' and \fS!=\fP stands for `not equal to'.
473: The meaning of the remaining relational operators is
474: clear.
475: .PP
476: BEWARE of using \fS=\fP instead of \fS==\fP in a relational. Unfortunately,
477: both of them are legal, so you will not get a diagnostic
478: message, but \fS=\fP really will not do a comparison.
479: .PP
480: The `if' statement causes execution of its range
481: if and only if the relation is true.
482: Then control passes to the next statement in sequence.
483: .PP
484: The `while' statement causes execution of its range
485: repeatedly as long as the relation
486: is true. The relation is tested before each execution
487: of its range and if the relation
488: is false, control passes to the next statement beyond the range
489: of the while.
490: .PP
491: The `for' statement begins
492: by executing `expression1'. Then the relation is tested
493: and, if true, the statements in the range of the `for' are executed.
494: Then `expression2' is executed. The relation is tested, and so on.
495: The typical use of the `for' statement is for a controlled iteration,
496: as in the statement
497: .DS
498: .ft B
499: for(i=1; i<=10; i=i+1) i
500: .ft P
501: .DE
502: which will print the integers from 1 to 10.
503: Here are some examples of the use of the control statements.
504: .DS
505: .ft B
506: define f(n){
507: auto i, x
508: x=1
509: for(i=1; i<=n; i=i+1) x=x*i
510: return(x)
511: }
512: .ft P
513: .DE
514: The line
515: .DS
516: .ft B
517: f(a)
518: .ft P
519: .DE
520: will print
521: .ft I
522: a
523: .ft
524: factorial if
525: .ft I
526: a
527: .ft
528: is a positive integer.
529: Here is the definition of a function which will
530: compute values of the binomial coefficient
531: (m and n are assumed to be positive integers).
532: .DS
533: .ft B
534: define b(n,m){
535: auto x, j
536: x=1
537: for(j=1; j<=m; j=j+1) x=x*(n\-j+1)/j
538: return(x)
539: }
540: .ft P
541: .DE
542: The following function computes values of the exponential function
543: by summing the appropriate series
544: without regard for possible truncation errors:
545: .DS
546: .ft B
547: scale = 20
548: define e(x){
549: auto a, b, c, d, n
550: a = 1
551: b = 1
552: c = 1
553: d = 0
554: n = 1
555: while(1==1){
556: a = a*x
557: b = b*n
558: c = c + a/b
559: n = n + 1
560: if(c==d) return(c)
561: d = c
562: }
563: }
564: .ft P
565: .DE
566: .SH
567: Some Details
568: .PP
569: There are some language features that every user should know
570: about even if he will not use them.
571: .PP
572: Normally statements are typed one to a line. It is also permissible
573: to type several statements on a line separated by semicolons.
574: .PP
575: If an assignment statement is parenthesized, it then has
576: a value and it can be used anywhere that an expression can.
577: For example, the line
578: .DS
579: .ft B
580: (x=y+17)
581: .ft P
582: .DE
583: not only makes the indicated assignment, but also prints the
584: resulting value.
585: .PP
586: Here is an example of a use of the value of an
587: assignment statement even when it is not parenthesized.
588: .DS
589: .ft B
590: x = a[i=i+1]
591: .ft P
592: .DE
593: causes a value to be assigned to x and also increments i
594: before it is used as a subscript.
595: .PP
596: The following constructs work in BC in exactly the same manner
597: as they do in the C language. Consult the appendix or the
598: C manuals [2] for their exact workings.
599: .DS
600: .ft B
601: .ta 2i
602: x=y=z is the same as x=(y=z)
603: x =+ y x = x+y
604: x =\- y x = x\-y
605: x =* y x = x*y
606: x =/ y x = x/y
607: x =% y x = x%y
608: x =^ y x = x^y
609: x++ (x=x+1)\-1
610: x\-\- (x=x\-1)+1
611: ++x x = x+1
612: \-\-x x = x\-1
613: .ft P
614: .DE
615: Even if you don't intend to use the constructs,
616: if you type one inadvertently, something correct but unexpected
617: may happen.
618: .PP
619: WARNING! In some of these constructions, spaces are
620: significant.
621: There is a real difference between
622: .ft B
623: x =\- y and x= \-y.
624: .ft P
625: The first replaces x by x\-y and the second by \-y.
626: .SH
627: Three Important Things
628: .PP
629: 1. To exit a BC program, type `quit'.
630: .PP
631: 2. There is a comment convention identical to that of C and
632: of PL/I. Comments begin with `/*' and end with `*/'.
633: .PP
634: 3. There is a library of math functions which may be obtained by
635: typing at command level
636: .DS
637: .ft B
638: bc \-l
639: .ft P
640: .DE
641: This command will load a set of library functions
642: which, at the time of writing, consists of sine (named `s'),
643: cosine (`c'), arctangent (`a'), natural logarithm (`l'),
644: exponential (`e') and Bessel functions of integer order (`j(n,x)'). Doubtless more functions will be added
645: in time.
646: The library sets the scale to 20. You can reset it to something
647: else if you like.
648: The design of these mathematical library routines
649: is discussed elsewhere [3].
650: .PP
651: If you type
652: .DS
653: .ft B
654: bc file ...
655: .ft P
656: .DE
657: BC will read and execute the named file or files before accepting
658: commands from the keyboard. In this way, you may load your
659: favorite programs and function definitions.
660: .SH
661: Acknowledgement
662: .PP
663: The compiler is written in YACC [4]; its original
664: version was written by S. C. Johnson.
665: .SH
666: References
667: .IP [1]
668: K. Thompson and D. M. Ritchie,
669: .ft I
670: UNIX Programmer's Manual,
671: .ft
672: Bell Laboratories,
673: 1978.
674: .IP [2]
675: B. W. Kernighan and
676: D. M. Ritchie,
677: .ft I
678: The C Programming Language,
679: .ft
680: Prentice-Hall, 1978.
681: .IP [3]
682: R. Morris,
683: .ft I
684: A Library of Reference Standard Mathematical Subroutines,
685: .ft
686: Bell Laboratories internal memorandum, 1975.
687: .IP [4]
688: S. C. Johnson,
689: .ft I
690: YACC \(em Yet Another Compiler-Compiler.
691: .ft
692: Bell Laboratories Computing Science Technical Report #32, 1978.
693: .IP [5]
694: R. Morris and L. L. Cherry,
695: .ft I
696: DC \- An Interactive Desk Calculator.
697: .ft
698: .LP
699: .bp
700: .ft B
701: .DS C
702: Appendix
703: .DE
704: .ft
705: .NH
706: Notation
707: .PP
708: In the following pages syntactic categories are in \fIitalics\fP;
709: literals are in \fBbold\fP; material in brackets [\|] is optional.
710: .NH
711: Tokens
712: .PP
713: Tokens consist of keywords, identifiers, constants, operators,
714: and separators.
715: Token separators may be blanks, tabs or comments.
716: Newline characters or semicolons separate statements.
717: .NH 2
718: Comments
719: .PP
720: Comments are introduced by the characters /* and terminated by
721: */.
722: .NH 2
723: Identifiers
724: .PP
725: There are three kinds of identifiers \- ordinary identifiers, array identifiers
726: and function identifiers.
727: All three types consist of single lower-case letters.
728: Array identifiers are followed by square brackets, possibly
729: enclosing an expression describing a subscript.
730: Arrays are singly dimensioned and may contain up to 2048
731: elements.
732: Indexing begins at zero so an array may be indexed from 0 to 2047.
733: Subscripts are truncated to integers.
734: Function identifiers are followed by parentheses, possibly enclosing arguments.
735: The three types of identifiers do not conflict;
736: a program can have a variable named \fBx\fP,
737: an array named \fBx\fP and a function named \fBx\fP, all of which are separate and
738: distinct.
739: .NH 2
740: Keywords
741: .PP
742: The following are reserved keywords:
743: .ft B
744: .ta .5i 1.0i
745: .nf
746: ibase if
747: obase break
748: scale define
749: sqrt auto
750: length return
751: while quit
752: for
753: .fi
754: .ft
755: .NH 2
756: Constants
757: .PP
758: Constants consist of arbitrarily long numbers
759: with an optional decimal point.
760: The hexadecimal digits \fBA\fP\-\fBF\fP are also recognized as digits with
761: values 10\-15, respectively.
762: .NH 1
763: Expressions
764: .PP
765: The value of an expression is printed unless the main
766: operator is an assignment.
767: Precedence is the same as the order
768: of presentation here, with highest appearing first.
769: Left or right associativity, where applicable, is
770: discussed with each operator.
771: .bp
772: .NH 2
773: Primitive expressions
774: .NH 3
775: Named expressions
776: .PP
777: Named expressions are
778: places where values are stored.
779: Simply stated,
780: named expressions are legal on the left
781: side of an assignment.
782: The value of a named expression is the value stored in the place named.
783: .NH 4
784: \fIidentifiers\fR
785: .PP
786: Simple identifiers are named expressions.
787: They have an initial value of zero.
788: .NH 4
789: \fIarray-name\fP\|[\|\fIexpression\fP\|]
790: .PP
791: Array elements are named expressions.
792: They have an initial value of zero.
793: .NH 4
794: \fBscale\fR, \fBibase\fR and \fBobase\fR
795: .PP
796: The internal registers
797: \fBscale\fP, \fBibase\fP and \fBobase\fP are all named expressions.
798: \fBscale\fP is the number of digits after the decimal point to be
799: retained in arithmetic operations.
800: \fBscale\fR has an initial value of zero.
801: \fBibase\fP and \fBobase\fP are the input and output number
802: radix respectively.
803: Both \fBibase\fR and \fBobase\fR have initial values of 10.
804: .NH 3
805: Function calls
806: .NH 4
807: \fIfunction-name\fB\|(\fR[\fIexpression\fR\|[\fB,\|\fIexpression\|\fR.\|.\|.\|]\|]\fB)
808: .PP
809: A function call consists of a function name followed by parentheses
810: containing a comma-separated list of
811: expressions, which are the function arguments.
812: A whole array passed as an argument is specified by the
813: array name followed by empty square brackets.
814: All function arguments are passed by
815: value.
816: As a result, changes made to the formal parameters have
817: no effect on the actual arguments.
818: If the function terminates by executing a return
819: statement, the value of the function is
820: the value of the expression in the parentheses of the return
821: statement or is zero if no expression is provided
822: or if there is no return statement.
823: .NH 4
824: sqrt\|(\|\fIexpression\fP\|)
825: .PP
826: The result is the square root of the expression.
827: The result is truncated in the least significant decimal place.
828: The scale of the result is
829: the scale of the expression or the
830: value of
831: .ft B
832: scale,
833: .ft
834: whichever is larger.
835: .NH 4
836: length\|(\|\fIexpression\fP\|)
837: .PP
838: The result is the total number of significant decimal digits in the expression.
839: The scale of the result is zero.
840: .NH 4
841: scale\|(\|\fIexpression\fP\|)
842: .PP
843: The result is the scale of the expression.
844: The scale of the result is zero.
845: .NH 3
846: Constants
847: .PP
848: Constants are primitive expressions.
849: .NH 3
850: Parentheses
851: .PP
852: An expression surrounded by parentheses is
853: a primitive expression.
854: The parentheses are used to alter the
855: normal precedence.
856: .NH 2
857: Unary operators
858: .PP
859: The unary operators
860: bind right to left.
861: .NH 3
862: \-\|\fIexpression\fP
863: .PP
864: The result is the negative of the expression.
865: .NH 3
866: ++\|\fInamed-expression\fP
867: .PP
868: The named expression is
869: incremented by one.
870: The result is the value of the named expression after
871: incrementing.
872: .NH 3
873: \-\-\|\fInamed-expression\fP
874: .PP
875: The named expression is
876: decremented by one.
877: The result is the value of the named expression after
878: decrementing.
879: .NH 3
880: \fInamed-expression\fP\|++
881: .PP
882: The named expression is
883: incremented by one.
884: The result is the value of the named expression before
885: incrementing.
886: .NH 3
887: \fInamed-expression\fP\|\-\-
888: .PP
889: The named expression is
890: decremented by one.
891: The result is the value of the named expression before
892: decrementing.
893: .NH 2
894: Exponentiation operator
895: .PP
896: The exponentiation operator binds right to left.
897: .NH 3
898: \fIexpression\fP ^ \fIexpression\fP
899: .PP
900: The result is the first
901: expression raised to the power of the
902: second expression.
903: The second expression must be an integer.
904: If \fIa\fP
905: is the scale of the left expression
906: and \fIb\fP is the absolute value
907: of the right expression,
908: then the scale of the result is:
909: .PP
910: min\|(\|\fIa\(mub\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP\|)\|)
911: .NH 2
912: Multiplicative operators
913: .PP
914: The operators *, /, % bind left to right.
915: .NH 3
916: \fIexpression\fP * \fIexpression\fP
917: .PP
918: The result is the product
919: of the two expressions.
920: If \fIa\fP and \fIb\fP are the
921: scales of the two expressions,
922: then the scale of the result is:
923: .PP
924: min\|(\|\fIa+b\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP,\|\fIb\fP\|)\|)
925: .NH 3
926: \fIexpression\fP / \fIexpression\fP
927: .PP
928: The result is the quotient of the two expressions.
929: The scale of the result is the value of \fBscale\fR.
930: .NH 3
931: \fIexpression\fP % \fIexpression\fP
932: .PP
933: The % operator produces the remainder of the division
934: of the two expressions.
935: More precisely,
936: \fIa\fP%\fIb\fP is \fIa\fP\-\fIa\fP/\fIb\fP*\fIb\fP.
937: .PP
938: The scale of the result is the sum of the scale of
939: the divisor and the value of
940: .ft B
941: scale
942: .ft
943: .NH 2
944: Additive operators
945: .PP
946: The additive operators bind left to right.
947: .NH 3
948: \fIexpression\fP + \fIexpression\fP
949: .PP
950: The result is the sum of the two expressions.
951: The scale of the result is
952: the maximun of the scales of the expressions.
953: .NH 3
954: \fIexpression\fP \- \fIexpression\fP
955: .PP
956: The result is the difference of the two expressions.
957: The scale of the result is the
958: maximum of the scales of the expressions.
959: .NH 2
960: assignment operators
961: .PP
962: The assignment operators bind right to left.
963: .NH 3
964: \fInamed-expression\fP = \fIexpression\fP
965: .PP
966: This expression results in assigning the value of the expression
967: on the right
968: to the named expression on the left.
969: .NH 3
970: \fInamed-expression\fP =+ \fIexpression\fP
971: .NH 3
972: \fInamed-expression\fP =\- \fIexpression\fP
973: .NH 3
974: \fInamed-expression\fP =* \fIexpression\fP
975: .NH 3
976: \fInamed-expression\fP =/ \fIexpression\fP
977: .NH 3
978: \fInamed-expression\fP =% \fIexpression\fP
979: .NH 3
980: \fInamed-expression\fP =^ \fIexpression\fP
981: .PP
982: The result of the above expressions is equivalent
983: to ``named expression = named expression OP expression'',
984: where OP is the operator after the = sign.
985: .NH 1
986: Relations
987: .PP
988: Unlike all other operators, the relational operators
989: are only valid as the object of an \fBif\fP, \fBwhile\fP,
990: or inside a \fBfor\fP statement.
991: .NH 2
992: \fIexpression\fP < \fIexpression\fP
993: .NH 2
994: \fIexpression\fP > \fIexpression\fP
995: .NH 2
996: \fIexpression\fP <= \fIexpression\fP
997: .NH 2
998: \fIexpression\fP >= \fIexpression\fP
999: .NH 2
1000: \fIexpression\fP == \fIexpression\fP
1001: .NH 2
1002: \fIexpression\fP != \fIexpression\fP
1003: .NH 1
1004: Storage classes
1005: .PP
1006: There are only two storage classes in BC, global and automatic
1007: (local).
1008: Only identifiers that are to be local to a function need be
1009: declared with the \fBauto\fP command.
1010: The arguments to a function
1011: are local to the function.
1012: All other identifiers are assumed to be global
1013: and available to all functions.
1014: All identifiers, global and local, have initial values
1015: of zero.
1016: Identifiers declared as \fBauto\fP are allocated on entry to the function
1017: and released on returning from the function.
1018: They therefore do not retain values between function calls.
1019: \fBauto\fP arrays are specified by the array name followed by empty square brackets.
1020: .PP
1021: Automatic variables in BC do not work in exactly the same way
1022: as in either C or PL/I. On entry to a function, the old values of
1023: the names that appear as parameters and as automatic
1024: variables are pushed onto a stack.
1025: Until return is made from the function, reference to these
1026: names refers only to the new values.
1027: .NH 1
1028: Statements
1029: .PP
1030: Statements must be separated by semicolon or newline.
1031: Except where altered by control statements, execution
1032: is sequential.
1033: .NH 2
1034: Expression statements
1035: .PP
1036: When a statement is an expression, unless
1037: the main operator is an assignment, the value
1038: of the expression is printed, followed by a newline character.
1039: .NH 2
1040: Compound statements
1041: .PP
1042: Statements may be grouped together and used when one statement is expected
1043: by surrounding them with { }.
1044: .NH 2
1045: Quoted string statements
1046: .PP
1047: "any string"
1048: .sp .5
1049: This statement prints the string inside the quotes.
1050: .NH 2
1051: If statements
1052: .sp .5
1053: \fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fR
1054: .PP
1055: The substatement is executed if the relation is true.
1056: .NH 2
1057: While statements
1058: .sp .5
1059: \fBwhile\|(\|\fIrelation\fB\|)\|\fIstatement\fR
1060: .PP
1061: The statement is executed while the relation
1062: is true.
1063: The test occurs before each execution of the statement.
1064: .NH 2
1065: For statements
1066: .sp .5
1067: \fBfor\|(\|\fIexpression\fB; \fIrelation\fB; \fIexpression\fB\|)\|\fIstatement\fR
1068: .PP
1069: The for statement is the same as
1070: .nf
1071: .ft I
1072: first-expression
1073: \fBwhile\|(\fPrelation\|\fB) {\fP
1074: statement
1075: last-expression
1076: }
1077: .ft R
1078: .fi
1079: .PP
1080: All three expressions must be present.
1081: .NH 2
1082: Break statements
1083: .sp .5
1084: \fBbreak\fP
1085: .PP
1086: \fBbreak\fP causes termination of a \fBfor\fP or \fBwhile\fP statement.
1087: .NH 2
1088: Auto statements
1089: .sp .5
1090: \fBauto \fIidentifier\fR\|[\|\fB,\fIidentifier\fR\|]
1091: .PP
1092: The auto statement causes the values of the identifiers to be pushed down.
1093: The identifiers can be ordinary identifiers or array identifiers.
1094: Array identifiers are specified by following the array name by empty square
1095: brackets.
1096: The auto statement must be the first statement
1097: in a function definition.
1098: .NH 2
1099: Define statements
1100: .sp .5
1101: .nf
1102: \fBdefine(\|\fR[\fIparameter\|\fR[\fB\|,\|\fIparameter\|.\|.\|.\|\fR]\|]\|\fB)\|{\fI
1103: statements\|\fB}\fR
1104: .fi
1105: .PP
1106: The define statement defines a function.
1107: The parameters may
1108: be ordinary identifiers or array names.
1109: Array names must be followed by empty square brackets.
1110: .NH 2
1111: Return statements
1112: .sp .5
1113: \fBreturn\fP
1114: .sp .5
1115: \fBreturn(\fI\|expression\|\fB)\fR
1116: .PP
1117: The return statement causes termination of a function,
1118: popping of its auto variables, and
1119: specifies the result of the function.
1120: The first form is equivalent to \fBreturn(0)\fR.
1121: The result of the function is the result of the expression
1122: in parentheses.
1123: .NH 2
1124: Quit
1125: .PP
1126: The quit statement stops execution of a BC program and returns
1127: control to UNIX when it is first encountered.
1128: Because it is not treated as an executable statement,
1129: it cannot be used
1130: in a function definition or in an
1131: .ft B
1132: if, for,
1133: .ft
1134: or
1135: .ft B
1136: while
1137: .ft
1138: statement.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.