Annotation of 43BSDReno/share/doc/ps1/01.Clang/Clang.ms, revision 1.1

1.1     ! root        1: .\"    @(#)Clang.ms    6.2 (Berkeley) 5/27/86
        !             2: .\"
        !             3: .nr Cl 2
        !             4: .TL
        !             5: The C Programming Language - Reference Manual
        !             6: .AU
        !             7: Dennis M. Ritchie
        !             8: .AI
        !             9: .MH
        !            10: .PP
        !            11: This manual is a reprint, with updates to the current C standard, from 
        !            12: \fIThe C Programming Language\fR,
        !            13: by Brian W. Kernighan and Dennis M. Richie, Prentice-Hall, Inc., 1978.
        !            14: .EH 'PS1:1-%''The C Programming Language - Reference Manual'
        !            15: .OH 'The C Programming Language - Reference Manual''PS1:1-%'
        !            16: .NH 1
        !            17: Introduction
        !            18: .PP
        !            19: This manual describes the C language on the DEC PDP-11\(dg, the DEC VAX-11,
        !            20: .FS
        !            21: .LP
        !            22: \(dg DEC PDP-11, and DEC VAX-11 are trademarks of Digital Equipment Corporation.
        !            23: .LP
        !            24: \(dd 3B 20 is a trademark of AT&T.
        !            25: .FE
        !            26: and the AT&T 3B 20\(dd.
        !            27: Where differences exist, it concentrates on the VAX, but tries to point
        !            28: out implementation-dependent details.  With few execptions, these dependencies
        !            29: follow directly from the underlying properties of the hardware; the various
        !            30: compilers are generally quite compatible.
        !            31: .NH 1 
        !            32: Lexical Conventions
        !            33: .PP
        !            34: There are six classes of tokens\ -\ 
        !            35: identifiers, keywords, constants, strings, operators, and other separators.
        !            36: Blanks, tabs, new\(hylines,
        !            37: and comments (collectively, ``white space'') as described below
        !            38: are ignored except as they serve to separate
        !            39: tokens.
        !            40: Some white space is required to separate
        !            41: otherwise adjacent identifiers,
        !            42: keywords, and constants.
        !            43: .PP
        !            44: If the input stream has been parsed into tokens
        !            45: up to a given character, the next token is taken
        !            46: to include the longest string of characters
        !            47: which could possibly constitute a token.
        !            48: .NH 2 
        !            49: Comments
        !            50: .PP
        !            51: The characters
        !            52: .B
        !            53: /*
        !            54: .R
        !            55: introduce a comment which terminates
        !            56: with the characters
        !            57: \fB\(**/\fR.
        !            58: Comments do not nest.
        !            59: .NH 2 
        !            60: Identifiers (Names)
        !            61: .PP
        !            62: An identifier is a sequence of letters and digits.
        !            63: The first character must be a letter.
        !            64: The underscore
        !            65: (\fB_\fR)
        !            66: counts as a letter.
        !            67: Uppercase and lowercase letters
        !            68: are different.
        !            69: Although there is no limit on the length of a name,
        !            70: only initial characters are significant: at least
        !            71: eight characters of a non-external name, and perhaps
        !            72: fewer for external names.
        !            73: Moreover, some implementations may collapse case
        !            74: distinctions for external names.
        !            75: The external name sizes include:
        !            76: .DS 
        !            77: .TS
        !            78: l l.
        !            79: PDP-11 7 characters, 2 cases
        !            80: VAX-11 >100 characters, 2 cases
        !            81: AT&T 3B 20     >100 characters, 2 cases
        !            82: .TE
        !            83: .fi
        !            84: .DE
        !            85: .NH 2
        !            86: Keywords
        !            87: .PP
        !            88: The following identifiers are reserved for use
        !            89: as keywords and may not be used otherwise:
        !            90: .DS 
        !            91: .ta 0.8i 1.6i 2.4i 3.2i 4.0i
        !            92: \fBauto        do      for     return  typedef
        !            93: break  double  goto    short   union
        !            94: case   else    if      sizeof  unsigned
        !            95: char   enum    int     static  void
        !            96: continue       external        long    struct  while
        !            97: default        float   register        switch\fR
        !            98: .ta 0.5i
        !            99: .DE
        !           100: .PP 
        !           101: Some implementations also reserve the words
        !           102: .B
        !           103: fortran, asm, gfloat, hfloat
        !           104: .R
        !           105: and
        !           106: .B quad
        !           107: .R
        !           108: .NH 2
        !           109: Constants
        !           110: .PP
        !           111: There are several kinds
        !           112: of constants.
        !           113: Each has a type; an introduction to types is given in ``NAMES.''
        !           114: Hardware characteristics that affect sizes are summarized in
        !           115: ``Hardware Characteristics'' under ``LEXICAL CONVENTIONS.''
        !           116: .NH 3 
        !           117: Integer Constants
        !           118: .br
        !           119: .PP
        !           120: An integer constant consisting of a sequence of digits
        !           121: is taken
        !           122: to be octal if it begins with
        !           123: .B
        !           124: 0
        !           125: .R
        !           126: (digit zero).
        !           127: An octal constant consists of the digits \fB0\fR through \fB7\fR only.
        !           128: A sequence of digits preceded by
        !           129: .B
        !           130: 0x
        !           131: .R
        !           132: or
        !           133: .B
        !           134: 0X
        !           135: .R
        !           136: (digit zero) is taken to be a hexadecimal integer.
        !           137: The hexadecimal digits include
        !           138: .B
        !           139: a
        !           140: .R
        !           141: or
        !           142: .B
        !           143: A
        !           144: .R
        !           145: through
        !           146: .B
        !           147: f
        !           148: .R
        !           149: or
        !           150: .B
        !           151: F
        !           152: .R
        !           153: with values 10 through 15.
        !           154: Otherwise, the integer constant is taken to be decimal.
        !           155: A decimal constant whose value exceeds the largest
        !           156: signed machine integer is taken to be
        !           157: \fBlong\fR;
        !           158: an octal or hex constant which exceeds the largest unsigned machine integer
        !           159: is likewise taken to be
        !           160: .B
        !           161: long\fR.
        !           162: .R
        !           163: Otherwise, integer constants are \fBint\fR.
        !           164: .NH 3 
        !           165: Explicit Long Constants
        !           166: .br
        !           167: .PP
        !           168: A decimal, octal, or hexadecimal integer constant immediately followed
        !           169: by
        !           170: .B
        !           171: l
        !           172: .R
        !           173: (letter ell)
        !           174: or
        !           175: .B
        !           176: L
        !           177: .R
        !           178: is a long constant.
        !           179: As discussed below,
        !           180: on some machines
        !           181: integer and long values may be considered identical.
        !           182: .NH 3 
        !           183: Character Constants
        !           184: .br
        !           185: .PP
        !           186: A character constant is a character enclosed in single quotes,
        !           187: as in '\fBx\fR'.
        !           188: The value of a character constant is the numerical value of the
        !           189: character in the machine's character set.
        !           190: .PP
        !           191: Certain nongraphic characters,
        !           192: the single quote
        !           193: (\fB'\fR)
        !           194: and the backslash
        !           195: (\fB\e\fR),
        !           196: may be represented according to the following table
        !           197: of escape sequences:
        !           198: .DS 
        !           199: .TS
        !           200: l l l.
        !           201: new\(hyline    NL (LF) \en
        !           202: horizontal tab HT      \et
        !           203: vertical tab   VT      \ev
        !           204: backspace      BS      \eb
        !           205: carriage return        CR      \er
        !           206: form feed      FF      \ef
        !           207: backslash      \e      \e\e
        !           208: single quote   '       \e'
        !           209: bit pattern    \fIddd\fR\^     \e\fIddd\fR\^
        !           210: .TE
        !           211: .DE
        !           212: .PP 
        !           213: The escape
        !           214: \e\fIddd\fR
        !           215: consists of the backslash followed by 1, 2, or 3 octal digits
        !           216: which are taken to specify the value of the
        !           217: desired character.
        !           218: A special case of this construction is
        !           219: .B
        !           220: \e0
        !           221: .R
        !           222: (not followed
        !           223: by a digit), which indicates the character
        !           224: .B
        !           225: NUL\fR.
        !           226: .R
        !           227: If the character following a backslash is not one
        !           228: of those specified, the
        !           229: behavior is undefined.
        !           230: A new-line character is illegal in a character constant.
        !           231: The type of a character constant is \fBint\fR.
        !           232: .NH 3 
        !           233: Floating Constants
        !           234: .br
        !           235: .PP
        !           236: A floating constant consists of
        !           237: an integer part, a decimal point, a fraction part,
        !           238: an
        !           239: .B
        !           240: e
        !           241: .R
        !           242: or
        !           243: \fBE\fR,
        !           244: and an optionally signed integer exponent.
        !           245: The integer and fraction parts both consist of a sequence
        !           246: of digits.
        !           247: Either the integer part or the fraction
        !           248: part (not both) may be missing.
        !           249: Either the decimal point or
        !           250: the
        !           251: .B
        !           252: e
        !           253: .R
        !           254: and the exponent (not both) may be missing.
        !           255: Every floating constant has type \fBdouble\fR.
        !           256: .NH 3 
        !           257: Enumeration Constants
        !           258: .br
        !           259: .PP
        !           260: Names declared as enumerators
        !           261: (see ``Structure, Union, and Enumeration Declarations'' under
        !           262: ``DECLARATIONS'')
        !           263: have type \fBint\fR.
        !           264: .NH 2 
        !           265: Strings
        !           266: .PP
        !           267: A string is a sequence of characters surrounded by
        !           268: double quotes,
        !           269: as in
        !           270: \fB"..."\fR.
        !           271: A string has type
        !           272: ``array of \fBchar\fR'' and storage class
        !           273: \fBstatic\fR
        !           274: (see ``NAMES'')
        !           275: and is initialized with
        !           276: the given characters.
        !           277: The compiler places
        !           278: a null byte
        !           279: (\fB\e0\fR)
        !           280: at the end of each string so that programs
        !           281: which scan the string can
        !           282: find its end.
        !           283: In a string, the double quote character
        !           284: (\fB"\fR)
        !           285: must be preceded by
        !           286: a
        !           287: \fB\e\fR;
        !           288: in addition, the same escapes as described for character
        !           289: constants may be used.
        !           290: .PP
        !           291: A
        !           292: .B
        !           293: \e
        !           294: .R
        !           295: and
        !           296: the immediately following new\(hyline are ignored.
        !           297: All strings, even when written identically, are distinct.
        !           298: .NH 2 
        !           299: Hardware Characteristics
        !           300: .PP
        !           301: The following figure summarize
        !           302: certain hardware properties that vary from machine to machine.
        !           303: .DS
        !           304: .TS
        !           305: center box;
        !           306: c cfB s cfB s cfB s
        !           307: c c s c s c s
        !           308: l | l1 lp8 | l1 lp8 | l1 lp8.
        !           309:        DEC PDP\-11     DEC VAX-11      AT&T 3B
        !           310:        (ASCII) (ASCII) (ASCII)
        !           311: .sp
        !           312: _
        !           313: char   8 bits          8 bits          8bits
        !           314: int    16              32              32
        !           315: short  16              16              16
        !           316: long   32              32              32
        !           317: float  32              32              32
        !           318: double 64              64              64
        !           319: float range       \(+-10       \(+-38     \(+-10       \(+-38      \(+-10      \(+-38
        !           320: \^     \^              \^              \^
        !           321: double range      \(+-10       \(+-38     \(+-10       \(+-38      \(+-10      \(+-308
        !           322: \^     \^              \^              \^
        !           323: .TE
        !           324: .FG 4 4 1 "DEC PDP-11 HARDWARE CHARACTERISTICS"
        !           325: .DE
        !           326: .PP
        !           327: .NH 1 
        !           328: Syntax Notation
        !           329: .PP
        !           330: Syntactic categories are indicated by
        !           331: .I
        !           332: italic
        !           333: .R
        !           334: type
        !           335: and literal words and characters
        !           336: in
        !           337: \fBbold\fR
        !           338: type.
        !           339: Alternative categories are listed on separate lines.
        !           340: An optional terminal or nonterminal symbol is
        !           341: indicated by the subscript ``opt,'' so that
        !           342: .DS
        !           343: { \fIexpression\v'0.5'\s-2opt\s0\v'-0.5'\fR }
        !           344: .DE
        !           345: .LP
        !           346: indicates an optional expression enclosed in braces.
        !           347: The syntax is summarized in ``SYNTAX SUMMARY''.
        !           348: .NH 1 
        !           349: Names
        !           350: .PP
        !           351: The C language bases the interpretation of an
        !           352: identifier upon two attributes of the identifier \(mi its
        !           353: .I
        !           354: storage class
        !           355: .R
        !           356: and its
        !           357: .I
        !           358: type\fR.
        !           359: The storage class determines the location and lifetime
        !           360: of the storage associated with an identifier;
        !           361: the type determines
        !           362: the meaning of the values
        !           363: found in the identifier's storage.
        !           364: .NH 2 
        !           365: Storage Class
        !           366: .PP
        !           367: There are four declarable storage classes:
        !           368: .BL 6 1
        !           369: .LI
        !           370: Automatic
        !           371: .LI
        !           372: Static
        !           373: .LI
        !           374: External
        !           375: .LI
        !           376: Register.
        !           377: .LE
        !           378: .PP
        !           379: Automatic variables are local to each invocation of
        !           380: a block (see ``Compound Statement or Block'' in 
        !           381: ``STATEMENTS'') and are discarded upon exit from the block.
        !           382: Static variables are local to a block but retain
        !           383: their values upon reentry to a block even after control
        !           384: has left the block.
        !           385: External variables exist and retain their values throughout
        !           386: the execution of the entire program and
        !           387: may be used for communication between
        !           388: functions, even separately compiled functions.
        !           389: Register variables are (if possible) stored in the fast registers
        !           390: of the machine; like automatic
        !           391: variables, they are local to each block and disappear on exit from the block.
        !           392: .NH 2 
        !           393: Type
        !           394: .PP
        !           395: The C language supports several
        !           396: fundamental
        !           397: types of objects.
        !           398: Objects declared as characters
        !           399: (\fBchar\fR)
        !           400: are large enough to store any member of the implementation's
        !           401: character set.
        !           402: If a genuine character from that character set is
        !           403: stored in a \fBchar\fR variable,
        !           404: its value is equivalent to the integer code for that character.
        !           405: Other quantities may be stored into character variables, but
        !           406: the implementation is machine dependent.
        !           407: In particular, \fBchar\fR may be signed or unsigned by default.
        !           408: .PP
        !           409: Up to three sizes of integer, declared
        !           410: .B
        !           411: short
        !           412: .R
        !           413: \fBint\fR,
        !           414: \fBint\fR,
        !           415: and
        !           416: .B
        !           417: long
        !           418: .R
        !           419: \fBint\fR,
        !           420: are available.
        !           421: Longer integers provide no less storage than shorter ones,
        !           422: but the implementation may make either short integers or long integers,
        !           423: or both, equivalent to plain integers.
        !           424: ``Plain'' integers have the natural size suggested
        !           425: by the host machine architecture.
        !           426: The other sizes are provided to meet special needs.
        !           427: .PP
        !           428: The properties of \fBenum\fR types (see ``Structure, Union, and Enumeration Declarations''
        !           429: under ``DECLARATIONS'')
        !           430: are identical to those of
        !           431: some integer types.
        !           432: The implementation may use the range of values to
        !           433: determine how to allocate storage.
        !           434: .PP
        !           435: Unsigned
        !           436: integers, declared
        !           437: .B
        !           438: unsigned,
        !           439: .R
        !           440: obey the laws of arithmetic modulo
        !           441: 2\v'-0.5'\fIn\fR\v'0.5'
        !           442: where \fIn\fR is the number of bits in the representation.
        !           443: (On the
        !           444: PDP-11,
        !           445: unsigned long quantities are not supported.)
        !           446: .PP
        !           447: Single-precision floating point
        !           448: (\fBfloat\fR)
        !           449: and double precision floating point
        !           450: (\fBdouble\fR)
        !           451: may be synonymous in some implementations.
        !           452: .PP
        !           453: Because objects of the foregoing types can usefully be interpreted
        !           454: as numbers, they will be referred to as
        !           455: .I
        !           456: arithmetic
        !           457: .R
        !           458: types.
        !           459: \fBChar\fR,
        !           460: .B
        !           461: int
        !           462: .R
        !           463: of all sizes whether \fBunsigned\fR or not, and
        !           464: .B
        !           465: enum
        !           466: .R
        !           467: will collectively be called
        !           468: .I
        !           469: integral
        !           470: .R
        !           471: types.
        !           472: The
        !           473: .B
        !           474: float
        !           475: .R
        !           476: and
        !           477: .B
        !           478: double
        !           479: .R
        !           480: types will collectively be called
        !           481: .I
        !           482: floating
        !           483: .R
        !           484: types.
        !           485: .PP
        !           486: The
        !           487: .B
        !           488: void
        !           489: .R
        !           490: type
        !           491: specifies an empty set of values.
        !           492: It is used as the type returned by functions that
        !           493: generate no value.
        !           494: .PP
        !           495: Besides the fundamental arithmetic types, there is a
        !           496: conceptually infinite class of derived types constructed
        !           497: from the fundamental types in the following ways:
        !           498: .BL 6 1
        !           499: .LI
        !           500: \fIArrays\fR
        !           501: of objects of most types
        !           502: .LI
        !           503: \fIFunctions\fR
        !           504: which return objects of a given type
        !           505: .LI
        !           506: \fIPointers\fR
        !           507: to objects of a given type
        !           508: .LI
        !           509: \fIStructures\fR
        !           510: containing a sequence of objects of various types
        !           511: .LI
        !           512: \fIUnions\fR
        !           513: capable of containing any one of several objects of various types.
        !           514: .LE
        !           515: .PP
        !           516: In general these methods
        !           517: of constructing objects can
        !           518: be applied recursively.
        !           519: .NH 1 
        !           520: Objects and Lvalues
        !           521: .PP
        !           522: An
        !           523: .I
        !           524: object
        !           525: .R
        !           526: is a manipulatable region of storage.
        !           527: An
        !           528: .I
        !           529: lvalue
        !           530: .R
        !           531: is an expression referring to an object.
        !           532: An obvious example of an lvalue
        !           533: expression is an identifier.
        !           534: There are operators which yield lvalues:
        !           535: for example,
        !           536: if
        !           537: .B
        !           538: E
        !           539: .R
        !           540: is an expression of pointer type, then
        !           541: .B
        !           542: \(**E
        !           543: .R
        !           544: is an lvalue
        !           545: expression referring to the object to which
        !           546: .B
        !           547: E
        !           548: .R
        !           549: points.
        !           550: The name ``lvalue'' comes from the assignment expression
        !           551: .B
        !           552: E1\ =\ E2
        !           553: .R
        !           554: in which the left operand
        !           555: .B
        !           556: E1
        !           557: .R
        !           558: must be
        !           559: an lvalue expression.
        !           560: The discussion of each operator
        !           561: below indicates whether it expects lvalue operands and whether it
        !           562: yields an lvalue.
        !           563: .NH 1 
        !           564: Conversions
        !           565: .PP
        !           566: A number of operators may, depending on their operands,
        !           567: cause conversion of the value of an operand from one type to another.
        !           568: This part explains the result to be expected from such
        !           569: conversions.
        !           570: The conversions demanded by most ordinary operators are summarized under
        !           571: ``Arithmetic Conversions.''
        !           572: The summary will be supplemented
        !           573: as required by the discussion
        !           574: of each operator.
        !           575: .NH 2 
        !           576: Characters and Integers
        !           577: .PP
        !           578: A character or a short integer may be used wherever an
        !           579: integer may be used.
        !           580: In all cases
        !           581: the value is converted to an integer.
        !           582: Conversion of a shorter integer
        !           583: to a longer preserves sign.
        !           584: Whether or not sign-extension occurs for characters is machine
        !           585: dependent, but it is guaranteed that a member of the
        !           586: standard character set is non-negative.
        !           587: Of the machines treated here,
        !           588: only the
        !           589: PDP-11
        !           590: and
        !           591: VAX-11
        !           592: sign-extend.
        !           593: On these machines,
        !           594: .B
        !           595: char
        !           596: .R
        !           597: variables range in value from
        !           598: \(mi128 to 127.
        !           599: The more explicit type
        !           600: .B
        !           601: unsigned
        !           602: .R
        !           603: .B
        !           604: char
        !           605: .R
        !           606: forces the values to range from 0 to 255.
        !           607: .PP
        !           608: On machines that treat characters as signed,
        !           609: the characters of the
        !           610: ASCII
        !           611: set are all non-negative.
        !           612: However, a character constant specified
        !           613: with an octal escape suffers sign extension
        !           614: and may appear negative;
        !           615: for example,
        !           616: \fB\'\e377\'\fR
        !           617: \fRhas the value
        !           618: .B
        !           619: \(mi1\fR.
        !           620: .PP
        !           621: When a longer integer is converted to a shorter
        !           622: integer
        !           623: or to a
        !           624: .B
        !           625: char,
        !           626: .R
        !           627: it is truncated on the left.
        !           628: Excess bits are simply discarded.
        !           629: .NH 2 
        !           630: Float and Double
        !           631: .PP
        !           632: All floating arithmetic in C is carried out in double precision.
        !           633: Whenever a
        !           634: .B
        !           635: float
        !           636: .R
        !           637: appears in an expression it is lengthened to
        !           638: .B
        !           639: double
        !           640: .R
        !           641: by zero padding its fraction.
        !           642: When a
        !           643: .B
        !           644: double
        !           645: .R
        !           646: must be
        !           647: converted to
        !           648: \fBfloat\fR,
        !           649: for example by an assignment,
        !           650: the
        !           651: .B
        !           652: double
        !           653: .R
        !           654: is rounded before
        !           655: truncation to
        !           656: .B
        !           657: float
        !           658: .R
        !           659: length.
        !           660: This result is undefined if it cannot be represented as a float.
        !           661: On the VAX, the compiler can be directed to use single percision for expressions
        !           662: containing only float and interger operands.
        !           663: .NH 2 
        !           664: Floating and Integral
        !           665: .PP
        !           666: Conversions of floating values to integral type
        !           667: are rather machine dependent.
        !           668: In particular, the direction of truncation of negative numbers
        !           669: varies.
        !           670: The result is undefined if
        !           671: it will not fit in the space provided.
        !           672: .PP
        !           673: Conversions of integral values to floating type
        !           674: are well behaved.
        !           675: Some loss of accuracy occurs
        !           676: if the destination lacks sufficient bits.
        !           677: .NH 2 
        !           678: Pointers and Integers
        !           679: .PP
        !           680: An expression of integral type may be added to or subtracted from
        !           681: a pointer; in such a case,
        !           682: the first is converted as
        !           683: specified in the discussion of the addition operator.
        !           684: Two pointers to objects of the same type may be subtracted;
        !           685: in this case, the result is converted to an integer
        !           686: as specified in the discussion of the subtraction
        !           687: operator.
        !           688: .NH 2 
        !           689: Unsigned
        !           690: .PP
        !           691: Whenever an unsigned integer and a plain integer
        !           692: are combined, the plain integer is converted to unsigned
        !           693: and the result is unsigned.
        !           694: The value
        !           695: is the least unsigned integer congruent to the signed
        !           696: integer (modulo 2\v'-0.3'\s-2wordsize\s+2\v'0.3').
        !           697: In a 2's complement representation,
        !           698: this conversion is conceptual; and there is no actual change in the
        !           699: bit pattern.
        !           700: .PP
        !           701: When an unsigned \fBshort\fR integer is converted to
        !           702: \fBlong\fR,
        !           703: the value of the result is the same numerically as that of the
        !           704: unsigned integer.
        !           705: Thus the conversion amounts to padding with zeros on the left.
        !           706: .NH 2 
        !           707: Arithmetic Conversions
        !           708: .PP
        !           709: A great many operators cause conversions
        !           710: and yield result types in a similar way.
        !           711: This pattern will be called the ``usual arithmetic conversions.''
        !           712: .AL 1 6 
        !           713: .LI
        !           714: First, any operands of type
        !           715: .B
        !           716: char
        !           717: .R
        !           718: or
        !           719: .B
        !           720: short
        !           721: .R
        !           722: are converted to
        !           723: \fBint\fR,
        !           724: and any operands of type \fBunsigned char\fR
        !           725: or \fBunsigned short\fR are converted
        !           726: to \fBunsigned int\fR.
        !           727: .LI
        !           728: Then, if either operand is
        !           729: .B
        !           730: double,
        !           731: .R
        !           732: the other is converted to
        !           733: .B
        !           734: double
        !           735: .R
        !           736: and that is the type of the result.
        !           737: .LI
        !           738: Otherwise, if either operand is \fBunsigned long\fR,
        !           739: the other is converted to \fBunsigned long\fR and that
        !           740: is the type of the result.
        !           741: .LI
        !           742: Otherwise, if either operand is
        !           743: \fBlong\fR,
        !           744: the other is converted to
        !           745: .B
        !           746: long
        !           747: .R
        !           748: and that is the type of the result.
        !           749: .LI
        !           750: Otherwise, if one operand is \fBlong\fR, and
        !           751: the other is \fBunsigned int\fR, they are both
        !           752: converted to \fBunsigned long\fR and that is
        !           753: the type of the result.
        !           754: .LI
        !           755: Otherwise, if either operand is
        !           756: .B
        !           757: unsigned,
        !           758: .R
        !           759: the other is converted to
        !           760: .B
        !           761: unsigned
        !           762: .R
        !           763: and that is the type of the result.
        !           764: .LI
        !           765: Otherwise, both operands must be
        !           766: \fBint\fR,
        !           767: and that is the type of the result.
        !           768: .LE
        !           769: .NH 2 
        !           770: Void
        !           771: .PP
        !           772: The (nonexistent) value of a
        !           773: .B
        !           774: void
        !           775: .R
        !           776: object may not be used in any way,
        !           777: and neither explicit nor implicit conversion may be applied.
        !           778: Because a void expression denotes a nonexistent value,
        !           779: such an expression may be used only
        !           780: as an expression statement
        !           781: (see ``Expression Statement'' under ``STATEMENTS'')
        !           782: or as the left operand
        !           783: of a comma expression (see ``Comma Operator'' under ``EXPRESSIONS'').
        !           784: .PP
        !           785: An expression may be converted to
        !           786: type
        !           787: .B
        !           788: void
        !           789: .R
        !           790: by use of a cast.
        !           791: For example, this makes explicit the discarding of the value
        !           792: of a function call used as an expression statement.
        !           793: .NH 1 
        !           794: Expressions
        !           795: .PP
        !           796: The precedence of expression operators is the same
        !           797: as the order of the major
        !           798: subsections of this section, highest precedence first.
        !           799: Thus, for example, the expressions referred to as the operands of
        !           800: .B
        !           801: \(pl
        !           802: .R
        !           803: (see ``Additive Operators'')
        !           804: are those expressions defined under ``Primary Expressions'',
        !           805: ``Unary Operators'', and ``Multiplicative Operators''.
        !           806: Within each subpart, the operators have the same
        !           807: precedence.
        !           808: Left- or right-associativity is specified
        !           809: in each subsection for the operators
        !           810: discussed therein.
        !           811: The precedence and associativity of all the expression
        !           812: operators are summarized in the
        !           813: grammar of ``SYNTAX SUMMARY''.
        !           814: .PP
        !           815: Otherwise, the order of evaluation of expressions
        !           816: is undefined.  In particular, the compiler
        !           817: considers itself free to
        !           818: compute subexpressions in the order it believes
        !           819: most efficient
        !           820: even if the subexpressions
        !           821: involve side effects.
        !           822: The order in which subexpression evaluation takes place is unspecified.
        !           823: Expressions involving a commutative and associative
        !           824: operator
        !           825: (\fB\(**,\fR
        !           826: \fB\(pl\fR,
        !           827: \fB&\fR,
        !           828: \fB|\fR,
        !           829: \fB^\fR)
        !           830: may be rearranged arbitrarily even in the presence
        !           831: of parentheses;
        !           832: to force a particular order of evaluation,
        !           833: an explicit temporary must be used.
        !           834: .PP
        !           835: The handling of overflow and divide check
        !           836: in expression evaluation
        !           837: is undefined.
        !           838: Most existing implementations of C ignore integer overflows;
        !           839: treatment of
        !           840: division by 0 and all floating-point exceptions
        !           841: varies between machines and is usually
        !           842: adjustable by a library function.
        !           843: .NH 2 
        !           844: Primary Expressions
        !           845: .PP
        !           846: Primary expressions
        !           847: involving \fB\.\fR,
        !           848: \fB\(mi>\fR,
        !           849: subscripting, and function calls
        !           850: group left to right.
        !           851: .DS 
        !           852: \fIprimary-expression:
        !           853:         identifier
        !           854:         constant
        !           855:         string
        !           856:         ( expression )
        !           857:         primary-expression [ expression ]
        !           858:         primary-expression ( expression-list\v'0.5'\s-2opt\s0\v'-0.5' )
        !           859:         primary-expression . identifier
        !           860:         primary-expression \(mi> identifier\fR
        !           861: .DE
        !           862: .DS 
        !           863: \fIexpression-list:
        !           864:         expression
        !           865:         expression-list , expression\fR
        !           866: .DE
        !           867: .PP
        !           868: An identifier is a primary expression provided it has been
        !           869: suitably declared as discussed below.
        !           870: Its type is specified by its declaration.
        !           871: If the type of the identifier is ``array of .\|.\|.'',
        !           872: then the value of the identifier expression
        !           873: is a pointer
        !           874: to the first object in the array; and the
        !           875: type of the expression is
        !           876: ``pointer to .\|.\|.''.
        !           877: Moreover, an array identifier is not an lvalue
        !           878: expression.
        !           879: Likewise, an identifier which is declared
        !           880: ``function returning .\|.\|.'',
        !           881: when used except in the function-name position
        !           882: of a call, is converted to ``pointer to function returning .\|.\|.''.
        !           883: .PP
        !           884: A
        !           885: constant is a primary expression.
        !           886: Its type may be
        !           887: \fBint\fR,
        !           888: \fBlong\fR,
        !           889: or
        !           890: .B
        !           891: double
        !           892: .R
        !           893: depending on its form.
        !           894: Character constants have type
        !           895: .B
        !           896: int 
        !           897: .R
        !           898: and floating constants have type
        !           899: .B
        !           900: double\fR.
        !           901: .R
        !           902: .PP
        !           903: A string is a primary expression.
        !           904: Its type is originally ``array of
        !           905: \fBchar\fR'',
        !           906: but following
        !           907: the same rule given above for identifiers,
        !           908: this is modified to ``pointer to
        !           909: \fBchar\fR'' and
        !           910: the
        !           911: result is a pointer to the first character
        !           912: in the string.
        !           913: (There is an exception in certain initializers;
        !           914: see ``Initialization'' under ``DECLARATIONS.'')
        !           915: .PP
        !           916: A parenthesized expression is a primary expression
        !           917: whose type and value are identical
        !           918: to those of the unadorned expression.
        !           919: The presence of parentheses does
        !           920: not affect whether the expression is an
        !           921: lvalue.
        !           922: .PP
        !           923: A primary expression followed by an expression in square
        !           924: brackets is a primary expression.
        !           925: The intuitive meaning is that of a subscript.
        !           926: Usually, the primary expression has type ``pointer to .\|.\|.'',
        !           927: the subscript expression is
        !           928: \fBint\fR,
        !           929: and the type of the result is ``\|.\|.\|.\|''.
        !           930: The expression
        !           931: .B
        !           932: E1[E2]
        !           933: .R
        !           934: is
        !           935: identical (by definition) to
        !           936: .B
        !           937: \(**((E1)\(plE2))\fR.
        !           938: All the clues
        !           939: needed to understand
        !           940: this notation are contained in this subpart together
        !           941: with the discussions
        !           942: in ``Unary Operators'' and ``Additive Operators'' on identifiers,
        !           943: .B
        !           944: \(** 
        !           945: .R
        !           946: and
        !           947: .B
        !           948: \(pl
        !           949: .R
        !           950: respectively.
        !           951: The implications are summarized under ``Arrays, Pointers, and Subscripting''
        !           952: under ``TYPES REVISITED.''
        !           953: .PP
        !           954: A function call is a primary expression followed by parentheses
        !           955: containing a possibly
        !           956: empty, comma-separated list of expressions
        !           957: which constitute the actual arguments to the
        !           958: function.
        !           959: The primary expression must be of type ``function returning .\|.\|.,''
        !           960: and the result of the function call is of type ``\|.\|.\|.\|''.
        !           961: As indicated
        !           962: below, a hitherto unseen identifier followed
        !           963: immediately by a left parenthesis
        !           964: is contextually declared
        !           965: to represent a function returning
        !           966: an integer;
        !           967: thus in the most common case, integer-valued functions
        !           968: need not be declared.
        !           969: .PP
        !           970: Any actual arguments of type
        !           971: .B
        !           972: float
        !           973: .R
        !           974: are
        !           975: converted to
        !           976: .B
        !           977: double
        !           978: .R
        !           979: before the call.
        !           980: Any of type
        !           981: .B
        !           982: char
        !           983: .R
        !           984: or
        !           985: .B
        !           986: short
        !           987: .R
        !           988: are converted to
        !           989: .B
        !           990: int\fR.
        !           991: .R
        !           992: Array names are converted to pointers.
        !           993: No other conversions are performed automatically;
        !           994: in particular, the compiler does not compare
        !           995: the types of actual arguments with those of formal
        !           996: arguments.
        !           997: If conversion is needed, use a cast;
        !           998: see ``Unary Operators'' and ``Type Names'' under
        !           999: ``DECLARATIONS.''
        !          1000: .PP
        !          1001: In preparing for the call to a function,
        !          1002: a copy is made of each actual parameter.
        !          1003: Thus, all argument passing in C is strictly by value.
        !          1004: A function may
        !          1005: change the values of its formal parameters, but
        !          1006: these changes cannot affect the values
        !          1007: of the actual parameters.
        !          1008: It is possible
        !          1009: to pass a pointer on the understanding
        !          1010: that the function may change the value
        !          1011: of the object to which the pointer points.
        !          1012: An array name is a pointer expression.
        !          1013: The order of evaluation of arguments is undefined by the language;
        !          1014: take note that the various compilers differ.
        !          1015: Recursive calls to any
        !          1016: function are permitted.
        !          1017: .PP
        !          1018: A primary expression followed by a dot followed by an identifier
        !          1019: is an expression.
        !          1020: The first expression must be a structure or a union, and the identifier
        !          1021: must name a member of the structure or union.
        !          1022: The value is the named member of the structure or union, and it is
        !          1023: an lvalue if the first expression is an lvalue.
        !          1024: .PP
        !          1025: A primary expression followed by an arrow (built from
        !          1026: .B
        !          1027: \(mi
        !          1028: .R
        !          1029: and
        !          1030: .B
        !          1031: >
        !          1032: .R
        !          1033: )
        !          1034: followed by an identifier
        !          1035: is an expression.
        !          1036: The first expression must be a pointer to a structure or a union
        !          1037: and the identifier must name a member of that structure or union.
        !          1038: The result is an lvalue referring to the named member
        !          1039: of the structure or union
        !          1040: to which the pointer expression points.
        !          1041: Thus the expression
        !          1042: .B
        !          1043: E1\(mi>MOS
        !          1044: .R
        !          1045: is the same as
        !          1046: .B
        !          1047: (\(**E1).MOS\fR.
        !          1048: .R
        !          1049: Structures and unions are discussed in
        !          1050: ``Structure, Union, and Enumeration Declarations'' under
        !          1051: ``DECLARATIONS.''
        !          1052: .NH 2 
        !          1053: Unary Operators
        !          1054: .PP
        !          1055: Expressions with unary operators
        !          1056: group right to left.
        !          1057: .tr ~~
        !          1058: .DS 
        !          1059: \fIunary-expression:
        !          1060:         \(** expression
        !          1061:         & lvalue
        !          1062:         \(mi expression
        !          1063:         ! expression
        !          1064:         \s+2~\s0 expression
        !          1065:         \(pl\(pl lvalue
        !          1066:         \(mi\(milvalue
        !          1067:         lvalue \(pl\(pl
        !          1068:         lvalue \(mi\(mi
        !          1069:         ( type-name ) expression\fR
        !          1070:         sizeof\fI expression\fR
        !          1071:         sizeof\fI ( type-name )\fR
        !          1072: .DE
        !          1073: .PP
        !          1074: The unary
        !          1075: .B
        !          1076: \(**
        !          1077: .R
        !          1078: operator
        !          1079: means
        !          1080: .I
        !          1081: indirection
        !          1082: .R
        !          1083: ;
        !          1084: the expression must be a pointer, and the result
        !          1085: is an lvalue referring to the object to
        !          1086: which the expression points.
        !          1087: If the type of the expression is ``pointer to .\|.\|.,''
        !          1088: the type of the result is ``\|.\|.\|.\|''.
        !          1089: .PP
        !          1090: The result of the unary
        !          1091: .B
        !          1092: &
        !          1093: .R
        !          1094: operator is a pointer
        !          1095: to the object referred to by the
        !          1096: lvalue.
        !          1097: If the type of the lvalue is ``\|.\|.\|.\|'',
        !          1098: the type of the result is ``pointer to .\|.\|.''.
        !          1099: .PP
        !          1100: The result
        !          1101: of the unary
        !          1102: .B
        !          1103: \(mi
        !          1104: .R
        !          1105: operator
        !          1106: is the negative of its operand.
        !          1107: The usual arithmetic conversions are performed.
        !          1108: The negative of an unsigned quantity is computed by
        !          1109: subtracting its value from
        !          1110: 2\v'-0.5'\fIn\fR\^\v'0.5' where \fIn\fR\^ is the number of bits in
        !          1111: the corresponding signed type.
        !          1112: .sp
        !          1113: .tr ~~
        !          1114: There is no unary
        !          1115: .B
        !          1116: \(pl
        !          1117: .R
        !          1118: operator.
        !          1119: .PP
        !          1120: The result of the logical negation operator
        !          1121: .B
        !          1122: !
        !          1123: .R
        !          1124: is one if the value of its operand is zero, zero if the value of its
        !          1125: operand is nonzero.
        !          1126: The type of the result is
        !          1127: .B
        !          1128: int\fR.
        !          1129: .R
        !          1130: It is applicable to any arithmetic type
        !          1131: or to pointers.
        !          1132: .PP
        !          1133: The
        !          1134: .B
        !          1135: \s+2~\s0
        !          1136: .R
        !          1137: operator yields the one's complement of its operand.
        !          1138: The usual arithmetic conversions are performed.
        !          1139: The type of the operand must be integral.
        !          1140: .PP
        !          1141: The object referred to by the lvalue operand of prefix
        !          1142: .B
        !          1143: \(pl\(pl
        !          1144: .R
        !          1145: is incremented.
        !          1146: The value is the new value of the operand
        !          1147: but is not an lvalue.
        !          1148: The expression
        !          1149: .B
        !          1150: \(pl\(plx
        !          1151: .R
        !          1152: is equivalent to
        !          1153: \fBx=x\(pl1\fR.
        !          1154: See the discussions ``Additive Operators'' and ``Assignment
        !          1155: Operators'' for information on conversions.
        !          1156: .PP
        !          1157: The lvalue operand of prefix
        !          1158: .B
        !          1159: \(mi\(mi
        !          1160: .R
        !          1161: is decremented
        !          1162: analogously to the
        !          1163: prefix
        !          1164: .B
        !          1165: \(pl\(pl
        !          1166: .R
        !          1167: operator.
        !          1168: .PP
        !          1169: When postfix
        !          1170: .B
        !          1171: \(pl\(pl
        !          1172: .R
        !          1173: is applied to an lvalue,
        !          1174: the result is the value of the object referred to by the lvalue.
        !          1175: After the result is noted, the object
        !          1176: is incremented in the same
        !          1177: manner as for the prefix
        !          1178: .B
        !          1179: \(pl\(pl
        !          1180: .R
        !          1181: operator.
        !          1182: The type of the result is the same as the type of the lvalue expression.
        !          1183: .PP
        !          1184: When postfix
        !          1185: .B
        !          1186: \(mi\(mi
        !          1187: .R
        !          1188: is applied to an lvalue,
        !          1189: the result is the value of the object referred to by the lvalue.
        !          1190: After the result is noted, the object
        !          1191: is decremented in the manner as for the prefix
        !          1192: .B
        !          1193: \(mi\(mi
        !          1194: .R
        !          1195: operator.
        !          1196: The type of the result is the same as the type of the lvalue
        !          1197: expression.
        !          1198: .PP
        !          1199: An expression preceded by the parenthesized name of a data type
        !          1200: causes conversion of the value of the expression to the named type.
        !          1201: This construction is called a
        !          1202: .I
        !          1203: cast\fR.
        !          1204: .R
        !          1205: Type names are described in ``Type Names'' under ``Declarations.''
        !          1206: .PP
        !          1207: The
        !          1208: .B
        !          1209: sizeof
        !          1210: .R
        !          1211: operator yields the size
        !          1212: in bytes of its operand.
        !          1213: (A
        !          1214: .I
        !          1215: byte
        !          1216: .R
        !          1217: is undefined by the language
        !          1218: except in terms of the value of
        !          1219: .B
        !          1220: sizeof\fR.
        !          1221: .R
        !          1222: However, in all existing implementations,
        !          1223: a byte is the space required to hold a
        !          1224: \fBchar.\fR)
        !          1225: When applied to an array, the result is the total
        !          1226: number of bytes in the array.
        !          1227: The size is determined from
        !          1228: the declarations of
        !          1229: the objects in the expression.
        !          1230: This expression is semantically an
        !          1231: .B
        !          1232: unsigned
        !          1233: .R
        !          1234: constant and may
        !          1235: be used anywhere a constant is required.
        !          1236: Its major use is in communication with routines
        !          1237: like storage allocators and I/O systems.
        !          1238: .PP
        !          1239: The
        !          1240: .B
        !          1241: sizeof
        !          1242: .R
        !          1243: operator
        !          1244: may also be applied to a parenthesized type name.
        !          1245: In that case it yields the size in bytes of an object
        !          1246: of the indicated type.
        !          1247: .PP
        !          1248: The construction
        !          1249: \fBsizeof(\fItype\|\fR\^)\fR\^
        !          1250: is taken to be a unit,
        !          1251: so the expression
        !          1252: \fBsizeof(\fItype\|\fB)-2\fR
        !          1253: is the same as
        !          1254: \fB(sizeof(\fItype\|\fB))-2\fR.
        !          1255: .NH 2 
        !          1256: Multiplicative Operators
        !          1257: .PP
        !          1258: The multiplicative operators
        !          1259: \fB\(**\fR,
        !          1260: \fB/\fR,
        !          1261: and
        !          1262: .B
        !          1263: %
        !          1264: .R
        !          1265: group left to right.
        !          1266: The usual arithmetic conversions are performed.
        !          1267: .DS 
        !          1268: \fImultiplicative expression:
        !          1269:         expression \(** expression
        !          1270:         expression / expression
        !          1271:         expression % expression\fR
        !          1272: .DE
        !          1273: .PP
        !          1274: The binary
        !          1275: .B
        !          1276: \(**
        !          1277: .R
        !          1278: operator indicates multiplication.
        !          1279: The
        !          1280: .B
        !          1281: \(**
        !          1282: .R
        !          1283: operator is associative,
        !          1284: and expressions with several multiplications at the same
        !          1285: level may be rearranged by the compiler.
        !          1286: The binary
        !          1287: .B
        !          1288: /
        !          1289: .R
        !          1290: operator indicates division.
        !          1291: .PP
        !          1292: The binary
        !          1293: .B
        !          1294: %
        !          1295: .R
        !          1296: operator yields the remainder
        !          1297: from the division of the first expression by the second.
        !          1298: The operands must be integral.
        !          1299: .PP
        !          1300: When positive integers are divided, truncation is toward 0;
        !          1301: but the form of truncation is machine-dependent
        !          1302: if either operand is negative.
        !          1303: On all machines covered by this manual,
        !          1304: the remainder has the same sign as the dividend.
        !          1305: It is always true that
        !          1306: .B
        !          1307: (a/b)\(**b\ \(pl a%b
        !          1308: .R
        !          1309: is equal to
        !          1310: .B
        !          1311: a
        !          1312: .R
        !          1313: (if
        !          1314: .B
        !          1315: b
        !          1316: .R
        !          1317: is not 0).
        !          1318: .NH 2 
        !          1319: Additive Operators
        !          1320: .PP
        !          1321: The additive operators
        !          1322: .B
        !          1323: \(pl
        !          1324: .R
        !          1325: and
        !          1326: .B
        !          1327: \(mi
        !          1328: .R
        !          1329: group left to right.
        !          1330: The usual arithmetic conversions are performed.
        !          1331: There are some additional type possibilities for each operator.
        !          1332: .DS 
        !          1333: \fIadditive-expression:
        !          1334:         expression \(pl expression
        !          1335:         expression \(mi expression\fR
        !          1336: .DE
        !          1337: .PP
        !          1338: The result of the
        !          1339: .B
        !          1340: \(pl
        !          1341: .R
        !          1342: operator is the sum of the operands.
        !          1343: A pointer to an object in an array and
        !          1344: a value of any integral type
        !          1345: may be added.
        !          1346: The latter is in all cases converted to
        !          1347: an address offset
        !          1348: by multiplying it
        !          1349: by the length of the object to which the
        !          1350: pointer points.
        !          1351: The result is a pointer
        !          1352: of the same type as the original pointer
        !          1353: which points to another object in the same array,
        !          1354: appropriately offset from the original object.
        !          1355: Thus if
        !          1356: .B
        !          1357: P
        !          1358: .R
        !          1359: is a pointer
        !          1360: to an object in an array, the expression
        !          1361: .B
        !          1362: P\(pl1
        !          1363: .R
        !          1364: is a pointer
        !          1365: to the next object in the array.
        !          1366: No further type combinations are allowed for pointers.
        !          1367: .PP
        !          1368: The
        !          1369: .B
        !          1370: \(pl
        !          1371: .R
        !          1372: operator is associative,
        !          1373: and expressions with several additions at the same level may
        !          1374: be rearranged by the compiler.
        !          1375: .PP
        !          1376: The result of the
        !          1377: .B
        !          1378: \(mi
        !          1379: .R
        !          1380: operator is the difference of the operands.
        !          1381: The usual arithmetic conversions are performed.
        !          1382: Additionally,
        !          1383: a value of any integral type
        !          1384: may be subtracted from a pointer,
        !          1385: and then the same conversions for addition apply.
        !          1386: .PP
        !          1387: If two pointers to objects of the same type are subtracted,
        !          1388: the result is converted
        !          1389: (by division by the length of the object)
        !          1390: to an
        !          1391: .B
        !          1392: int
        !          1393: .R
        !          1394: representing the number of
        !          1395: objects separating
        !          1396: the pointed-to objects.
        !          1397: This conversion will in general give unexpected
        !          1398: results unless the pointers point
        !          1399: to objects in the same array, since pointers, even
        !          1400: to objects of the same type, do not necessarily differ
        !          1401: by a multiple of the object length.
        !          1402: .NH 2 
        !          1403: Shift Operators
        !          1404: .PP
        !          1405: The shift operators
        !          1406: .B
        !          1407: <<
        !          1408: .R
        !          1409: and
        !          1410: .B
        !          1411: >>
        !          1412: .R
        !          1413: group left to right.
        !          1414: Both perform the usual arithmetic conversions on their operands,
        !          1415: each of which must be integral.
        !          1416: Then the right operand is converted to
        !          1417: \fBint\fR;
        !          1418: the type of the result is that of the left operand.
        !          1419: The result is undefined if the right operand is negative
        !          1420: or greater than or equal to the length of the object in bits.
        !          1421: On the VAX a negative right operand is interpreted as reversing
        !          1422: the direction of the shift.
        !          1423: .DS 
        !          1424: \fIshift-expression:
        !          1425:         expression << expression
        !          1426:         expression >> expression\fR
        !          1427: .DE
        !          1428: .PP
        !          1429: The value of
        !          1430: .B
        !          1431: E1<<E2
        !          1432: .R
        !          1433: is
        !          1434: .B
        !          1435: E1
        !          1436: .R
        !          1437: (interpreted as a bit
        !          1438: pattern) left-shifted
        !          1439: .B
        !          1440: E2
        !          1441: .R
        !          1442: bits.
        !          1443: Vacated bits are 0 filled.
        !          1444: The value of
        !          1445: .B
        !          1446: E1>>E2
        !          1447: .R
        !          1448: is
        !          1449: .B
        !          1450: E1
        !          1451: .R
        !          1452: right-shifted
        !          1453: .B
        !          1454: E2
        !          1455: .R
        !          1456: bit positions.
        !          1457: The right shift is guaranteed to be logical
        !          1458: (0 fill)
        !          1459: if
        !          1460: .B
        !          1461: E1
        !          1462: .R
        !          1463: is
        !          1464: \fBunsigned\fR;
        !          1465: otherwise, it may be
        !          1466: arithmetic.
        !          1467: .NH 2 
        !          1468: Relational Operators
        !          1469: .PP
        !          1470: The relational operators group left to right. 
        !          1471: .DS 
        !          1472: \fIrelational-expression:
        !          1473:         expression < expression
        !          1474:         expression > expression
        !          1475:         expression <= expression
        !          1476:         expression >= expression\fR
        !          1477: .DE
        !          1478: .PP
        !          1479: The operators
        !          1480: .B
        !          1481: <
        !          1482: .R
        !          1483: (less than),
        !          1484: .B
        !          1485: >
        !          1486: .R
        !          1487: (greater than), \fB<=\fR
        !          1488: (less than
        !          1489: or equal to), and
        !          1490: .B
        !          1491: >=
        !          1492: .R
        !          1493: (greater than or equal to)
        !          1494: all yield 0 if the specified relation is false
        !          1495: and 1 if it is true.
        !          1496: The type of the result is
        !          1497: .B
        !          1498: int\fR.
        !          1499: The usual arithmetic conversions are performed.
        !          1500: Two pointers may be compared;
        !          1501: the result depends on the relative locations in the address space
        !          1502: of the pointed-to objects.
        !          1503: Pointer comparison is portable only when the pointers point to objects
        !          1504: in the same array.
        !          1505: .NH 2 
        !          1506: Equality Operators
        !          1507: .PP
        !          1508: .DS 
        !          1509: \fIequality-expression:
        !          1510:         expression == expression
        !          1511:         expression != expression\fR
        !          1512: .DE
        !          1513: .PP
        !          1514: The
        !          1515: .B
        !          1516: ==
        !          1517: .R
        !          1518: (equal to) and the
        !          1519: .B
        !          1520: !=
        !          1521: .R
        !          1522: (not equal to) operators
        !          1523: are exactly analogous to the relational
        !          1524: operators except for their lower
        !          1525: precedence.
        !          1526: (Thus
        !          1527: .B
        !          1528: a<b\ ==\ c<d
        !          1529: .R
        !          1530: is 1 whenever
        !          1531: .B
        !          1532: a<b
        !          1533: .R
        !          1534: and
        !          1535: .B
        !          1536: c<d
        !          1537: .R
        !          1538: have the same truth value).
        !          1539: .PP
        !          1540: A pointer may be compared to an integer
        !          1541: only if the
        !          1542: integer is the constant 0.
        !          1543: A pointer to which 0 has been assigned is guaranteed
        !          1544: not to point to any object
        !          1545: and will appear to be equal to 0.
        !          1546: In conventional usage, such a pointer is considered to be null.
        !          1547: .NH 2 
        !          1548: Bitwise \s-1AND\s0 Operator
        !          1549: .PP
        !          1550: .DS 
        !          1551: \fIand-expression:
        !          1552:         expression & expression\fR
        !          1553: .DE
        !          1554: .PP
        !          1555: The
        !          1556: .B
        !          1557: &
        !          1558: .R
        !          1559: operator is associative,
        !          1560: and expressions involving
        !          1561: .B
        !          1562: &
        !          1563: .R
        !          1564: may be rearranged.
        !          1565: The usual arithmetic conversions are performed.
        !          1566: The result is the bitwise
        !          1567: AND
        !          1568: function of the operands.
        !          1569: The operator applies only to integral
        !          1570: operands.
        !          1571: .NH 2 
        !          1572: Bitwise Exclusive \s-1OR\s0 Operator
        !          1573: .DS 
        !          1574: \fIexclusive-or-expression:
        !          1575:         expression ^ expression\fR
        !          1576: .DE
        !          1577: .PP
        !          1578: The
        !          1579: .B
        !          1580: ^
        !          1581: .R
        !          1582: operator is associative,
        !          1583: and expressions involving
        !          1584: .B
        !          1585: ^
        !          1586: .R
        !          1587: may be rearranged.
        !          1588: The usual arithmetic conversions are performed;
        !          1589: the result is
        !          1590: the bitwise exclusive
        !          1591: OR
        !          1592: function of
        !          1593: the operands.
        !          1594: The operator applies only to integral
        !          1595: operands.
        !          1596: .NH 2 
        !          1597: Bitwise Inclusive \s-1OR\s0 Operator
        !          1598: .DS 
        !          1599: \fIinclusive-or-expression:
        !          1600:         expression | expression\fR
        !          1601: .DE
        !          1602: .PP
        !          1603: The
        !          1604: .B
        !          1605: |
        !          1606: .R
        !          1607: operator is associative,
        !          1608: and expressions involving
        !          1609: .B
        !          1610: |
        !          1611: .R
        !          1612: may be rearranged.
        !          1613: The usual arithmetic conversions are performed;
        !          1614: the result is the bitwise inclusive
        !          1615: OR
        !          1616: function of its operands.
        !          1617: The operator applies only to integral
        !          1618: operands.
        !          1619: .NH 2 
        !          1620: Logical \s-1AND\s0 Operator
        !          1621: .DS 
        !          1622: \fIlogical-and-expression:
        !          1623:         expression && expression\fR
        !          1624: .DE
        !          1625: .PP
        !          1626: The
        !          1627: .B
        !          1628: &&
        !          1629: .R
        !          1630: operator groups left to right.
        !          1631: It returns 1 if both its operands
        !          1632: evaluate to nonzero, 0 otherwise.
        !          1633: Unlike
        !          1634: \fB&\fR,
        !          1635: .B
        !          1636: &&
        !          1637: .R
        !          1638: guarantees left to right
        !          1639: evaluation; moreover, the second operand is not evaluated
        !          1640: if the first operand is 0.
        !          1641: .PP
        !          1642: The operands need not have the same type, but each
        !          1643: must have one of the fundamental
        !          1644: types or be a pointer.
        !          1645: The result is always
        !          1646: .B
        !          1647: int\fR.
        !          1648: .R
        !          1649: .NH 2 
        !          1650: Logical \s-1OR\s0 Operator
        !          1651: .DS 
        !          1652: \fIlogical-or-expression:
        !          1653:         expression || expression\fR
        !          1654: .DE
        !          1655: .PP
        !          1656: The
        !          1657: .B
        !          1658: ||
        !          1659: .R
        !          1660: operator groups left to right.
        !          1661: It returns 1 if either of its operands
        !          1662: evaluates to nonzero, 0 otherwise.
        !          1663: Unlike
        !          1664: \fB|\fR,
        !          1665: .B
        !          1666: ||
        !          1667: .R
        !          1668: guarantees left to right evaluation; moreover,
        !          1669: the second operand is not evaluated
        !          1670: if the value of the first operand is nonzero.
        !          1671: .PP
        !          1672: The operands need not have the same type, but each
        !          1673: must
        !          1674: have one of the fundamental types
        !          1675: or be a pointer.
        !          1676: The result is always
        !          1677: .B
        !          1678: int\fR.
        !          1679: .R
        !          1680: .NH 2 
        !          1681: Conditional Operator
        !          1682: .DS 
        !          1683: \fIconditional-expression:
        !          1684:         expression ? expression : expression\fR
        !          1685: .DE
        !          1686: .PP
        !          1687: Conditional expressions group right to left.
        !          1688: The first expression is evaluated;
        !          1689: and if it is nonzero, the result is the value of the
        !          1690: second expression, otherwise that of third expression.
        !          1691: If possible, the usual arithmetic conversions are performed
        !          1692: to bring the second and third expressions to a common type.
        !          1693: If both are structures or unions of the same type,
        !          1694: the result has the type of the structure or union.
        !          1695: If both pointers are of the same type,
        !          1696: the result has the common type.
        !          1697: Otherwise, one must be a pointer and the other the constant 0,
        !          1698: and the result has the type of the pointer.
        !          1699: Only one of the second and third
        !          1700: expressions is evaluated.
        !          1701: .NH 2 
        !          1702: Assignment Operators
        !          1703: .PP
        !          1704: There are a number of assignment operators,
        !          1705: all of which group right to left.
        !          1706: All require an lvalue as their left operand,
        !          1707: and the type of an assignment expression is that
        !          1708: of its left operand.
        !          1709: The value is the value stored in the
        !          1710: left operand after the assignment has taken place.
        !          1711: The two parts of a compound assignment operator are separate
        !          1712: tokens.
        !          1713: .DS 
        !          1714: \fIassignment-expression:
        !          1715:         lvalue = expression
        !          1716:         lvalue \(pl= expression
        !          1717:         lvalue \(mi= expression
        !          1718:         lvalue \(**= expression
        !          1719:         lvalue /= expression
        !          1720:         lvalue %= expression
        !          1721:         lvalue >>= expression
        !          1722:         lvalue <<= expression
        !          1723:         lvalue &= expression
        !          1724:         lvalue ^= expression
        !          1725:         lvalue |= expression\fR
        !          1726: .DE
        !          1727: .PP
        !          1728: In the simple assignment with
        !          1729: \fB=\fR,
        !          1730: the value of the expression replaces that of the object
        !          1731: referred
        !          1732: to by the lvalue.
        !          1733: If both operands have arithmetic type,
        !          1734: the right operand is converted to the type of the left
        !          1735: preparatory to the assignment.
        !          1736: Second, both operands may be structures or unions of the same type.
        !          1737: Finally, if the left operand is a pointer, the right operand must in general be a pointer
        !          1738: of the same type.
        !          1739: However, the constant 0 may be assigned to a pointer;
        !          1740: it is guaranteed that this value will produce a null
        !          1741: pointer distinguishable from a pointer to any object.
        !          1742: .PP
        !          1743: The behavior of an expression
        !          1744: of the form
        !          1745: \fBE1\fR\^ \fIop\fR\^ = \fBE2\fR\^
        !          1746: may be inferred by
        !          1747: taking it as equivalent to
        !          1748: \fBE1 = E1 \fIop\fR\^ (\fBE2\fR\^);
        !          1749: however,
        !          1750: .B
        !          1751: E1
        !          1752: .R
        !          1753: is evaluated only once.
        !          1754: In
        !          1755: .B
        !          1756: \(pl=
        !          1757: .R
        !          1758: and
        !          1759: \fB\(mi=\fR,
        !          1760: the left operand may be a pointer; in which case, the (integral) right
        !          1761: operand is converted as explained
        !          1762: in ``Additive Operators.''
        !          1763: All right operands and all nonpointer left operands must
        !          1764: have arithmetic type.
        !          1765: .NH 2 
        !          1766: Comma Operator
        !          1767: .DS 
        !          1768: \fIcomma-expression:
        !          1769:         expression , expression\fR
        !          1770: .DE
        !          1771: .PP
        !          1772: A pair of expressions separated by a comma is evaluated
        !          1773: left to right, and the value of the left expression is
        !          1774: discarded.
        !          1775: The type and value of the result are the
        !          1776: type and value of the right operand.
        !          1777: This operator groups left to right.
        !          1778: In contexts where comma is given a special meaning,
        !          1779: e.g., in lists of actual arguments
        !          1780: to functions (see ``Primary Expressions'') and lists
        !          1781: of initializers (see ``Initialization'' under ``DECLARATIONS''),
        !          1782: the comma operator as described in this subpart
        !          1783: can only appear in parentheses. For example,
        !          1784: .DS 
        !          1785: \fBf(a, (t=3, t\(pl2), c)\fR
        !          1786: .DE
        !          1787: .LP 
        !          1788: has three arguments, the second of which has the value 5.
        !          1789: .NH 1 
        !          1790: Declarations
        !          1791: .PP
        !          1792: Declarations are used to specify the interpretation
        !          1793: which C gives to each identifier; they do not necessarily
        !          1794: reserve storage associated with the identifier.
        !          1795: Declarations have the form
        !          1796: .DS 
        !          1797: \fIdeclaration:
        !          1798:         decl-specifiers declarator-list\v'0.5'\s-2opt\s0\v'-0.5' ;\fR
        !          1799: .DE
        !          1800: .PP 
        !          1801: The declarators in the declarator-list
        !          1802: contain the identifiers being declared.
        !          1803: The decl-specifiers
        !          1804: consist of a sequence of type and storage class specifiers.
        !          1805: .DS 
        !          1806: \fIdecl-specifiers:
        !          1807:         type-specifier decl-specifiers\v'0.5'\s-2opt\s0\v'-0.5'
        !          1808:         sc-specifier decl-specifiers\v'0.5'\s-2opt\s0\v'-0.5'\fR
        !          1809: .DE
        !          1810: .PP 
        !          1811: The list must be self-consistent in a way described below.
        !          1812: .NH 2 
        !          1813: Storage Class Specifiers
        !          1814: .PP
        !          1815: The sc-specifiers are:
        !          1816: .DS 
        !          1817: \fIsc-specifier:\fB
        !          1818:         auto
        !          1819:         static
        !          1820:         extern
        !          1821:         register
        !          1822:         typedef\fR
        !          1823: .DE
        !          1824: .PP 
        !          1825: The
        !          1826: .B
        !          1827: typedef
        !          1828: .R
        !          1829: specifier does not reserve storage
        !          1830: and is called a ``storage class specifier'' only for syntactic convenience.
        !          1831: See ``Typedef'' for more information.
        !          1832: The meanings of the various storage classes were discussed in ``Names.''
        !          1833: .PP
        !          1834: The
        !          1835: \fBauto\fR,
        !          1836: \fBstatic\fR,
        !          1837: and
        !          1838: .B
        !          1839: register
        !          1840: .R
        !          1841: declarations also serve as definitions
        !          1842: in that they cause an appropriate amount of storage to be reserved.
        !          1843: In the
        !          1844: .B
        !          1845: extern
        !          1846: .R
        !          1847: case,
        !          1848: there must be an external definition (see ``External Definitions'')
        !          1849: for the given identifiers
        !          1850: somewhere outside the function in which they are declared.
        !          1851: .PP
        !          1852: A
        !          1853: .B
        !          1854: register
        !          1855: .R
        !          1856: declaration is best thought of as an
        !          1857: .B
        !          1858: auto
        !          1859: .R
        !          1860: declaration, together with a hint to the compiler
        !          1861: that the variables declared will be heavily used.
        !          1862: Only the first few
        !          1863: such declarations in each function are effective.
        !          1864: Moreover, only variables of certain types will be stored in registers;
        !          1865: on the
        !          1866: PDP-11,
        !          1867: they are
        !          1868: .B
        !          1869: int
        !          1870: .R
        !          1871: or pointer.
        !          1872: One other restriction applies to register variables:
        !          1873: the address-of operator
        !          1874: .B
        !          1875: &
        !          1876: .R
        !          1877: cannot be applied to them.
        !          1878: Smaller, faster programs can be expected if register declarations
        !          1879: are used appropriately,
        !          1880: but future improvements in code generation
        !          1881: may render them unnecessary.
        !          1882: .PP
        !          1883: At most, one sc-specifier may be given in a declaration.
        !          1884: If the sc-specifier is missing from a declaration, it
        !          1885: is taken to be
        !          1886: .B
        !          1887: auto
        !          1888: .R
        !          1889: inside a function,
        !          1890: .B
        !          1891: extern
        !          1892: .R
        !          1893: outside.
        !          1894: Exception:
        !          1895: functions are never
        !          1896: automatic.
        !          1897: .NH 2 
        !          1898: Type Specifiers
        !          1899: .PP
        !          1900: The type-specifiers are
        !          1901: .DS 
        !          1902: \fItype-specifier:
        !          1903:         struct-or-union-specifier
        !          1904:         typedef-name
        !          1905:         enum-specifier
        !          1906: basic-type-specifier:
        !          1907:         basic-type
        !          1908:         basic-type basic-type-specifiers
        !          1909: basic-type:\fB
        !          1910:         char
        !          1911:         short
        !          1912:         int
        !          1913:         long
        !          1914:         unsigned
        !          1915:         float
        !          1916:         double
        !          1917:         void\fR
        !          1918: .DE
        !          1919: .PP 
        !          1920: At most one of the words \fBlong\fR or \fBshort\fR
        !          1921: may be specified in conjunction with \fBint\fR;
        !          1922: the meaning is the same as if \fBint\fR were not mentioned.
        !          1923: The word \fBlong\fR may be specified in conjunction with
        !          1924: \fBfloat\fR;
        !          1925: the meaning is the same as \fBdouble\fR.
        !          1926: The word \fBunsigned\fR may be specified alone, or
        !          1927: in conjunction with \fBint\fR or any of its short
        !          1928: or long varieties, or with \fBchar\fR.
        !          1929: .PP
        !          1930: Otherwise, at most on type-specifier may be
        !          1931: given in a declaration.
        !          1932: In particular, adjectival use of \fBlong\fR,
        !          1933: \fBshort\fR, or \fBunsigned\fR is not permitted
        !          1934: with \fBtypedef\fR names.
        !          1935: If the type-specifier is missing from a declaration,
        !          1936: it is taken to be \fBint\fR.
        !          1937: .PP
        !          1938: Specifiers for structures, unions, and enumerations are discussed in
        !          1939: ``Structure, Union, and Enumeration Declarations.''
        !          1940: Declarations with
        !          1941: .B
        !          1942: typedef
        !          1943: .R
        !          1944: names are discussed in ``Typedef.''
        !          1945: .NH 2 
        !          1946: Declarators
        !          1947: .PP
        !          1948: The declarator-list appearing in a declaration
        !          1949: is a comma-separated sequence of declarators,
        !          1950: each of which may have an initializer.
        !          1951: .DS 
        !          1952: \fIdeclarator-list:
        !          1953:         init-declarator
        !          1954:         init-declarator , declarator-list
        !          1955: .DE
        !          1956: .DS 
        !          1957: \fIinit-declarator:
        !          1958:         declarator initializer\v'0.5'\s-2opt\s0\v'-0.5'\fR
        !          1959: .DE
        !          1960: .PP 
        !          1961: Initializers are discussed in ``Initialization''.
        !          1962: The specifiers in the declaration
        !          1963: indicate the type and storage class of the objects to which the
        !          1964: declarators refer.
        !          1965: Declarators have the syntax:
        !          1966: .DS 
        !          1967: \fIdeclarator:
        !          1968:         identifier
        !          1969:         ( declarator )
        !          1970:         \(** declarator
        !          1971:         declarator ()
        !          1972:         declarator [ constant-expression\v'0.5'\s-2opt\s0\v'-0.5' ]\fR
        !          1973: .DE
        !          1974: .PP 
        !          1975: The grouping is
        !          1976: the same as in expressions.
        !          1977: .NH 2 
        !          1978: Meaning of Declarators
        !          1979: .PP
        !          1980: Each declarator is taken to be
        !          1981: an assertion that when a construction of
        !          1982: the same form as the declarator appears in an expression,
        !          1983: it yields an object of the indicated
        !          1984: type and storage class.
        !          1985: .PP
        !          1986: Each declarator contains exactly one identifier; it is this identifier that
        !          1987: is declared.
        !          1988: If an unadorned identifier appears
        !          1989: as a declarator, then it has the type
        !          1990: indicated by the specifier heading the declaration.
        !          1991: .PP
        !          1992: A declarator in parentheses is identical to the unadorned declarator,
        !          1993: but the binding of complex declarators may be altered by parentheses.
        !          1994: See the examples below.
        !          1995: .PP
        !          1996: Now imagine a declaration
        !          1997: .DS 
        !          1998: \fBT D1\fR
        !          1999: .DE
        !          2000: .LP 
        !          2001: where
        !          2002: .B
        !          2003: T
        !          2004: .R
        !          2005: is a type-specifier (like
        !          2006: \fBint\fR,
        !          2007: etc.)
        !          2008: and
        !          2009: .B
        !          2010: D1
        !          2011: .R
        !          2012: is a declarator.
        !          2013: Suppose this declaration makes the identifier have type
        !          2014: ``\|.\|.\|.\|
        !          2015: .B
        !          2016: T
        !          2017: .R
        !          2018: ,''
        !          2019: where the ``\|.\|.\|.\|'' is empty if
        !          2020: .B
        !          2021: D1
        !          2022: .R
        !          2023: is just a plain identifier
        !          2024: (so that the type of
        !          2025: .B
        !          2026: x
        !          2027: .R
        !          2028: in
        !          2029: \fB`int x''\fR
        !          2030: is just
        !          2031: \fBint\fR).
        !          2032: Then if
        !          2033: .B
        !          2034: D1
        !          2035: .R
        !          2036: has the form
        !          2037: .DS 
        !          2038: \fB\(**D\fR
        !          2039: .DE
        !          2040: .LP 
        !          2041: the type of the contained identifier is
        !          2042: ``\|.\|.\|.\| pointer to
        !          2043: .B
        !          2044: T
        !          2045: .R
        !          2046: \&.''
        !          2047: .PP
        !          2048: If
        !          2049: .B
        !          2050: D1
        !          2051: .R
        !          2052: has the form
        !          2053: .DS 
        !          2054: \fBD\|(\|\|)\|\fR
        !          2055: .DE
        !          2056: .LP 
        !          2057: then the contained identifier has the type
        !          2058: ``\|.\|.\|. function returning
        !          2059: \fBT\fR.''
        !          2060: .LP
        !          2061: If
        !          2062: .B
        !          2063: D1
        !          2064: .R
        !          2065: has the form
        !          2066: .DS 
        !          2067: \fBD\|[\|\fIconstant-expression\fB\|]\fR
        !          2068: .DE
        !          2069: .LP 
        !          2070: or
        !          2071: .DS 
        !          2072: \fBD\|[\|]\|\fR
        !          2073: .DE
        !          2074: .LP 
        !          2075: then the contained identifier has type
        !          2076: ``\|.\|.\|.\| array of
        !          2077: \fBT\fR.''
        !          2078: In the first case, the constant
        !          2079: expression
        !          2080: is an expression
        !          2081: whose value is determinable at compile time
        !          2082: , whose type is
        !          2083: .B
        !          2084: int\fR,
        !          2085: and whose value is positive.
        !          2086: (Constant expressions are defined precisely in ``Constant Expressions.'')
        !          2087: When several ``array of'' specifications are adjacent, a multidimensional
        !          2088: array is created;
        !          2089: the constant expressions which specify the bounds
        !          2090: of the arrays may be missing only for the first member of the sequence.
        !          2091: This elision is useful when the array is external
        !          2092: and the actual definition, which allocates storage,
        !          2093: is given elsewhere.
        !          2094: The first constant expression may also be omitted
        !          2095: when the declarator is followed by initialization.
        !          2096: In this case the size is calculated from the number
        !          2097: of initial elements supplied.
        !          2098: .PP
        !          2099: An array may be constructed from one of the basic types, from a pointer,
        !          2100: from a structure or union,
        !          2101: or from another array (to generate a multidimensional array).
        !          2102: .PP
        !          2103: Not all the possibilities
        !          2104: allowed by the syntax above are actually
        !          2105: permitted.
        !          2106: The restrictions are as follows:
        !          2107: functions may not return
        !          2108: arrays or functions
        !          2109: although they may return pointers;
        !          2110: there are no arrays of functions although
        !          2111: there may be arrays of pointers to functions.
        !          2112: Likewise, a structure or union may not contain a function;
        !          2113: but it may contain a pointer to a function.
        !          2114: .PP
        !          2115: As an example, the declaration
        !          2116: .DS 
        !          2117: \fBint i, \(**ip, f(), \(**fip(), (\(**pfi)();\fR
        !          2118: .DE
        !          2119: .LP 
        !          2120: declares an integer
        !          2121: \fBi\fR,
        !          2122: a pointer
        !          2123: .B
        !          2124: ip
        !          2125: .R
        !          2126: to an integer,
        !          2127: a function
        !          2128: .B
        !          2129: f
        !          2130: .R
        !          2131: returning an integer,
        !          2132: a function
        !          2133: .B
        !          2134: fip
        !          2135: .R
        !          2136: returning a pointer to an integer,
        !          2137: and a pointer
        !          2138: .B
        !          2139: pfi
        !          2140: .R
        !          2141: to a function which
        !          2142: returns an integer.
        !          2143: It is especially useful to compare the last two.
        !          2144: The binding of
        !          2145: .B
        !          2146: \(**fip()
        !          2147: .R
        !          2148: is
        !          2149: .B
        !          2150: \(**(fip())\fR.
        !          2151: .R
        !          2152: The declaration suggests,
        !          2153: and the same construction in an expression
        !          2154: requires, the calling of a function
        !          2155: .B
        !          2156: fip\fR.
        !          2157: .R
        !          2158: Using indirection through the (pointer) result
        !          2159: to yield an integer.
        !          2160: In the declarator
        !          2161: \fB(\(**pfi)()\fR,
        !          2162: the extra parentheses are necessary, as they are also
        !          2163: in an expression, to indicate that indirection through
        !          2164: a pointer to a function yields a function, which is then called;
        !          2165: it returns an integer.
        !          2166: .PP
        !          2167: As another example,
        !          2168: .DS 
        !          2169: \fBfloat fa[17], \(**afp[17];\fR
        !          2170: .DE
        !          2171: .LP 
        !          2172: declares an array of
        !          2173: .B
        !          2174: float
        !          2175: .R
        !          2176: numbers and an array of
        !          2177: pointers to
        !          2178: .B
        !          2179: float
        !          2180: .R
        !          2181: numbers.
        !          2182: Finally,
        !          2183: .DS 
        !          2184: \fBstatic int x3d[3][5][7];\fR
        !          2185: .DE
        !          2186: .LP 
        !          2187: declares a static 3-dimensional array of integers,
        !          2188: with rank 3\(mu5\(mu7.
        !          2189: In complete detail,
        !          2190: .B
        !          2191: x3d
        !          2192: .R
        !          2193: is an array of three items;
        !          2194: each item is an array of five arrays;
        !          2195: each of the latter arrays is an array of seven
        !          2196: integers.
        !          2197: Any of the expressions
        !          2198: \fBx3d\fR,
        !          2199: \fBx3d[i]\fR,
        !          2200: \fBx3d[i][j]\fR,
        !          2201: .B
        !          2202: x3d[i][j][k]
        !          2203: .R
        !          2204: may reasonably appear in an expression.
        !          2205: The first three have type ``array''
        !          2206: and the last has type
        !          2207: .B
        !          2208: int\fR.
        !          2209: .R
        !          2210: .NH 2 
        !          2211: Structure and Union Declarations
        !          2212: .PP
        !          2213: A structure
        !          2214: is an object consisting of a sequence of named members.
        !          2215: Each member may have any type.
        !          2216: A union is an object which may, at a given time, contain any one
        !          2217: of several members.
        !          2218: Structure and union specifiers have the same form.
        !          2219: .DS 
        !          2220: \fIstruct-or-union-specifier:
        !          2221:         struct-or-union { struct-decl-list }
        !          2222:         struct-or-union identifier { struct-decl-list }
        !          2223:         struct-or-union identifier
        !          2224: .DE
        !          2225: .DS 
        !          2226: \fIstruct-or-union:\fB
        !          2227:         struct
        !          2228:         union\fR
        !          2229: .DE
        !          2230: .PP 
        !          2231: The
        !          2232: struct-decl-list
        !          2233: .ne 4
        !          2234: is a sequence of declarations for the members of the structure or union:
        !          2235: .DS 
        !          2236: \fIstruct-decl-list:
        !          2237:         struct-declaration
        !          2238:         struct-declaration struct-decl-list
        !          2239: .DE
        !          2240: .DS 
        !          2241: \fIstruct-declaration:
        !          2242:         type-specifier struct-declarator-list ;
        !          2243: .DE
        !          2244: .DS 
        !          2245: \fIstruct-declarator-list:
        !          2246:         struct-declarator
        !          2247:         struct-declarator , struct-declarator-list\fR
        !          2248: .DE
        !          2249: .PP 
        !          2250: In the usual case, a struct-declarator is just a declarator
        !          2251: for a member of a structure or union.
        !          2252: A structure member may also consist of a specified number of bits.
        !          2253: Such a member is also called a
        !          2254: .I
        !          2255: field ;
        !          2256: .R
        !          2257: its length,
        !          2258: a non-negative constant expression,
        !          2259: is set off from the field name by a colon.
        !          2260: .DS 
        !          2261: \fIstruct-declarator:
        !          2262:         declarator
        !          2263:         declarator : constant-expression
        !          2264:         : constant-expression\fR
        !          2265: .DE
        !          2266: .PP 
        !          2267: Within a structure, the objects declared
        !          2268: have addresses which increase as the declarations
        !          2269: are read left to right.
        !          2270: Each nonfield member of a structure
        !          2271: begins on an addressing boundary appropriate
        !          2272: to its type;
        !          2273: therefore, there may
        !          2274: be unnamed holes in a structure.
        !          2275: Field members are packed into machine integers;
        !          2276: they do not straddle words.
        !          2277: A field which does not fit into the space remaining in a word
        !          2278: is put into the next word.
        !          2279: No field may be wider than a word.
        !          2280: .PP
        !          2281: Fields are assigned right to left
        !          2282: on the
        !          2283: PDP-11
        !          2284: and
        !          2285: VAX-11,
        !          2286: left to right on the 3B 20.
        !          2287: .PP
        !          2288: A struct-declarator with no declarator, only a colon and a width,
        !          2289: indicates an unnamed field useful for padding to conform
        !          2290: to externally-imposed layouts.
        !          2291: As a special case, a field with a width of 0
        !          2292: specifies alignment of the next field at an implementation dependant boundary.
        !          2293: .PP
        !          2294: The language does not restrict the types of things that
        !          2295: are declared as fields,
        !          2296: but implementations are not required to support any but
        !          2297: integer fields.
        !          2298: Moreover,
        !          2299: even
        !          2300: .B
        !          2301: int
        !          2302: .R
        !          2303: fields may be considered to be unsigned.
        !          2304: On the
        !          2305: PDP-11,
        !          2306: fields are not signed and have only integer values;
        !          2307: on the
        !          2308: VAX-11,
        !          2309: fields declared with
        !          2310: .B
        !          2311: int
        !          2312: .R
        !          2313: are treated as containing a sign.
        !          2314: For these reasons,
        !          2315: it is strongly recommended that fields be declared as
        !          2316: .B
        !          2317: unsigned\fR.
        !          2318: .R
        !          2319: In all implementations,
        !          2320: there are no arrays of fields,
        !          2321: and the address-of operator
        !          2322: .B
        !          2323: &
        !          2324: .R
        !          2325: may not be applied to them, so that there are no pointers to
        !          2326: fields.
        !          2327: .PP
        !          2328: A union may be thought of as a structure all of whose members
        !          2329: begin at offset 0 and whose size is sufficient to contain
        !          2330: any of its members.
        !          2331: At most, one of the members can be stored in a union
        !          2332: at any time.
        !          2333: .PP
        !          2334: A structure or union specifier of the second form, that is, one of
        !          2335: .DS 
        !          2336:         \fBstruct \fIidentifier { struct-decl-list \fR}
        !          2337:         \fBunion \fIidentifier { struct-decl-list \fR}
        !          2338: .DE
        !          2339: .LP 
        !          2340: declares the identifier to be the
        !          2341: .I
        !          2342: structure tag
        !          2343: .R
        !          2344: (or union tag)
        !          2345: of the structure specified by the list.
        !          2346: A subsequent declaration may then use
        !          2347: the third form of specifier, one of
        !          2348: .DS 
        !          2349:         \fBstruct \fIidentifier\fR
        !          2350:         \fBunion \fIidentifier\fR
        !          2351: .DE
        !          2352: .PP 
        !          2353: Structure tags allow definition of self-referential
        !          2354: structures. Structure tags also
        !          2355: permit the long part of the declaration to be
        !          2356: given once and used several times.
        !          2357: It is illegal to declare a structure or union
        !          2358: which contains an instance of
        !          2359: itself, but a structure or union may contain a pointer to an instance of itself.
        !          2360: .PP
        !          2361: The third form of a structure or union specifier may be
        !          2362: used prior to a declaration which gives the complete specification
        !          2363: of the structure or union in situations in which the size
        !          2364: of the structure or union is unnecessary.
        !          2365: The size is unnecessary in two situations: when a
        !          2366: pointer to a structure or union is being declared and
        !          2367: when a \fBtypedef\fR name is declared to be a synonym
        !          2368: for a structure or union.
        !          2369: This, for example, allows the declaration of a pair
        !          2370: of structures which contain pointers to each other.
        !          2371: .PP
        !          2372: The names of members and tags do not conflict
        !          2373: with each other or with ordinary variables.
        !          2374: A particular name may not be used twice
        !          2375: in the same structure,
        !          2376: but the same name may be used in several different structures in the same scope.
        !          2377: .PP
        !          2378: A simple but important example of a structure declaration is
        !          2379: the following binary tree structure:
        !          2380: .DS 
        !          2381: \fBstruct tnode 
        !          2382: {
        !          2383:         char tword[20];
        !          2384:         int count;
        !          2385:         struct tnode \(**left;
        !          2386:         struct tnode \(**right;
        !          2387: };\fR
        !          2388: .DE
        !          2389: .LP 
        !          2390: which contains an array of 20 characters, an integer, and two pointers
        !          2391: to similar structures.
        !          2392: Once this declaration has been given, the
        !          2393: declaration
        !          2394: .DS 
        !          2395: \fBstruct tnode s, \(**sp;\fR
        !          2396: .DE
        !          2397: .LP 
        !          2398: declares
        !          2399: .B
        !          2400: s
        !          2401: .R
        !          2402: to be a structure of the given sort
        !          2403: and
        !          2404: .B
        !          2405: sp
        !          2406: .R
        !          2407: to be a pointer to a structure
        !          2408: of the given sort.
        !          2409: With these declarations, the expression
        !          2410: .DS 
        !          2411: \fBsp->count\fR
        !          2412: .DE
        !          2413: .LP 
        !          2414: refers to the
        !          2415: .B
        !          2416: count
        !          2417: .R
        !          2418: field of the structure to which
        !          2419: .B
        !          2420: sp
        !          2421: .R
        !          2422: points;
        !          2423: .DS 
        !          2424: \fBs.left\fR
        !          2425: .DE
        !          2426: .LP 
        !          2427: refers to the left subtree pointer
        !          2428: of the structure
        !          2429: \fBs\fR;
        !          2430: and
        !          2431: .DS 
        !          2432: \fBs.right->tword[0]\fR
        !          2433: .DE
        !          2434: .LP 
        !          2435: refers to the first character of the
        !          2436: .B
        !          2437: tword
        !          2438: .R
        !          2439: member of the right subtree of
        !          2440: .B
        !          2441: s\fR.
        !          2442: .R
        !          2443: .PP
        !          2444: .NH 2 
        !          2445: Enumeration Declarations
        !          2446: .PP
        !          2447: Enumeration variables and constants have integral type.
        !          2448: .DS 
        !          2449: \fIenum-specifier:\fB
        !          2450:         enum\fI { enum-list \fR}\fB
        !          2451:         enum \fIidentifier { enum-list \fR}\fB
        !          2452:         enum \fIidentifier
        !          2453: .sp
        !          2454: enum-list:
        !          2455:         enumerator
        !          2456:         enum-list , enumerator
        !          2457: .sp
        !          2458: enumerator:
        !          2459:         identifier
        !          2460:         identifier = constant-expression\fR
        !          2461: .DE
        !          2462: .PP 
        !          2463: The identifiers in an enum-list are declared as constants
        !          2464: and may appear wherever constants are required.
        !          2465: If no enumerators with
        !          2466: .B
        !          2467: =
        !          2468: .R
        !          2469: appear, then the values of the
        !          2470: corresponding constants begin at 0 and increase by 1 as the declaration is
        !          2471: read from left to right.
        !          2472: An enumerator with
        !          2473: .B
        !          2474: =
        !          2475: .R
        !          2476: gives the associated identifier the value
        !          2477: indicated; subsequent identifiers continue the progression from the assigned value.
        !          2478: .PP
        !          2479: The names of enumerators in the same scope must all be distinct
        !          2480: from each other and from those of ordinary variables.
        !          2481: .PP
        !          2482: The role of the identifier in the enum-specifier
        !          2483: is entirely analogous to that of the structure tag
        !          2484: in a struct-specifier; it names a particular enumeration.
        !          2485: For example,
        !          2486: .DS L 
        !          2487: \fBenum color { chartreuse, burgundy, claret=20, winedark };
        !          2488: \&...
        !          2489: enum color \(\(**\(**cp, col;
        !          2490: \&...
        !          2491: col = claret;
        !          2492: cp = &col;
        !          2493: \&...
        !          2494: if (\(\(**\(**cp == burgundy) ...\fR
        !          2495: .DE
        !          2496: .LP 
        !          2497: makes
        !          2498: .B
        !          2499: color
        !          2500: .R
        !          2501: the enumeration-tag of a type describing various colors,
        !          2502: and then declares
        !          2503: .B
        !          2504: cp
        !          2505: .R
        !          2506: as a pointer to an object of that type,
        !          2507: and
        !          2508: .B
        !          2509: col
        !          2510: .R
        !          2511: as an object of that type.
        !          2512: The possible values are drawn from the set {0,1,20,21}.
        !          2513: .NH 2 
        !          2514: Initialization
        !          2515: .PP
        !          2516: A declarator may specify an initial value for the
        !          2517: identifier being declared.
        !          2518: The initializer is preceded by
        !          2519: .B
        !          2520: = 
        !          2521: .R
        !          2522: and
        !          2523: consists of an expression or a list of values nested in braces.
        !          2524: .DS 
        !          2525: \fIinitializer:
        !          2526:         = expression
        !          2527:         = { initializer-list }
        !          2528:         = { initializer-list , }
        !          2529: .DE
        !          2530: .DS 
        !          2531: \fIinitializer-list:
        !          2532:         expression
        !          2533:         initializer-list , initializer-list\fR
        !          2534:         { \fIinitializer-list \fR}
        !          2535:         { \fIinitializer-list\fR , }
        !          2536: .DE
        !          2537: .PP
        !          2538: All the expressions in an initializer
        !          2539: for a static or external variable must be constant
        !          2540: expressions, which are described in ``CONSTANT EXPRESSIONS'',
        !          2541: or expressions which reduce to the address of a previously
        !          2542: declared variable, possibly offset by a constant expression.
        !          2543: Automatic or register variables may be initialized by arbitrary
        !          2544: expressions involving constants and previously declared variables and functions.
        !          2545: .PP
        !          2546: Static and external variables that are not initialized are
        !          2547: guaranteed to start off as zero.
        !          2548: Automatic and register variables that are not initialized
        !          2549: are guaranteed to start off as garbage.
        !          2550: .PP
        !          2551: When an initializer applies to a
        !          2552: .I
        !          2553: scalar
        !          2554: .R
        !          2555: (a pointer or an object of arithmetic type),
        !          2556: it consists of a single expression, perhaps in braces.
        !          2557: The initial value of the object is taken from
        !          2558: the expression; the same conversions as for assignment are performed.
        !          2559: .PP
        !          2560: When the declared variable is an
        !          2561: .I
        !          2562: aggregate
        !          2563: .R
        !          2564: (a structure or array),
        !          2565: the initializer consists of a brace-enclosed, comma-separated list of
        !          2566: initializers for the members of the aggregate
        !          2567: written in increasing subscript or member order.
        !          2568: If the aggregate contains subaggregates, this rule
        !          2569: applies recursively to the members of the aggregate.
        !          2570: If there are fewer initializers in the list than there are members of the aggregate,
        !          2571: then the aggregate is padded with zeros.
        !          2572: It is not permitted to initialize unions or automatic aggregates.
        !          2573: .PP
        !          2574: Braces may in some cases be omitted.
        !          2575: If the initializer begins with a left brace, then
        !          2576: the succeeding comma-separated list of initializers initializes
        !          2577: the members of the aggregate;
        !          2578: it is erroneous for there to be more initializers than members.
        !          2579: If, however, the initializer does not begin with a left brace,
        !          2580: then only enough elements from the list are taken to account
        !          2581: for the members of the aggregate; any remaining members
        !          2582: are left to initialize the next member of the aggregate of which
        !          2583: the current aggregate is a part.
        !          2584: .PP
        !          2585: A final abbreviation allows a
        !          2586: .B
        !          2587: char
        !          2588: .R
        !          2589: array to be initialized by a string.
        !          2590: In this case successive characters of the string
        !          2591: initialize the members of the array.
        !          2592: .PP
        !          2593: For example,
        !          2594: .DS 
        !          2595: \fBint x[] = { 1, 3, 5 };\fR
        !          2596: .DE
        !          2597: .LP 
        !          2598: declares and initializes
        !          2599: .B
        !          2600: x
        !          2601: .R
        !          2602: as a one-dimensional array which has three members, since no size was specified
        !          2603: and there are three initializers.
        !          2604: .DS 
        !          2605: \fBfloat y[4][3] = 
        !          2606: {
        !          2607:         { 1, 3, 5 },
        !          2608:         { 2, 4, 6 },
        !          2609:         { 3, 5, 7 },
        !          2610: };\fR
        !          2611: .DE
        !          2612: .LP 
        !          2613: is a completely-bracketed initialization:
        !          2614: 1, 3, and 5 initialize the first row of
        !          2615: the array
        !          2616: \fBy[0]\fR,
        !          2617: namely
        !          2618: \fBy[0][0]\fR,
        !          2619: \fBy[0][1]\fR,
        !          2620: and
        !          2621: .B
        !          2622: y[0][2]\fR.
        !          2623: .R
        !          2624: Likewise, the next two lines initialize
        !          2625: .B
        !          2626: y[1]
        !          2627: .R
        !          2628: and
        !          2629: .B
        !          2630: y[2]\fR.
        !          2631: .R
        !          2632: The initializer ends early and therefore
        !          2633: .B
        !          2634: y[3]
        !          2635: .R
        !          2636: is initialized with 0.
        !          2637: Precisely, the same effect could have been achieved by
        !          2638: .DS 
        !          2639: \fBfloat y[4][3] = 
        !          2640: {
        !          2641:         1, 3, 5, 2, 4, 6, 3, 5, 7
        !          2642: };\fR
        !          2643: .DE
        !          2644: .PP 
        !          2645: The initializer for
        !          2646: .B
        !          2647: y
        !          2648: .R
        !          2649: begins with a left brace but that for
        !          2650: .B
        !          2651: y[0]
        !          2652: .R
        !          2653: does not;
        !          2654: therefore, three elements from the list are used.
        !          2655: Likewise, the next three are taken successively for
        !          2656: .B
        !          2657: y[1]
        !          2658: .R
        !          2659: and
        !          2660: .B
        !          2661: y[2]\fR.
        !          2662: .R
        !          2663: Also,
        !          2664: .DS 
        !          2665: \fBfloat y[4][3] = 
        !          2666: {
        !          2667:         { 1 }, { 2 }, { 3 }, { 4 }
        !          2668: };\fR
        !          2669: .DE
        !          2670: .LP 
        !          2671: initializes the first column of
        !          2672: .B
        !          2673: y
        !          2674: .R
        !          2675: (regarded as a two-dimensional array)
        !          2676: and leaves the rest 0.
        !          2677: .PP
        !          2678: Finally,
        !          2679: .DS 
        !          2680: \fBchar msg[] = "Syntax error on line %s\en";\fR
        !          2681: .DE
        !          2682: .LP 
        !          2683: shows a character array whose members are initialized
        !          2684: with a string.
        !          2685: .NH 2 
        !          2686: Type Names
        !          2687: .PP
        !          2688: In two contexts (to specify type conversions explicitly
        !          2689: by means of a cast
        !          2690: and as an argument of
        !          2691: \fBsizeof\fR),
        !          2692: it is desired to supply the name of a data type.
        !          2693: This is accomplished using a ``type name'', which in essence
        !          2694: is a declaration for an object of that type which omits the name of
        !          2695: the object.
        !          2696: .DS 
        !          2697: \fItype-name:
        !          2698:         type-specifier abstract-declarator
        !          2699: .DE
        !          2700: .DS 
        !          2701: \fIabstract-declarator:
        !          2702:         empty
        !          2703:         ( abstract-declarator )
        !          2704:         \(** abstract-declarator
        !          2705:         abstract-declarator ()
        !          2706:         abstract-declarator\fR\^ [ \fIconstant-expression\v'0.5'\s-2opt\s0\v'-0.5' \fR\^]
        !          2707: .DE
        !          2708: .PP 
        !          2709: To avoid ambiguity,
        !          2710: in the construction
        !          2711: .DS 
        !          2712:         \fI( abstract-declarator \fR)
        !          2713: .DE
        !          2714: .LP 
        !          2715: the
        !          2716: abstract-declarator
        !          2717: is required to be nonempty.
        !          2718: Under this restriction,
        !          2719: it is possible to identify uniquely the location in the abstract-declarator
        !          2720: where the identifier would appear if the construction were a declarator
        !          2721: in a declaration.
        !          2722: The named type is then the same as the type of the
        !          2723: hypothetical identifier.
        !          2724: For example,
        !          2725: .DS 
        !          2726: \fBint
        !          2727: int \(**
        !          2728: int \(**[3]
        !          2729: int (\(**)[3]
        !          2730: int \(**()
        !          2731: int (\(**)()
        !          2732: int (\(**[3])()\fR
        !          2733: .DE
        !          2734: .LP 
        !          2735: name respectively the types ``integer,'' ``pointer to integer,''
        !          2736: ``array of three pointers to integers,''
        !          2737: ``pointer to an array of three integers,''
        !          2738: ``function returning pointer to integer,''
        !          2739: ``pointer to function returning an integer,''
        !          2740: and ``array of three pointers to functions returning an integer.''
        !          2741: .NH 2 
        !          2742: Typedef
        !          2743: .PP
        !          2744: Declarations whose ``storage class'' is
        !          2745: .B
        !          2746: typedef
        !          2747: .R
        !          2748: do not define storage but instead
        !          2749: define identifiers which can be used later
        !          2750: as if they were type keywords naming fundamental
        !          2751: or derived types.
        !          2752: .DS 
        !          2753: \fItypedef-name:\fR
        !          2754:         \fIidentifier\fR
        !          2755: .DE
        !          2756: .PP 
        !          2757: Within the scope of a declaration involving
        !          2758: \fBtypedef\fR,
        !          2759: each identifier appearing as part of
        !          2760: any declarator therein becomes syntactically
        !          2761: equivalent to the type keyword
        !          2762: naming the type
        !          2763: associated with the identifier
        !          2764: in the way described in ``Meaning of Declarators.''
        !          2765: For example,
        !          2766: after
        !          2767: .DS 
        !          2768: \fBtypedef int MILES, \(**KLICKSP;
        !          2769: typedef struct { double re, im; } complex;\fR
        !          2770: .DE
        !          2771: .LP 
        !          2772: the constructions
        !          2773: .DS 
        !          2774: \fBMILES distance;
        !          2775: extern KLICKSP metricp;
        !          2776: complex z, \(**zp;\fR
        !          2777: .DE
        !          2778: .LP 
        !          2779: are all legal declarations; the type of
        !          2780: .B
        !          2781: distance
        !          2782: .R
        !          2783: is
        !          2784: \fBint\fR,
        !          2785: that of
        !          2786: .B
        !          2787: metricp
        !          2788: .R
        !          2789: is ``pointer to \fBint\fR, ''
        !          2790: and that of
        !          2791: .B
        !          2792: z
        !          2793: .R
        !          2794: is the specified structure.
        !          2795: The
        !          2796: .B
        !          2797: zp
        !          2798: .R
        !          2799: is a pointer to such a structure.
        !          2800: .PP
        !          2801: The
        !          2802: .B
        !          2803: typedef
        !          2804: .R
        !          2805: does not introduce brand-new types, only synonyms for
        !          2806: types which could be specified in another way.
        !          2807: Thus
        !          2808: in the example above
        !          2809: .B
        !          2810: distance
        !          2811: .R
        !          2812: is considered to have exactly the same type as
        !          2813: any other
        !          2814: .B
        !          2815: int
        !          2816: .R
        !          2817: object.
        !          2818: .NH 1 
        !          2819: Statements
        !          2820: .PP
        !          2821: Except as indicated, statements are executed in sequence.
        !          2822: .NH 2 
        !          2823: Expression Statement
        !          2824: .PP
        !          2825: Most statements are expression statements, which have
        !          2826: the form
        !          2827: .DS 
        !          2828: \fIexpression \fR;
        !          2829: .DE
        !          2830: .PP 
        !          2831: Usually expression statements are assignments or function
        !          2832: calls.
        !          2833: .NH 2 
        !          2834: Compound Statement or Block
        !          2835: .PP
        !          2836: So that several statements can be used where one is expected,
        !          2837: the compound statement (also, and equivalently, called ``block'') is provided:
        !          2838: .DS 
        !          2839: \fIcompound-statement:
        !          2840:         { declaration-list\v'0.5'\s-2opt\s0\v'-0.5' statement-list\v'0.5'\s-2opt\s0\v'-0.5' }
        !          2841: .DE
        !          2842: .DS 
        !          2843: \fIdeclaration-list:
        !          2844:         declaration
        !          2845:         declaration declaration-list
        !          2846: .DE
        !          2847: .DS 
        !          2848: \fIstatement-list:
        !          2849:         statement
        !          2850:         statement statement-list\fR
        !          2851: .DE
        !          2852: .PP 
        !          2853: If any of the identifiers
        !          2854: in the declaration-list were previously declared,
        !          2855: the outer declaration is pushed down for the duration of the block,
        !          2856: after which it resumes its force.
        !          2857: .PP
        !          2858: Any initializations of
        !          2859: .B
        !          2860: auto
        !          2861: .R
        !          2862: or
        !          2863: .B
        !          2864: register
        !          2865: .R
        !          2866: variables are performed each time the block is entered at the top.
        !          2867: It is currently possible
        !          2868: (but a bad practice)
        !          2869: to transfer into a block;
        !          2870: in that case the initializations are not performed.
        !          2871: Initializations of
        !          2872: .B
        !          2873: static
        !          2874: .R
        !          2875: variables are performed only once when the program
        !          2876: begins execution.
        !          2877: Inside a block,
        !          2878: .B
        !          2879: extern
        !          2880: .R
        !          2881: declarations do not reserve storage
        !          2882: so initialization is not permitted.
        !          2883: .NH 2 
        !          2884: Conditional Statement
        !          2885: .PP
        !          2886: The two forms of the conditional statement are
        !          2887: .DS 
        !          2888: \fBif\fR\^ ( \fIexpression\fR\^ ) \fIstatement\fR\^
        !          2889: \fBif\fR\^ ( \fIexpression\fR\^ ) \fIstatement \fBelse \fIstatement\fR\^
        !          2890: .DE
        !          2891: .PP 
        !          2892: In both cases, the expression is evaluated;
        !          2893: and if it is nonzero, the first substatement
        !          2894: is executed.
        !          2895: In the second case, the second substatement is executed
        !          2896: if the expression is 0.
        !          2897: The ``else'' ambiguity is resolved by connecting
        !          2898: an
        !          2899: .B
        !          2900: else
        !          2901: .R
        !          2902: with the last encountered
        !          2903: \fBelse\fR-less
        !          2904: .B
        !          2905: if\fR.
        !          2906: .R
        !          2907: .NH 2 
        !          2908: While Statement
        !          2909: .PP
        !          2910: The
        !          2911: .B
        !          2912: while
        !          2913: .R
        !          2914: statement has the form
        !          2915: .DS 
        !          2916: \fBwhile\fR\^ ( \fIexpression\fR\^ ) \fIstatement\fR\^
        !          2917: .DE
        !          2918: .PP
        !          2919: The substatement is executed repeatedly
        !          2920: so long as the value of the
        !          2921: expression remains nonzero.
        !          2922: The test takes place before each execution of the
        !          2923: statement.
        !          2924: .NH 2 
        !          2925: Do Statement
        !          2926: .PP
        !          2927: The
        !          2928: .B
        !          2929: do
        !          2930: .R
        !          2931: statement has the form
        !          2932: .DS 
        !          2933: \fBdo \fIstatement  \fBwhile\fR\^ ( \fIexpression \fR\^) ;
        !          2934: .DE
        !          2935: .PP
        !          2936: The substatement is executed repeatedly until
        !          2937: the value of the expression becomes 0.
        !          2938: The test takes place after each execution of the
        !          2939: statement.
        !          2940: .NH 2 
        !          2941: For Statement
        !          2942: .PP
        !          2943: The
        !          2944: .B
        !          2945: for
        !          2946: .R
        !          2947: statement has the form:
        !          2948: .DS  
        !          2949: \fBfor\fI ( exp-1\v'0.5'\s-2opt\s0\v'-0.5' ; exp-2\v'0.5'\s-2opt\s0\v'-0.5' ; exp-3\v'0.5'\s-2opt\s0\v'-0.5' ) statement\fR
        !          2950: .DE
        !          2951: .PP
        !          2952: .sp
        !          2953: Except for the behavior of \fBcontinue\fR,
        !          2954: this statement is equivalent to
        !          2955: .DS 
        !          2956: \fIexp-1 \fR;
        !          2957: \fBwhile\fR\^ ( \fIexp-2\ ) \fR\^
        !          2958: {
        !          2959:         \fIstatement
        !          2960:         exp-3 ;\fR
        !          2961: }
        !          2962: .DE
        !          2963: .PP
        !          2964: Thus the first expression specifies initialization
        !          2965: for the loop; the second specifies
        !          2966: a test, made before each iteration, such
        !          2967: that the loop is exited when the expression becomes
        !          2968: 0.
        !          2969: The third expression often specifies an incrementing
        !          2970: that is performed after each iteration.
        !          2971: .PP
        !          2972: Any or all of the expressions may be dropped.
        !          2973: A missing
        !          2974: .I
        !          2975: exp-2
        !          2976: .R
        !          2977: makes the
        !          2978: implied
        !          2979: .B
        !          2980: while
        !          2981: .R
        !          2982: clause equivalent to
        !          2983: \fBwhile(1)\fR;
        !          2984: other missing expressions are simply
        !          2985: dropped from the expansion above.
        !          2986: .NH 2 
        !          2987: Switch Statement
        !          2988: .PP
        !          2989: The
        !          2990: .B
        !          2991: switch
        !          2992: .R
        !          2993: statement causes control to be transferred
        !          2994: to one of several statements depending on
        !          2995: the value of an expression.
        !          2996: It has the form
        !          2997: .DS 
        !          2998: \fBswitch\fR\^ ( \fIexpression\fR\^ ) \fIstatement\fR\^
        !          2999: .DE
        !          3000: .PP
        !          3001: The usual arithmetic conversion is performed on the
        !          3002: expression, but the result must be
        !          3003: .B
        !          3004: int\fR.
        !          3005: .R
        !          3006: The statement is typically compound.
        !          3007: Any statement within the statement
        !          3008: may be labeled with one or more case prefixes
        !          3009: as follows:
        !          3010: .DS 
        !          3011: \fBcase \fIconstant-expression \fR:
        !          3012: .DE
        !          3013: .LP
        !          3014: where the constant
        !          3015: expression
        !          3016: must be
        !          3017: .B
        !          3018: int\fR.
        !          3019: .R
        !          3020: No two of the case constants in the same switch
        !          3021: may have the same value.
        !          3022: Constant expressions are precisely defined in ``CONSTANT EXPRESSIONS.''
        !          3023: .PP
        !          3024: There may also be at most one statement prefix of the
        !          3025: form
        !          3026: .DS 
        !          3027: \fBdefault :\fR
        !          3028: .DE
        !          3029: .PP
        !          3030: When the
        !          3031: .B
        !          3032: switch
        !          3033: .R
        !          3034: statement is executed, its expression
        !          3035: is evaluated and compared with each case constant.
        !          3036: If one of the case constants is
        !          3037: equal to the value of the expression,
        !          3038: control is passed to the statement
        !          3039: following the matched case prefix.
        !          3040: If no case constant matches the expression
        !          3041: and if there is a
        !          3042: \fBdefault\fR,
        !          3043: prefix, control
        !          3044: passes to the prefixed
        !          3045: statement.
        !          3046: If no case matches and if there is no
        !          3047: \fBdefault\fR,
        !          3048: then
        !          3049: none of the statements in the
        !          3050: switch is executed.
        !          3051: .PP
        !          3052: The prefixes
        !          3053: .B
        !          3054: case
        !          3055: .R
        !          3056: and
        !          3057: .B
        !          3058: default
        !          3059: .R
        !          3060: do not alter the flow of control,
        !          3061: which continues unimpeded across such prefixes.
        !          3062: To exit from a switch, see
        !          3063: ``Break Statement.''
        !          3064: .PP
        !          3065: Usually, the statement that is the subject of a switch is compound.
        !          3066: Declarations may appear at the head of this
        !          3067: statement,
        !          3068: but
        !          3069: initializations of automatic or register variables
        !          3070: are ineffective.
        !          3071: .NH 2 
        !          3072: Break Statement
        !          3073: .PP
        !          3074: The statement
        !          3075: .DS 
        !          3076: \fBbreak ;\fR
        !          3077: .DE
        !          3078: .LP
        !          3079: causes termination of the smallest enclosing
        !          3080: \fBwhile\fR,
        !          3081: \fBdo\fR,
        !          3082: \fBfor\fR,
        !          3083: or
        !          3084: \fBswitch\fR
        !          3085: statement;
        !          3086: control passes to the
        !          3087: statement following the terminated statement.
        !          3088: .NH 2 
        !          3089: Continue Statement
        !          3090: .PP
        !          3091: The statement
        !          3092: .DS 
        !          3093: \fBcontinue ;\fR
        !          3094: .DE
        !          3095: .LP
        !          3096: causes control to pass to the loop-continuation portion of the
        !          3097: smallest enclosing
        !          3098: \fBwhile\fR,
        !          3099: \fBdo\fR,
        !          3100: or
        !          3101: \fBfor\fR
        !          3102: statement; that is to the end of the loop.
        !          3103: More precisely, in each of the statements
        !          3104: .DS 
        !          3105: .TS
        !          3106: lw(2i) lw(2i) lw(2i).
        !          3107: \fBwhile (\|.\|.\|.\|) {       do {    for (\|.\|.\|.\|) {\fR
        !          3108:      \fIstatement ;         statement ;             statement ;\fR
        !          3109:      \fBcontin: ;           contin: ;       contin: ;
        !          3110: }      } while (...);  }\fR
        !          3111: .TE
        !          3112: .DE
        !          3113: .LP
        !          3114: a
        !          3115: .B
        !          3116: continue
        !          3117: .R
        !          3118: is equivalent to
        !          3119: .B
        !          3120: goto\ contin\fR.
        !          3121: .R
        !          3122: (Following the
        !          3123: .B
        !          3124: contin:
        !          3125: .R
        !          3126: is a null statement, see ``Null Statement''.)
        !          3127: .NH 2 
        !          3128: Return Statement
        !          3129: .PP
        !          3130: A function returns to its caller by means of
        !          3131: the
        !          3132: .B
        !          3133: return
        !          3134: .R
        !          3135: statement which has one of the
        !          3136: forms
        !          3137: .DS 
        !          3138: \fBreturn ;
        !          3139: return \fIexpression \fR;
        !          3140: .DE
        !          3141: .PP
        !          3142: In the first case, the returned value is undefined.
        !          3143: In the second case, the value of the expression
        !          3144: is returned to the caller
        !          3145: of the function.
        !          3146: If required, the expression is converted,
        !          3147: as if by assignment, to the type of
        !          3148: function in which it appears.
        !          3149: Flowing off the end of a function is
        !          3150: equivalent to a return with no returned value.
        !          3151: The expression may be parenthesized.
        !          3152: .NH 2 
        !          3153: Goto Statement
        !          3154: .PP
        !          3155: Control may be transferred unconditionally by means of
        !          3156: the statement
        !          3157: .DS 
        !          3158: \fBgoto \fIidentifier \fR;
        !          3159: .DE
        !          3160: .PP
        !          3161: The identifier must be a label
        !          3162: (see ``Labeled Statement'')
        !          3163: located in the current function.
        !          3164: .NH 2 
        !          3165: Labeled Statement
        !          3166: .PP
        !          3167: Any statement may be preceded by
        !          3168: label prefixes of the form
        !          3169: .DS 
        !          3170: \fIidentifier \fR:
        !          3171: .DE
        !          3172: .LP
        !          3173: which serve to declare the identifier
        !          3174: as a label.
        !          3175: The only use of a label is as a target of a
        !          3176: .B
        !          3177: goto\fR.
        !          3178: .R
        !          3179: The scope of a label is the current function,
        !          3180: excluding any subblocks in which the same identifier has been redeclared.
        !          3181: See ``SCOPE RULES.''
        !          3182: .NH 2 
        !          3183: Null Statement
        !          3184: .PP
        !          3185: The null statement has the form
        !          3186: .DS
        !          3187:        \fB;\fR
        !          3188: .DE
        !          3189: .PP
        !          3190: A null statement is useful to carry a label just before the
        !          3191: .B
        !          3192: }
        !          3193: .R
        !          3194: of a compound statement or to supply a null
        !          3195: body to a looping statement such as
        !          3196: .B
        !          3197: while\fR.
        !          3198: .R
        !          3199: .NH 1 
        !          3200: External Definitions
        !          3201: .PP
        !          3202: A C program consists of a sequence of external definitions.
        !          3203: An external definition declares an identifier to
        !          3204: have storage class
        !          3205: .B
        !          3206: extern
        !          3207: .R
        !          3208: (by default)
        !          3209: or perhaps
        !          3210: \fBstatic\fR,
        !          3211: and
        !          3212: a specified type.
        !          3213: The type-specifier (see ``Type Specifiers'' in
        !          3214: ``DECLARATIONS'') may also be empty, in which
        !          3215: case the type is taken to be
        !          3216: .B
        !          3217: int\fR.
        !          3218: .R
        !          3219: The scope of external definitions persists to the end
        !          3220: of the file in which they are declared just as the effect
        !          3221: of declarations persists to the end of a block.
        !          3222: The syntax of external definitions is the same
        !          3223: as that of all declarations except that
        !          3224: only at this level may the code for functions be given.
        !          3225: .NH 2 
        !          3226: External Function Definitions
        !          3227: .PP
        !          3228: Function definitions have the form
        !          3229: .DS
        !          3230: \fIfunction-definition:
        !          3231:         decl-specifiers\v'0.5'\s-2opt\s0\v'-0.5' function-declarator function-body\fR
        !          3232: .DE
        !          3233: .PP
        !          3234: The only sc-specifiers
        !          3235: allowed
        !          3236: among the decl-specifiers
        !          3237: are
        !          3238: .B
        !          3239: extern
        !          3240: .R
        !          3241: or
        !          3242: \fBstatic\fR;
        !          3243: see ``Scope of Externals'' in 
        !          3244: ``SCOPE RULES'' for the distinction between them.
        !          3245: A function declarator is similar to a declarator
        !          3246: for a ``function returning .\|.\|.\|'' except that
        !          3247: it lists the formal parameters of
        !          3248: the function being defined.
        !          3249: .DS 
        !          3250: \fIfunction-declarator:
        !          3251:         declarator ( parameter-list\v'0.5'\s-2opt\s0\v'-0.5' )
        !          3252: .DE
        !          3253: .DS 
        !          3254: \fIparameter-list:
        !          3255:         identifier
        !          3256:         identifier , parameter-list\fR
        !          3257: .DE
        !          3258: .PP
        !          3259: The function-body
        !          3260: has the form
        !          3261: .DS 
        !          3262: \fIfunction-body:
        !          3263:         declaration-list\v'0.5'\s-2opt\s0\v'-0.5' compound-statement\fR
        !          3264: .DE
        !          3265: .PP
        !          3266: The identifiers in the parameter list, and only those identifiers,
        !          3267: may be declared in the declaration list.
        !          3268: Any identifiers whose type is not given are taken to be
        !          3269: .B
        !          3270: int\fR.
        !          3271: .R
        !          3272: The only storage class which may be specified is
        !          3273: \fBregister\fR;
        !          3274: if it is specified, the corresponding actual parameter
        !          3275: will be copied, if possible, into a register
        !          3276: at the outset of the function.
        !          3277: .PP
        !          3278: A simple example of a complete function definition is
        !          3279: .DS 
        !          3280: \fBint max(a, b, c)
        !          3281:         int a, b, c;
        !          3282: {
        !          3283:         int m;
        !          3284: .sp
        !          3285:         m = (a > b) ? a : b;
        !          3286:         return((m > c) ? m : c);
        !          3287: }\fR
        !          3288: .DE
        !          3289: .PP
        !          3290: Here
        !          3291: .B
        !          3292: int
        !          3293: .R
        !          3294: is the type-specifier;
        !          3295: .B
        !          3296: max(a,\ b,\ c)
        !          3297: .R
        !          3298: is the function-declarator;
        !          3299: .B
        !          3300: int\ a,\ b,\ c;
        !          3301: .R
        !          3302: is the declaration-list for
        !          3303: the formal
        !          3304: parameters;
        !          3305: \fB{\ ...\ }\fR
        !          3306: is the
        !          3307: block giving the code for the statement.
        !          3308: .PP
        !          3309: The C program converts all
        !          3310: .B
        !          3311: float
        !          3312: .R
        !          3313: actual parameters
        !          3314: to
        !          3315: \fBdouble\fR,
        !          3316: so formal parameters declared
        !          3317: .B
        !          3318: float
        !          3319: .R
        !          3320: have their declaration adjusted to read
        !          3321: .B
        !          3322: double\fR.
        !          3323: .R
        !          3324: All \fBchar\fR and \fBshort\fR formal parameter
        !          3325: declarations are similarly adjusted
        !          3326: to read \fBint\fR.
        !          3327: Also, since a reference to an array in any context
        !          3328: (in particular as an actual parameter)
        !          3329: is taken to mean
        !          3330: a pointer to the first element of the array,
        !          3331: declarations of formal parameters declared ``array of .\|.\|.\|''
        !          3332: are adjusted to read ``pointer to .\|.\|.\|.''
        !          3333: .NH 2 
        !          3334: External Data Definitions
        !          3335: .PP
        !          3336: An external data definition has the form
        !          3337: .DS 
        !          3338: \fIdata-definition:
        !          3339:         declaration\fR
        !          3340: .DE
        !          3341: .PP
        !          3342: The storage class of such data may be
        !          3343: .B
        !          3344: extern
        !          3345: .R
        !          3346: (which is the default)
        !          3347: or
        !          3348: .B
        !          3349: static 
        !          3350: .R
        !          3351: but not
        !          3352: .B
        !          3353: auto
        !          3354: .R
        !          3355: or
        !          3356: \fBregister\fR.
        !          3357: .NH 1 
        !          3358: Scope Rules
        !          3359: .PP
        !          3360: A C program need not all
        !          3361: be compiled at the same time. The source text of the
        !          3362: program
        !          3363: may be kept in several files, and precompiled
        !          3364: routines may be loaded from
        !          3365: libraries.
        !          3366: Communication among the functions of a program
        !          3367: may be carried out both through explicit calls
        !          3368: and through manipulation of external data.
        !          3369: .PP
        !          3370: Therefore, there are two kinds of scopes to consider:
        !          3371: first, what may be called the
        !          3372: .UL lexical
        !          3373: .UL scope
        !          3374: of an identifier, which is essentially the
        !          3375: region of a program during which it may
        !          3376: be used without drawing ``undefined identifier''
        !          3377: diagnostics;
        !          3378: and second, the scope
        !          3379: associated with external identifiers,
        !          3380: which is characterized by the rule
        !          3381: that references to the same external
        !          3382: identifier are references to the same object.
        !          3383: .NH 2 
        !          3384: Lexical Scope
        !          3385: .PP
        !          3386: The lexical scope of identifiers declared in external definitions
        !          3387: persists from the definition through
        !          3388: the end of the source file
        !          3389: in which they appear.
        !          3390: The lexical scope of identifiers which are formal parameters
        !          3391: persists through the function with which they are
        !          3392: associated.
        !          3393: The lexical scope of identifiers declared at the head of a block
        !          3394: persists until the end of the block.
        !          3395: The lexical scope of labels is the whole of the
        !          3396: function in which they appear.
        !          3397: .PP
        !          3398: In all cases, however,
        !          3399: if an identifier is explicitly declared at the head of a block,
        !          3400: including the block constituting a function,
        !          3401: any declaration of that identifier outside the block
        !          3402: is suspended until the end of the block.
        !          3403: .PP
        !          3404: Remember also (see ``Structure, Union, and Enumeration Declarations'' in
        !          3405: ``DECLARATIONS'') that tags, identifiers associated with
        !          3406: ordinary variables,
        !          3407: and identities associated with structure and union members
        !          3408: form three disjoint classes
        !          3409: which do not conflict.
        !          3410: Members and tags follow the same scope rules
        !          3411: as other identifiers.
        !          3412: The \fBenum\fR constants are in the same
        !          3413: class as ordinary variables and follow the same scope rules.
        !          3414: The
        !          3415: .B
        !          3416: typedef
        !          3417: .R
        !          3418: names are in the same class as ordinary identifiers.
        !          3419: They may be redeclared in inner blocks, but an explicit
        !          3420: type must be given in the inner declaration:
        !          3421: .DS 
        !          3422: \fBtypedef float distance;
        !          3423: \&...
        !          3424: {
        !          3425:      auto int distance;
        !          3426:      ...\fR
        !          3427: }
        !          3428: .DE
        !          3429: .PP
        !          3430: The
        !          3431: .B
        !          3432: int
        !          3433: .R
        !          3434: must be present in the second declaration,
        !          3435: or it would be taken to be
        !          3436: a declaration with no declarators and type
        !          3437: .B
        !          3438: distance\fR.
        !          3439: .R
        !          3440: .NH 2 
        !          3441: Scope of Externals
        !          3442: .PP
        !          3443: If a function refers to an identifier declared to be
        !          3444: \fBextern\fR,
        !          3445: then somewhere among the files or libraries
        !          3446: constituting the complete program
        !          3447: there must be at least one external definition
        !          3448: for the identifier.
        !          3449: All functions in a given program which refer to the same
        !          3450: external identifier refer to the same object,
        !          3451: so care must be taken that the type and size
        !          3452: specified in the definition
        !          3453: are compatible with those specified
        !          3454: by each function which references the data.
        !          3455: .PP
        !          3456: It is illegal to explicitly initialize any external
        !          3457: identifier more than once in the set of files and libraries
        !          3458: comprising a multi-file program.
        !          3459: It is legal to have more than one data definition
        !          3460: for any external non-function identifier;
        !          3461: explicit use of \fBextern\fR does not
        !          3462: change the meaning of an external declaration.
        !          3463: .PP
        !          3464: In restricted environments, the use of the \fBextern\fR
        !          3465: storage class takes on an additional meaning.
        !          3466: In these environments, the explicit appearance of the
        !          3467: \fBextern\fR keyword in external data declarations of
        !          3468: identities without initialization indicates that
        !          3469: the storage for the identifiers is allocated elsewhere,
        !          3470: either in this file or another file.
        !          3471: It is required that there be exactly one definition of
        !          3472: each external identifier (without \fBextern\fR)
        !          3473: in the set of files and libraries
        !          3474: comprising a mult-file program.
        !          3475: .PP
        !          3476: Identifiers declared
        !          3477: .B
        !          3478: static
        !          3479: .R
        !          3480: at the top level in external definitions
        !          3481: are not visible in other files.
        !          3482: Functions may be declared
        !          3483: .B
        !          3484: static\fR.
        !          3485: .R
        !          3486: .nr Hu 1
        !          3487: .NH 1 
        !          3488: Compiler Control Lines
        !          3489: .PP
        !          3490: The C compiler contains a preprocessor capable
        !          3491: of macro substitution, conditional compilation,
        !          3492: and inclusion of named files.
        !          3493: Lines beginning with
        !          3494: .B
        !          3495: #
        !          3496: .R
        !          3497: communicate
        !          3498: with this preprocessor.
        !          3499: There may be any number of blanks and horizontal tabs
        !          3500: between the \fB#\fR and the directive.
        !          3501: These lines have syntax independent of the rest of the language;
        !          3502: they may appear anywhere and have effect which lasts (independent of
        !          3503: scope) until the end of the source program file.
        !          3504: .nr Hu 1
        !          3505: .NH 2 
        !          3506: Token Replacement
        !          3507: .PP
        !          3508: A compiler-control line of the form
        !          3509: .DS 
        !          3510: \fB#define \fIidentifier token-string\v'0.5'\s-2opt\s0\v'-0.5'\fR
        !          3511: .DE
        !          3512: .LP
        !          3513: causes the preprocessor to replace subsequent instances
        !          3514: of the identifier with the given string of tokens.
        !          3515: Semicolons in or at the end of the token-string are part of that string.
        !          3516: A line of the form
        !          3517: .DS
        !          3518: \fB#define \fIidentifier(identifier, ... )token-string\v'0.5'\s-2opt\s0\v'-0.5'\fR
        !          3519: .DE
        !          3520: .LP
        !          3521: where there is no space between the first identifier
        !          3522: and the
        !          3523: \fB(\fR,
        !          3524: is a macro definition with arguments.
        !          3525: There may be zero or more formal parameters.
        !          3526: Subsequent instances of the first identifier followed
        !          3527: by a
        !          3528: \fB(\fR,
        !          3529: a sequence of tokens delimited by commas, and a
        !          3530: \fB)\fR
        !          3531: are replaced
        !          3532: by the token string in the definition.
        !          3533: Each occurrence of an identifier mentioned in the formal parameter list
        !          3534: of the definition is replaced by the corresponding token string from the call.
        !          3535: The actual arguments in the call are token strings separated by commas;
        !          3536: however, commas in quoted strings or protected by
        !          3537: parentheses do not separate arguments.
        !          3538: The number of formal and actual parameters must be the same.
        !          3539: Strings and character constants in the token-string are scanned
        !          3540: for formal parameters, but
        !          3541: strings and character constants in the rest of the program are
        !          3542: not scanned for defined identifiers
        !          3543: to replacement.
        !          3544: .PP
        !          3545: In both forms the replacement string is rescanned for more
        !          3546: defined identifiers.
        !          3547: In both forms
        !          3548: a long definition may be continued on another line
        !          3549: by writing
        !          3550: .B
        !          3551: \e
        !          3552: .R
        !          3553: at the end of the line to be continued.
        !          3554: .PP
        !          3555: This facility is most valuable for definition of ``manifest constants,''
        !          3556: as in
        !          3557: .DS 
        !          3558: \fB#define TABSIZE 100
        !          3559: .sp
        !          3560: int table\|[\|TABSIZE\|]\|;\fR
        !          3561: .DE
        !          3562: .PP
        !          3563: A control line of the form
        !          3564: .DS 
        !          3565: \fB#undef \fIidentifier\fR
        !          3566: .DE
        !          3567: .LP
        !          3568: causes the
        !          3569: identifier's preprocessor definition (if any) to be forgotten.
        !          3570: .PP
        !          3571: If a \fB#define\fRd identifier is the subject of a subsequent
        !          3572: \fB#define\fR with no intervening \fB#undef\fR, then
        !          3573: the two token-strings are compared textually.
        !          3574: If the two token-strings are not identical
        !          3575: (all white space is considered as equivalent), then
        !          3576: the identifier is considered to be redefined.
        !          3577: .nr Hu 1
        !          3578: .NH 2 
        !          3579: File Inclusion
        !          3580: .PP
        !          3581: A compiler control line of
        !          3582: the form
        !          3583: .DS 
        !          3584: \fB#include\fI "filename\|\fR"
        !          3585: .DE
        !          3586: .LP
        !          3587: causes the replacement of that
        !          3588: line by the entire contents of the file
        !          3589: .I
        !          3590: filename\fR.
        !          3591: .R
        !          3592: The named file is searched for first in the directory
        !          3593: of the file containing the \fB#include\fR,
        !          3594: and then in a sequence of specified or standard places.
        !          3595: Alternatively, a control line of the form
        !          3596: .DS 
        !          3597: \fB#include\fI <filename\|\fR>
        !          3598: .DE
        !          3599: .LP
        !          3600: searches only the specified or standard places
        !          3601: and not the directory of the \fB#include\fR.
        !          3602: (How the places are specified is not part of the language.)
        !          3603: .PP
        !          3604: \fB#include\fRs
        !          3605: may be nested.
        !          3606: .nr Hu 1
        !          3607: .NH 2 
        !          3608: Conditional Compilation
        !          3609: .PP
        !          3610: A compiler control line of the form
        !          3611: .DS 
        !          3612: \fB#if \fIrestricted-constant-expression\fR
        !          3613: .DE
        !          3614: .LP
        !          3615: checks whether the restricted-constant expression evaluates to nonzero.
        !          3616: (Constant expressions are discussed in ``CONSTANT EXPRESSIONS'';
        !          3617: the following additional restrictions apply here:
        !          3618: the constant expression may not contain
        !          3619: .B
        !          3620: sizeof
        !          3621: .R
        !          3622: casts, or an enumeration constant.)
        !          3623: .PP
        !          3624: A restricted constant expression may also contain the
        !          3625: additional unary expression
        !          3626: .PP
        !          3627: \fBdefined \fIidentifier\fR
        !          3628: .LP
        !          3629: or
        !          3630: .PP
        !          3631: \fBdefined( \fIidentifier )\fR
        !          3632: .LP
        !          3633: which evaluates to one if the identifier is currently
        !          3634: defined in the preprocessor and zero if it is not.
        !          3635: .PP
        !          3636: All currently defined identifiers in restricted-constant-expressions
        !          3637: are replaced by their token-strings (except those identifiers
        !          3638: modified by \fBdefined\fR) just as in normal text.
        !          3639: The restricted constant expression will be evaluated only
        !          3640: after all expressions have finished.
        !          3641: During this evaluation, all undefined (to the procedure)
        !          3642: identifiers evaluate to zero.
        !          3643: .PP
        !          3644: A control line of the form
        !          3645: .DS 
        !          3646: \fB#ifdef \fIidentifier\fR
        !          3647: .DE
        !          3648: .LP
        !          3649: checks whether the identifier is currently defined
        !          3650: in the preprocessor; i.e., whether it has been the
        !          3651: subject of a
        !          3652: .B
        !          3653: #define
        !          3654: .R
        !          3655: control line.
        !          3656: It is equivalent to \fB#ifdef(\fIidentifier\fB)\fR.
        !          3657: A control line of the form
        !          3658: .DS 
        !          3659: \fB#ifndef \fIidentifier\fR
        !          3660: .DE
        !          3661: .LP
        !          3662: checks whether the identifier is currently undefined
        !          3663: in the preprocessor.
        !          3664: It is equivalent to
        !          3665: .DS
        !          3666: \fB#if !\|defined(\fIidentifier\fB)\fR.
        !          3667: .DE
        !          3668: .PP
        !          3669: All three forms are followed by an arbitrary number of lines,
        !          3670: possibly containing a control line
        !          3671: .DS 
        !          3672: \fB#else\fR
        !          3673: .DE
        !          3674: .LP
        !          3675: and then by a control line
        !          3676: .DS 
        !          3677: \fB#endif\fR
        !          3678: .DE
        !          3679: .PP
        !          3680: If the checked condition is true,
        !          3681: then any lines
        !          3682: between
        !          3683: .B
        !          3684: #else
        !          3685: .R
        !          3686: and
        !          3687: .B
        !          3688: #endif
        !          3689: .R
        !          3690: are ignored.
        !          3691: If the checked condition is false, then any lines between
        !          3692: the test and a
        !          3693: .B
        !          3694: #else
        !          3695: .R
        !          3696: or, lacking a
        !          3697: \fB#else\fR,
        !          3698: the
        !          3699: .B
        !          3700: #endif 
        !          3701: .R
        !          3702: are ignored.
        !          3703: .PP
        !          3704: These constructions may be nested.
        !          3705: .nr Hu 1
        !          3706: .NH 2 
        !          3707: Line Control
        !          3708: .PP
        !          3709: For the benefit of other preprocessors which generate C programs,
        !          3710: a line of the form
        !          3711: .DS 
        !          3712: \fB#line \fIconstant "filename\fR"
        !          3713: .DE
        !          3714: .LP
        !          3715: causes the compiler to believe, for purposes of error
        !          3716: diagnostics,
        !          3717: that the line number of the next source line is given by the constant and the current input
        !          3718: file is named by "\fIfilename\fR".
        !          3719: If "\fIfilename\fR" is absent, the remembered file name does not change.
        !          3720: .nr Hu 1
        !          3721: .NH 1 
        !          3722: Implicit Declarations
        !          3723: .PP
        !          3724: It is not always necessary to specify
        !          3725: both the storage class and the type
        !          3726: of identifiers in a declaration.
        !          3727: The storage class is supplied by
        !          3728: the context in external definitions
        !          3729: and in declarations of formal parameters
        !          3730: and structure members.
        !          3731: In a declaration inside a function,
        !          3732: if a storage class but no type
        !          3733: is given, the identifier is assumed
        !          3734: to be
        !          3735: \fBint\fR;
        !          3736: if a type but no storage class is indicated,
        !          3737: the identifier is assumed to
        !          3738: be
        !          3739: .B
        !          3740: auto\fR.
        !          3741: .R
        !          3742: An exception to the latter rule is made for
        !          3743: functions because
        !          3744: .B
        !          3745: auto
        !          3746: .R
        !          3747: functions do not exist.
        !          3748: If the type of an identifier is ``function returning .\|.\|.\|,''
        !          3749: it is implicitly declared to be
        !          3750: .B
        !          3751: extern\fR.
        !          3752: .R
        !          3753: .PP
        !          3754: In an expression, an identifier
        !          3755: followed by
        !          3756: .B
        !          3757: (
        !          3758: .R
        !          3759: and not already declared
        !          3760: is contextually
        !          3761: declared to be ``function returning
        !          3762: .B
        !          3763: int\fR.''
        !          3764: .nr Hu 1
        !          3765: .NH 1 
        !          3766: Types Revisited
        !          3767: .PP
        !          3768: This part summarizes the operations
        !          3769: which can be performed on objects of certain types.
        !          3770: .nr Hu 1
        !          3771: .NH 2 
        !          3772: Structures and Unions
        !          3773: .PP
        !          3774: Structures and unions may be assigned, passed as arguments to functions,
        !          3775: and returned by functions.
        !          3776: Other plausible operators, such as equality comparison
        !          3777: and structure casts,
        !          3778: are not implemented.
        !          3779: .PP
        !          3780: In a reference
        !          3781: to a structure or union member, the
        !          3782: name on the right
        !          3783: of the \fB->\fR or the \fB.\fR
        !          3784: must specify a member of the aggregate
        !          3785: named or pointed to by the expression
        !          3786: on the left.
        !          3787: In general, a member of a union may not be inspected
        !          3788: unless the value of the union has been assigned using that same member.
        !          3789: However, one special guarantee is made by the language in order
        !          3790: to simplify the use of unions:
        !          3791: if a union contains several structures that share a common initial sequence
        !          3792: and if the union currently contains one of these structures,
        !          3793: it is permitted to inspect the common initial part of any of
        !          3794: the contained structures.
        !          3795: For example, the following is a legal fragment:
        !          3796: .DS 
        !          3797: \fBunion 
        !          3798: {
        !          3799:         struct 
        !          3800:         {
        !          3801:                 int        type;
        !          3802:         } n;
        !          3803:         struct 
        !          3804:         {
        !          3805:                 int        type;
        !          3806:                 int        intnode;
        !          3807:         } ni;
        !          3808:         struct 
        !          3809:         {
        !          3810:                 int        type;
        !          3811:                 float      floatnode;
        !          3812:         } nf;
        !          3813: } u;
        !          3814: \&...
        !          3815: u.nf.type = FLOAT;
        !          3816: u.nf.floatnode = 3.14;
        !          3817: \&...
        !          3818: if (u.n.type == FLOAT)
        !          3819:         ... sin(u.nf.floatnode) ...\fR
        !          3820: .DE
        !          3821: .PP
        !          3822: .nr Hu 1
        !          3823: .NH 2 
        !          3824: Functions
        !          3825: .PP
        !          3826: There are only two things that
        !          3827: can be done with a function \fBm\fR,
        !          3828: call it or take its address.
        !          3829: If the name of a function appears in an
        !          3830: expression not in the function-name position of a call,
        !          3831: a pointer to the function is generated.
        !          3832: Thus, to pass one function to another, one
        !          3833: might say
        !          3834: .DS 
        !          3835: \fBint f();
        !          3836: \&...
        !          3837: g(f);\fR
        !          3838: .DE
        !          3839: .PP
        !          3840: .ne 8
        !          3841: Then the definition of
        !          3842: .B
        !          3843: g
        !          3844: .R
        !          3845: might read
        !          3846: .DS 
        !          3847: \fBg(funcp)
        !          3848:         int (\(**funcp)();
        !          3849: {
        !          3850:         ...
        !          3851:         (\(**funcp)();
        !          3852:         ...
        !          3853: }\fR
        !          3854: .DE
        !          3855: .PP
        !          3856: Notice that
        !          3857: .B
        !          3858: f
        !          3859: .R
        !          3860: must be declared
        !          3861: explicitly in the calling routine since its appearance
        !          3862: in
        !          3863: .B
        !          3864: g(f)
        !          3865: .R
        !          3866: was not followed by
        !          3867: .B
        !          3868: (.
        !          3869: .R
        !          3870: .nr Hu 1
        !          3871: .NH 2 
        !          3872: Arrays, Pointers, and Subscripting
        !          3873: .PP
        !          3874: Every time an identifier of array type appears
        !          3875: in an expression, it is converted into a pointer
        !          3876: to the first member of the array.
        !          3877: Because of this conversion, arrays are not
        !          3878: lvalues.
        !          3879: By definition, the subscript operator
        !          3880: .B
        !          3881: []
        !          3882: .R
        !          3883: is interpreted
        !          3884: in such a way that
        !          3885: .B
        !          3886: E1[E2]
        !          3887: .R
        !          3888: is identical to
        !          3889: .B
        !          3890: \(**((E1)\(plE2))\fR.
        !          3891: .R
        !          3892: Because of the conversion rules
        !          3893: which apply to
        !          3894: \fB\(pl\fR,
        !          3895: if
        !          3896: .B
        !          3897: E1
        !          3898: .R
        !          3899: is an array and
        !          3900: .B
        !          3901: E2
        !          3902: .R
        !          3903: an integer,
        !          3904: then
        !          3905: .B
        !          3906: E1[E2]
        !          3907: .R
        !          3908: refers to the
        !          3909: .B
        !          3910: E2-th
        !          3911: .R
        !          3912: member of
        !          3913: .B
        !          3914: E1\fR.
        !          3915: .R
        !          3916: Therefore,
        !          3917: despite its asymmetric
        !          3918: appearance, subscripting is a commutative operation.
        !          3919: .PP
        !          3920: A consistent rule is followed in the case of
        !          3921: multidimensional arrays.
        !          3922: If
        !          3923: .B
        !          3924: E
        !          3925: .R
        !          3926: is an
        !          3927: \fIn\fR-dimensional
        !          3928: array
        !          3929: of rank
        !          3930: i\(muj\(mu...\(muk,
        !          3931: then
        !          3932: .B
        !          3933: E
        !          3934: .R
        !          3935: appearing in an expression is converted to
        !          3936: a pointer to an (n-1)-dimensional
        !          3937: array with rank
        !          3938: j\(mu...\(muk.
        !          3939: If the
        !          3940: .B
        !          3941: \(**
        !          3942: .R
        !          3943: operator, either explicitly
        !          3944: or implicitly as a result of subscripting,
        !          3945: is applied to this pointer,
        !          3946: the result is the pointed-to (n-1)-dimensional array,
        !          3947: which itself is immediately converted into a pointer.
        !          3948: .PP
        !          3949: For example, consider
        !          3950: .DS 
        !          3951: \fBint x[3][5];\fR
        !          3952: .DE
        !          3953: .PP
        !          3954: Here
        !          3955: .B
        !          3956: x
        !          3957: .R
        !          3958: is a 3\(mu5 array of integers.
        !          3959: When
        !          3960: .B
        !          3961: x
        !          3962: .R
        !          3963: appears in an expression, it is converted
        !          3964: to a pointer to (the first of three) 5-membered arrays of integers.
        !          3965: In the expression
        !          3966: \fBx[i]\fR,
        !          3967: which is equivalent to
        !          3968: \fB\(**(x\(pli)\fR,
        !          3969: .B
        !          3970: x
        !          3971: .R
        !          3972: is first converted to a pointer as described;
        !          3973: then
        !          3974: .B
        !          3975: i
        !          3976: .R
        !          3977: is converted to the type of
        !          3978: \fBx\fR,
        !          3979: which involves multiplying
        !          3980: .B
        !          3981: i
        !          3982: .R
        !          3983: by the
        !          3984: length the object to which the pointer points,
        !          3985: namely 5-integer objects.
        !          3986: The results are added and indirection applied to
        !          3987: yield an array (of five integers) which in turn is converted to
        !          3988: a pointer to the first of the integers.
        !          3989: If there is another subscript, the same argument applies
        !          3990: again; this time the result is an integer.
        !          3991: .PP
        !          3992: Arrays in C are stored
        !          3993: row-wise (last subscript varies fastest)
        !          3994: and the first subscript in the declaration helps determine
        !          3995: the amount of storage consumed by an array.
        !          3996: Arrays play no other part in subscript calculations.
        !          3997: .nr Hu 1
        !          3998: .NH 2 
        !          3999: Explicit Pointer Conversions
        !          4000: .PP
        !          4001: Certain conversions involving pointers are permitted
        !          4002: but have implementation-dependent aspects.
        !          4003: They are all specified by means of an explicit type-conversion
        !          4004: operator, see ``Unary Operators'' under``EXPRESSIONS'' and
        !          4005: ``Type Names''under ``DECLARATIONS.''
        !          4006: .PP
        !          4007: A pointer may be converted to any of the integral types large
        !          4008: enough to hold it.
        !          4009: Whether an
        !          4010: .B
        !          4011: int
        !          4012: .R
        !          4013: or
        !          4014: .B
        !          4015: long
        !          4016: .R
        !          4017: is required is machine dependent.
        !          4018: The mapping function is also machine dependent but is intended
        !          4019: to be unsurprising to those who know the addressing structure
        !          4020: of the machine.
        !          4021: Details for some particular machines are given below.
        !          4022: .PP
        !          4023: An object of integral type may be explicitly converted to a pointer.
        !          4024: The mapping always carries an integer converted from a pointer back to the same pointer
        !          4025: but is otherwise machine dependent.
        !          4026: .PP
        !          4027: A pointer to one type may be converted to a pointer to another type.
        !          4028: The resulting pointer may cause addressing exceptions
        !          4029: upon use if
        !          4030: the subject pointer does not refer to an object suitably aligned in storage.
        !          4031: It is guaranteed that
        !          4032: a pointer to an object of a given size may be converted to a pointer to an object
        !          4033: of a smaller size
        !          4034: and back again without change.
        !          4035: .PP
        !          4036: For example,
        !          4037: a storage-allocation routine
        !          4038: might accept a size (in bytes)
        !          4039: of an object to allocate, and return a
        !          4040: .B
        !          4041: char
        !          4042: .R
        !          4043: pointer;
        !          4044: it might be used in this way.
        !          4045: .DS 
        !          4046: \fBextern char \(**malloc();
        !          4047: double \(**dp;
        !          4048: .sp
        !          4049: dp = (double \(**) malloc(sizeof(double));
        !          4050: \(**dp = 22.0 / 7.0;\fR
        !          4051: .DE
        !          4052: .PP
        !          4053: The
        !          4054: .B
        !          4055: alloc
        !          4056: .R
        !          4057: must ensure (in a machine-dependent way)
        !          4058: that its return value is suitable for conversion to a pointer to
        !          4059: \fBdouble\fR;
        !          4060: then the
        !          4061: .I
        !          4062: use
        !          4063: .R
        !          4064: of the function is portable.
        !          4065: .PP
        !          4066: The pointer
        !          4067: representation on the
        !          4068: PDP-11
        !          4069: corresponds to a 16-bit integer and
        !          4070: measures bytes.
        !          4071: The
        !          4072: .B
        !          4073: char\fR's
        !          4074: have no alignment requirements; everything else must have an even address.
        !          4075: .PP
        !          4076: On the
        !          4077: VAX-11,
        !          4078: pointers are 32 bits long and measure bytes.
        !          4079: Elementary objects are aligned on a boundary equal to their
        !          4080: length, except that
        !          4081: .B
        !          4082: double
        !          4083: .R
        !          4084: quantities need be aligned only on even 4-byte boundaries.
        !          4085: Aggregates are aligned on the strictest boundary required by
        !          4086: any of their constituents.
        !          4087: .PP
        !          4088: The 3B 20 computer has 24-bit pointers placed into 32-bit quantities.
        !          4089: Most objects are
        !          4090: aligned on 4-byte boundaries. \fBShort\fRs are aligned in all cases on
        !          4091: 2-byte boundaries. Arrays of characters, all structures,
        !          4092: \fBint\fR\^s, \fBlong\fR\^s, \fBfloat\fR\^s, and \fBdouble\fR\^s are aligned on 4-byte
        !          4093: boundries; but structure members may be packed tighter.
        !          4094: .nr Hu 1
        !          4095: .NH 2
        !          4096: CONSTANT EXPRESSIONS
        !          4097: .PP
        !          4098: In several places C requires expressions that evaluate to
        !          4099: a constant:
        !          4100: after
        !          4101: \fBcase\fR,
        !          4102: as array bounds, and in initializers.
        !          4103: In the first two cases, the expression can
        !          4104: involve only integer constants, character constants,
        !          4105: casts to integral types,
        !          4106: enumeration constants,
        !          4107: and
        !          4108: .B
        !          4109: sizeof
        !          4110: .R
        !          4111: expressions, possibly
        !          4112: connected by the binary operators
        !          4113: .ne 10
        !          4114: .DS 
        !          4115: \(pl \(mi \(** / % & | ^ << >> == != < > <= >= && ||
        !          4116: .DE
        !          4117: .LP
        !          4118: or by the unary operators
        !          4119: .DS 
        !          4120: \(mi  \s+2~\s0
        !          4121: .DE
        !          4122: .LP
        !          4123: or by the ternary operator
        !          4124: .DS 
        !          4125: ?:
        !          4126: .DE
        !          4127: .PP
        !          4128: Parentheses can be used for grouping
        !          4129: but not for function calls.
        !          4130: .PP
        !          4131: More latitude is permitted for initializers;
        !          4132: besides constant expressions as discussed above,
        !          4133: one can also use floating constants
        !          4134: and arbitrary casts and
        !          4135: can also apply the unary
        !          4136: .B
        !          4137: &
        !          4138: .R
        !          4139: operator to external or static objects
        !          4140: and to external or static arrays subscripted
        !          4141: with a constant expression.
        !          4142: The unary
        !          4143: .B
        !          4144: &
        !          4145: .R
        !          4146: can also
        !          4147: be applied implicitly
        !          4148: by appearance of unsubscripted arrays and functions.
        !          4149: The basic rule is that initializers must
        !          4150: evaluate either to a constant or to the address
        !          4151: of a previously declared external or static object plus or minus a constant.
        !          4152: .nr Hu 1
        !          4153: .NH 1 
        !          4154: Portability Considerations
        !          4155: .PP
        !          4156: Certain parts of C are inherently machine dependent.
        !          4157: The following list of potential trouble spots
        !          4158: is not meant to be all-inclusive
        !          4159: but to point out the main ones.
        !          4160: .PP
        !          4161: Purely hardware issues like
        !          4162: word size and the properties of floating point arithmetic and integer division
        !          4163: have proven in practice to be not much of a problem.
        !          4164: Other facets of the hardware are reflected
        !          4165: in differing implementations.
        !          4166: Some of these,
        !          4167: particularly sign extension
        !          4168: (converting a negative character into a negative integer)
        !          4169: and the order in which bytes are placed in a word,
        !          4170: are nuisances that must be carefully watched.
        !          4171: Most of the others are only minor problems.
        !          4172: .PP
        !          4173: The number of
        !          4174: .B
        !          4175: register
        !          4176: .R
        !          4177: variables that can actually be placed in registers
        !          4178: varies from machine to machine
        !          4179: as does the set of valid types.
        !          4180: Nonetheless, the compilers all do things properly for their own machine;
        !          4181: excess or invalid
        !          4182: .B
        !          4183: register
        !          4184: .R
        !          4185: declarations are ignored.
        !          4186: .PP
        !          4187: Some difficulties arise only when
        !          4188: dubious coding practices are used.
        !          4189: It is exceedingly unwise to write programs
        !          4190: that depend
        !          4191: on any of these properties.
        !          4192: .PP
        !          4193: The order of evaluation of function arguments
        !          4194: is not specified by the language.
        !          4195: The order in which side effects take place
        !          4196: is also unspecified.
        !          4197: .PP
        !          4198: Since character constants are really objects of type
        !          4199: \fBint\fR,
        !          4200: multicharacter character constants may be permitted.
        !          4201: The specific implementation
        !          4202: is very machine dependent
        !          4203: because the order in which characters
        !          4204: are assigned to a word
        !          4205: varies from one machine to another.
        !          4206: .PP
        !          4207: Fields are assigned to words and characters to integers right to left
        !          4208: on some machines
        !          4209: and left to right on other machines.
        !          4210: These differences are invisible to isolated programs
        !          4211: that do not indulge in type punning (e.g.,
        !          4212: by converting an
        !          4213: .B
        !          4214: int
        !          4215: .R
        !          4216: pointer to a
        !          4217: .B
        !          4218: char
        !          4219: .R
        !          4220: pointer and inspecting the pointed-to storage)
        !          4221: but must be accounted for when conforming to externally-imposed
        !          4222: storage layouts.
        !          4223: .nr Hu 1
        !          4224: .NH 1 
        !          4225: Syntax Summary
        !          4226: .PP
        !          4227: This summary of C syntax is intended more for aiding comprehension
        !          4228: than as an exact statement of the language.
        !          4229: .nr Hu 1
        !          4230: .ne 18
        !          4231: .NH 2 
        !          4232: Expressions
        !          4233: .PP
        !          4234: The basic expressions are:
        !          4235: .tr ~~
        !          4236: .DS 
        !          4237:      \fIexpression:
        !          4238:              primary
        !          4239:              \(** expression\fR
        !          4240:              &\fIlvalue
        !          4241:              \(mi expression
        !          4242:              ! expression
        !          4243:              \s+2~\s0 expression
        !          4244:              \(pl\(pl lvalue
        !          4245:              \(mi\(milvalue
        !          4246:              lvalue \(pl\(pl
        !          4247:              lvalue \(mi\(mi
        !          4248:              \fBsizeof\fI expression
        !          4249:              \fBsizeof (\fItype-name\fB)\fI
        !          4250:              ( type-name ) expression
        !          4251:              expression binop expression
        !          4252:              expression ? expression : expression
        !          4253:              lvalue asgnop expression
        !          4254:              expression , expression
        !          4255: .DE
        !          4256: .DS 
        !          4257:      \fIprimary:
        !          4258:              identifier
        !          4259:              constant
        !          4260:              string
        !          4261:              ( expression )
        !          4262:              primary ( expression-list\v'0.5'\s-2opt\s0\v'-0.5' )
        !          4263:              primary [ expression ]
        !          4264:              primary . identifier
        !          4265:              primary \(mi identifier
        !          4266: .DE
        !          4267: .DS 
        !          4268:      \fIlvalue:
        !          4269:              identifier
        !          4270:              primary [ expression ]
        !          4271:              lvalue . identifier
        !          4272:              primary \(mi identifier
        !          4273:              \(** expression
        !          4274:              ( lvalue )\fR
        !          4275: .DE
        !          4276: .PP
        !          4277: .PP
        !          4278: The primary-expression operators
        !          4279: .DS 
        !          4280:      ()  []  .  \(mi
        !          4281: .tr ~~
        !          4282: .DE
        !          4283: .LP
        !          4284: have highest priority and group left to right.
        !          4285: The unary operators
        !          4286: .DS 
        !          4287:      \(**  &  \(mi  !  \s+2~\s0  \(pl\(pl \(mi\(mi \fBsizeof\fI   ( type-name \fR)
        !          4288: .DE
        !          4289: .LP
        !          4290: have priority below the primary operators
        !          4291: but higher than any binary operator
        !          4292: and group right to left.
        !          4293: Binary operators
        !          4294: group left to right; they have priority
        !          4295: decreasing
        !          4296: as indicated below.
        !          4297: .DS 
        !          4298:      \fIbinop:\fR
        !          4299:              \(**    /    %
        !          4300:              \(pl    \(mi
        !          4301:              >>   <<
        !          4302:              <    >    <=    >=
        !          4303:              ==   !=
        !          4304:              &
        !          4305:              ^
        !          4306:              |
        !          4307:              &&
        !          4308:              ||
        !          4309: .DE
        !          4310: The conditional operator groups right to left.
        !          4311: .PP
        !          4312: Assignment operators all have the same
        !          4313: priority and all group right to left.
        !          4314: .DS 
        !          4315:      \fIasgnop:\fR
        !          4316:              =  \(pl=  \(mi=  \(**=  /=  %=  >>=  <<=  &=  ^=  |=
        !          4317: .DE
        !          4318: .PP
        !          4319: The comma operator has the lowest priority and groups left to right.
        !          4320: .nr Hu 1
        !          4321: .NH 2 
        !          4322: Declarations
        !          4323: .PP
        !          4324: .DS 
        !          4325:      \fIdeclaration:
        !          4326:              decl-specifiers init-declarator-list\v'0.5'\s-2opt\s0\v'-0.5' ;
        !          4327: .DE
        !          4328: .DS 
        !          4329:      \fIdecl-specifiers:
        !          4330:              type-specifier decl-specifiers\v'0.5'\s-2opt\s0\v'-0.5'
        !          4331:              sc-specifier decl-specifiers\v'0.5'\s-2opt\s0\v'-0.5'
        !          4332: .DE
        !          4333: .DS 
        !          4334:      \fIsc-specifier:\fB
        !          4335:              auto
        !          4336:              static
        !          4337:              extern
        !          4338:              register
        !          4339:              typedef
        !          4340: .DE
        !          4341: .DS 
        !          4342:      \fItype-specifier:
        !          4343:              struct-or-union-specifier
        !          4344:              typedef-name
        !          4345:              enum-specifier
        !          4346:      basic-type-specifier:
        !          4347:              basic-type
        !          4348:              basic-type basic-type-specifiers
        !          4349:      basic-type:\fB
        !          4350:              char
        !          4351:              short
        !          4352:              int
        !          4353:              long
        !          4354:              unsigned
        !          4355:              float
        !          4356:              double
        !          4357:              void\fR
        !          4358: .DE
        !          4359: .DS 
        !          4360: \fIenum-specifier:\fB
        !          4361:              enum\fI { enum-list }\fB
        !          4362:              enum \fIidentifier { enum-list }\fB
        !          4363:              enum \fIidentifier
        !          4364: .DE
        !          4365: .DS 
        !          4366:      \fIenum-list:
        !          4367:              enumerator
        !          4368:              enum-list , enumerator
        !          4369: .DE
        !          4370: .DS 
        !          4371:      \fIenumerator:
        !          4372:              identifier
        !          4373:              identifier = constant-expression
        !          4374: .DE
        !          4375: .DS 
        !          4376:      \fIinit-declarator-list:
        !          4377:              init-declarator
        !          4378:              init-declarator , init-declarator-list
        !          4379: .DE
        !          4380: .DS 
        !          4381:      \fIinit-declarator:
        !          4382:              declarator initializer\v'0.5'\s-2opt\s0\v'-0.5'
        !          4383: .DE
        !          4384: .DS 
        !          4385:      \fIdeclarator:
        !          4386:              identifier
        !          4387:              ( declarator )
        !          4388:              \(** declarator
        !          4389:              declarator ()
        !          4390:              declarator [ constant-expression\v'0.5'\s-2opt\s0\v'-0.5' ]
        !          4391: .DE
        !          4392: .DS 
        !          4393:      \fIstruct-or-union-specifier:\fB
        !          4394:              struct\fI { struct-decl-list }\fB
        !          4395:              struct \fIidentifier { struct-decl-list }\fB
        !          4396:              struct \fIidentifier\fB
        !          4397:              union { \fIstruct-decl-list }\fB
        !          4398:              union \fIidentifier { struct-decl-list }\fB
        !          4399:              union \fIidentifier
        !          4400: .DE
        !          4401: .DS 
        !          4402:      \fIstruct-decl-list:
        !          4403:              struct-declaration
        !          4404:              struct-declaration struct-decl-list
        !          4405: .DE
        !          4406: .DS 
        !          4407:      \fIstruct-declaration:
        !          4408:              type-specifier struct-declarator-list ;
        !          4409: .DE
        !          4410: .DS 
        !          4411:      \fIstruct-declarator-list:
        !          4412:              struct-declarator
        !          4413:              struct-declarator , struct-declarator-list
        !          4414: .DE
        !          4415: .DS 
        !          4416:      \fIstruct-declarator:
        !          4417:              declarator
        !          4418:              declarator : constant-expression
        !          4419:              : constant-expression
        !          4420: .DE
        !          4421: .DS 
        !          4422:      \fIinitializer:
        !          4423:              = expression
        !          4424:              = { initializer-list }
        !          4425:              = { initializer-list , }
        !          4426: .DE
        !          4427: .DS 
        !          4428:      \fIinitializer-list:
        !          4429:              expression
        !          4430:              initializer-list , initializer-list
        !          4431:              { initializer-list }
        !          4432:              { initializer-list , }
        !          4433: .DE
        !          4434: .DS 
        !          4435:      \fItype-name:
        !          4436:              type-specifier abstract-declarator
        !          4437: .DE
        !          4438: .DS 
        !          4439:      \fIabstract-declarator:
        !          4440:              empty
        !          4441:              ( abstract-declarator )
        !          4442:              \(** abstract-declarator
        !          4443:              abstract-declarator ()
        !          4444:              abstract-declarator [ constant-expression\v'0.5'\s-2opt\s0\v'-0.5' ]
        !          4445: .DE
        !          4446: .DS 
        !          4447:      \fItypedef-name:
        !          4448:              identifier
        !          4449: .nr Hu 1
        !          4450: .DE
        !          4451: .NH 2 
        !          4452: Statements
        !          4453: .PP
        !          4454: .DS 
        !          4455:      \fIcompound-statement:
        !          4456:              { declaration-list\v'0.5'\s-2opt\s0\v'-0.5' statement-list\v'0.5'\s-2opt\s0\v'-0.5' }
        !          4457: .DE
        !          4458: .DS 
        !          4459:      \fIdeclaration-list:
        !          4460:              declaration
        !          4461:              declaration declaration-list
        !          4462: .DE
        !          4463: .DS 
        !          4464:      \fIstatement-list:
        !          4465:              statement
        !          4466:              statement statement-list
        !          4467: .DE
        !          4468: .DS  
        !          4469:      \fIstatement:
        !          4470:              compound-statement
        !          4471:              expression ;
        !          4472:              \fBif\fI ( expression ) statement
        !          4473:              \fBif\fI ( expression ) statement  \fBelse\fI statement
        !          4474:              \fBwhile\fI ( expression ) statement
        !          4475:              \fBdo\fI statement  \fBwhile\fI ( expression ) ;
        !          4476:              \fBfor\fI (exp\v'0.3'\s-2opt\s0\v'-0.3'\fB;\fIexp\v'0.3'\s-2opt\s0\v'-0.3'\fB;\fIexp\v'0.3'\s-2opt\s0\v'-0.3'\fI) statement
        !          4477:              \fBswitch\fI ( expression ) statement
        !          4478:              \fBcase\fI constant-expression :  statement
        !          4479:              \fBdefault\fI : statement
        !          4480:              \fBbreak ;
        !          4481:              continue ;
        !          4482:              return ;
        !          4483:              return\fI expression ;
        !          4484:              \fBgoto\fI identifier ;
        !          4485:              identifier : statement
        !          4486:              ;\fR
        !          4487: .nr Hu 1
        !          4488: .DE
        !          4489: .NH 2 
        !          4490: External definitions
        !          4491: .PP
        !          4492: .DS
        !          4493:      \fIprogram:
        !          4494:              external-definition
        !          4495:              external-definition program
        !          4496: .DE
        !          4497: .DS
        !          4498:      \fIexternal-definition:
        !          4499:              function-definition
        !          4500:              data-definition
        !          4501: .DE
        !          4502: .DS
        !          4503:      \fIfunction-definition:
        !          4504:              decl-specifier\v'0.5'\s-2opt\s0\v'-0.5' function-declarator function-body
        !          4505: .DE
        !          4506: .DS
        !          4507:      \fIfunction-declarator:
        !          4508:              declarator ( parameter-list\v'0.5'\s-2opt\s0\v'-0.5' )
        !          4509: .DE
        !          4510: .DS
        !          4511:      \fIparameter-list:
        !          4512:              identifier
        !          4513:              identifier , parameter-list
        !          4514: .DE
        !          4515: .DS
        !          4516:      \fIfunction-body:
        !          4517:              declaration-list\v'0.5'\s-2opt\s0\v'-0.5' compound-statement
        !          4518: .DE
        !          4519: .DS
        !          4520:      \fIdata-definition:
        !          4521:              \fBextern\fI declaration\fB ;
        !          4522:              \fBstatic\fI declaration\fB ;
        !          4523: .DE
        !          4524: .NH 
        !          4525: Preprocessor
        !          4526: .DS
        !          4527:              \fB#define\fI identifier token-string\v'0.3'\s-2opt\s0\v'-0.3'\fB
        !          4528:              \fB#define\fI identifier\fB(\fIidentifier\fB,...)\fItoken-string\v'0.5'\s-2opt\s0\v'-0.5'\fB
        !          4529:              \fB#undef\fI identifier\fB
        !          4530:              \fB#include "\fIfilename\|\fB"
        !          4531:              #include <\fIfilename\|\fB>
        !          4532:              \fB#if\fI restricted-constant-expression\fB
        !          4533:              \fB#ifdef\fI identifier\fB
        !          4534:              \fB#ifndef\fI identifier\fB
        !          4535:              \fB#else
        !          4536:              \fB#endif
        !          4537:              \fB#line\fI constant \fB"\fIfilename\|\fB"
        !          4538: .sp 5
        !          4539: .DE
        !          4540: .TC 2 1 3 0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.