Browse Source

(Primitive Types): Many cleanups.

Richard Stallman 2 years ago
parent
commit
778ce9a752
1 changed files with 70 additions and 56 deletions
  1. 70 56
      c.texi

+ 70 - 56
c.texi

@@ -1829,9 +1829,9 @@ Arithmetic operators in C attempt to be as similar as possible to the
 abstract arithmetic operations, but it is impossible to do this
 abstract arithmetic operations, but it is impossible to do this
 perfectly.  Numbers in a computer have a finite range of possible
 perfectly.  Numbers in a computer have a finite range of possible
 values, and non-integer values have a limit on their possible
 values, and non-integer values have a limit on their possible
-accuracy.  Nonetheless, in most cases you will encounter no surprises
-in using @samp{+} for addition, @samp{-} for subtraction, and @samp{*}
-for multiplication.
+accuracy.  Nonetheless, except when results are out of range, you will
+encounter no surprises in using @samp{+} for addition, @samp{-} for
+subtraction, and @samp{*} for multiplication.
 
 
 Each C operator has a @dfn{precedence}, which is its rank in the
 Each C operator has a @dfn{precedence}, which is its rank in the
 grammatical order of the various operators.  The operators with the
 grammatical order of the various operators.  The operators with the
@@ -2102,19 +2102,19 @@ But sometimes it matters precisely where the conversion occurs.
 
 
 If @code{i} and @code{j} are integers, @code{(i + j) * 2.0} adds them
 If @code{i} and @code{j} are integers, @code{(i + j) * 2.0} adds them
 as an integer, then converts the sum to floating point for the
 as an integer, then converts the sum to floating point for the
-multiplication.  If the addition gets an overflow, that is not
-equivalent to converting both integers to floating point and then
-adding them.  You can get the latter result by explicitly converting
-the integers, as in @code{((double) i + (double) j) * 2.0}.
-@xref{Explicit Type Conversion}.
+multiplication.  If the addition causes an overflow, that is not
+equivalent to converting each integer to floating point and then
+adding the two floating point numbers.  You can get the latter result
+by explicitly converting the integers, as in @code{((double) i +
+(double) j) * 2.0}.  @xref{Explicit Type Conversion}.
 
 
 @c Eggert's report
 @c Eggert's report
 Adding or multiplying several values, including some integers and some
 Adding or multiplying several values, including some integers and some
-floating point, does the operations left to right.  Thus, @code{3.0 +
+floating point, performs the operations left to right.  Thus, @code{3.0 +
 i + j} converts @code{i} to floating point, then adds 3.0, then
 i + j} converts @code{i} to floating point, then adds 3.0, then
 converts @code{j} to floating point and adds that.  You can specify a
 converts @code{j} to floating point and adds that.  You can specify a
 different order using parentheses: @code{3.0 + (i + j)} adds @code{i}
 different order using parentheses: @code{3.0 + (i + j)} adds @code{i}
-and @code{j} first and then adds that result (converting to floating
+and @code{j} first and then adds that sum (converted to floating
 point) to 3.0.  In this respect, C differs from other languages, such
 point) to 3.0.  In this respect, C differs from other languages, such
 as Fortran.
 as Fortran.
 
 
@@ -2271,7 +2271,7 @@ The left operand is the value to be shifted, and the right operand
 says how many bits to shift it (the @dfn{shift count}).  The left
 says how many bits to shift it (the @dfn{shift count}).  The left
 operand is promoted (@pxref{Operand Promotions}), so shifting never
 operand is promoted (@pxref{Operand Promotions}), so shifting never
 operates on a narrow integer type; it's always either @code{int} or
 operates on a narrow integer type; it's always either @code{int} or
-wider.  The value of the shift operator has the same type as the
+wider.  The result of the shift operation has the same type as the
 promoted left operand.
 promoted left operand.
 
 
 @menu
 @menu
@@ -2322,12 +2322,12 @@ number of bits gives machine-dependent results.
 @subsection Caveats for Shift Operations
 @subsection Caveats for Shift Operations
 
 
 @strong{Warning:} If the shift count is greater than or equal to the
 @strong{Warning:} If the shift count is greater than or equal to the
-width in bits of the first operand, the results are machine-dependent.
-Logically speaking, the ``correct'' value would be either -1 (for
-right shift of a negative number) or 0 (in all other cases), but what
-it really generates is whatever the machine's shift instruction does in
-that case.  So unless you can prove that the second operand is not too
-large, write code to check it at run time.
+width in bits of the promoted first operand, the results are
+machine-dependent.  Logically speaking, the ``correct'' value would be
+either @minus{}1 (for right shift of a negative number) or 0 (in all other
+cases), but the actual result is whatever the machine's shift
+instruction does in that case.  So unless you can prove that the
+second operand is not too large, write code to check it at run time.
 
 
 @strong{Warning:} Never rely on how the shift operators relate in
 @strong{Warning:} Never rely on how the shift operators relate in
 precedence to other arithmetic binary operators.  Programmers don't
 precedence to other arithmetic binary operators.  Programmers don't
@@ -3302,11 +3302,12 @@ on the left and one on the right.
 
 
 All the binary operators in C are syntactically left-associative.
 All the binary operators in C are syntactically left-associative.
 This means that @w{@code{a @var{op} b @var{op} c}} means @w{@code{(a
 This means that @w{@code{a @var{op} b @var{op} c}} means @w{@code{(a
-@var{op} b) @var{op} c}}.  However, you should only write repeated
-operators without parentheses using @samp{+}, @samp{-}, @samp{*} and
-@samp{/}, because those cases are clear from algebra.  So it is ok to
-write @code{a + b + c} or @code{a - b - c}, but never @code{a == b ==
-c} or @code{a % b % c}.
+@var{op} b) @var{op} c}}.  However, the only operators you should
+repeat in this way without parentheses are @samp{+}, @samp{-},
+@samp{*} and @samp{/}, because those cases are clear from algebra.  So
+it is ok to write @code{a + b + c} or @code{a - b - c}, but never
+@code{a == b == c} or @code{a % b % c}.  For those operators, use
+explicit parentheses to show how the operations nest.
 
 
 Each C operator has a @dfn{precedence}, which is its rank in the
 Each C operator has a @dfn{precedence}, which is its rank in the
 grammatical order of the various operators.  The operators with the
 grammatical order of the various operators.  The operators with the
@@ -3522,7 +3523,7 @@ carried out before calling the function.
 The ordering imposed by a sequence point applies locally to a limited
 The ordering imposed by a sequence point applies locally to a limited
 range of code, as stated above in each case.  For instance, the
 range of code, as stated above in each case.  For instance, the
 ordering imposed by the comma operator does not apply to code outside
 ordering imposed by the comma operator does not apply to code outside
-that comma operator.  Thus, in this code,
+the operands of that comma operator.  Thus, in this code,
 
 
 @example
 @example
 (x = 5, foo (x)) + x * x
 (x = 5, foo (x)) + x * x
@@ -3538,11 +3539,11 @@ them.
 @cindex postincrement and ordering
 @cindex postincrement and ordering
 @cindex ordering and postincrement
 @cindex ordering and postincrement
 
 
-Ordering requirements are loose with the postincrement and
-postdecrement operations (@pxref{Postincrement/Postdecrement}), which
-specify side effects to happen ``a little later.''  They must happen
-before the next sequence point, but that still leaves room for various
-meanings.  In this expression,
+The ordering requirements for the postincrement and postdecrement
+operations (@pxref{Postincrement/Postdecrement}) are loose: those side
+effects must happen ``a little later,'' before the next sequence
+point.  That still leaves room for various orders that give different
+results.  In this expression,
 
 
 @example
 @example
 z = x++ - foo ()
 z = x++ - foo ()
@@ -3561,11 +3562,16 @@ x = x++
 
 
 @noindent
 @noindent
 @code{x} will certainly be incremented but the incremented value may
 @code{x} will certainly be incremented but the incremented value may
-not stick.  If the incrementation of @code{x} happens after the
-assignment to @code{x}, the incremented value will remain in place.
-But if the incrementation happens first, the assignment will overwrite
-that with the not-yet-incremented value, so the expression as a whole
-will leave @code{x} unchanged.
+be replaced with the old value.  That's because the incrementation and
+the assignment may occur in either oder.  If the incrementation of
+@code{x} occurs after the assignment to @code{x}, the incremented
+value will remain in place.  But if the incrementation happens first,
+the assignment will put the not-yet-incremented value back into
+@code{x}, so the expression as a whole will leave @code{x} unchanged.
+
+The conclusion: @strong{avoid such expressions}.  Take care, when you
+use postincrement and postdecrement, that the specific expression you
+use is not ambiguous as to order of execution.
 
 
 @node Ordering of Operands
 @node Ordering of Operands
 @section Ordering of Operands
 @section Ordering of Operands
@@ -3583,14 +3589,15 @@ followed by the other.  Any side effects in the operand that's computed
 first are executed before the other operand is computed.
 first are executed before the other operand is computed.
 
 
 @item
 @item
-That applies to assignment operators too, except that in simple assignment
+That applies to assignment operators too, except that, in simple assignment,
 the previous value of the left operand is unused.
 the previous value of the left operand is unused.
 
 
 @item
 @item
 The arguments in a function call can be computed in any order, but
 The arguments in a function call can be computed in any order, but
 they can't be intermixed.  Thus, one argument is fully computed, then
 they can't be intermixed.  Thus, one argument is fully computed, then
-another, and so on until they are all done.  Any side effects in one argument
-are executed before computation of another argument begins.
+another, and so on until they have all been done.  Any side effects in
+one argument are executed before computation of another argument
+begins.
 @end itemize
 @end itemize
 
 
 These rules don't cover side effects caused by postincrement and
 These rules don't cover side effects caused by postincrement and
@@ -3598,11 +3605,11 @@ postdecrement operators---those can be deferred up to the next
 sequence point.
 sequence point.
 
 
 If you want to get pedantic, the fact is that GCC can reorder the
 If you want to get pedantic, the fact is that GCC can reorder the
-computations in many other ways provided that doesn't alter the result
-of running the program.  However, because they don't alter the result
-of running the program, they are negligible, unless you are concerned
+computations in many other ways provided that it doesn't alter the result
+of running the program.  However, because it doesn't alter the result
+of running the program, it is negligible, unless you are concerned
 with the values in certain variables at various times as seen by other
 with the values in certain variables at various times as seen by other
-processes.  In those cases, you can use @code{volatile} to prevent
+processes.  In those cases, you should use @code{volatile} to prevent
 optimizations that would make them behave strangely.  @xref{volatile}.
 optimizations that would make them behave strangely.  @xref{volatile}.
 
 
 @node Optimization and Ordering
 @node Optimization and Ordering
@@ -3694,8 +3701,8 @@ represent both positive and negative numbers, in a range spread almost
 equally on both sides of zero.
 equally on both sides of zero.
 
 
 Aside from signedness, the integer data types vary in size: how many
 Aside from signedness, the integer data types vary in size: how many
-bytes long they are.  The size determines how many different integer
-values the type can hold.
+bytes long they are.  The size determines the range of integer values
+the type can hold.
 
 
 Here's a list of the signed integer data types, with the sizes they
 Here's a list of the signed integer data types, with the sizes they
 have on most computers.  Each has a corresponding unsigned type; see
 have on most computers.  Each has a corresponding unsigned type; see
@@ -3704,7 +3711,8 @@ have on most computers.  Each has a corresponding unsigned type; see
 @table @code
 @table @code
 @item signed char
 @item signed char
 One byte (8 bits).  This integer type is used mainly for integers that
 One byte (8 bits).  This integer type is used mainly for integers that
-represent characters, as part of arrays or other data structures.
+represent characters, usually as elements of arrays or fields of other
+data structures.
 
 
 @item short
 @item short
 @itemx short int
 @itemx short int
@@ -3775,8 +3783,8 @@ In particular, if the value is really a character, you should declare
 the variable @code{int}.  Not @code{char}!  Using that narrow type can
 the variable @code{int}.  Not @code{char}!  Using that narrow type can
 force the compiler to truncate values for conversion, which is a
 force the compiler to truncate values for conversion, which is a
 waste.  Furthermore, some functions return either a character value,
 waste.  Furthermore, some functions return either a character value,
-or @minus{}1 for ``no character.''  Using @code{int} keeps those
-values distinct.
+or @minus{}1 for ``no character.''  Using @code{int} makes it possible
+to distinguish @minus{}1 from a character by sign.
 
 
 The narrow integer types are useful as parts of other objects, such as
 The narrow integer types are useful as parts of other objects, such as
 arrays and structures.  Compare these array declarations, whose sizes
 arrays and structures.  Compare these array declarations, whose sizes
@@ -3867,10 +3875,11 @@ given previously (@pxref{Basic Integers}).
 
 
 To be completely sure of the size of an integer type,
 To be completely sure of the size of an integer type,
 use the types @code{int16_t}, @code{int32_t} and @code{int64_t}.
 use the types @code{int16_t}, @code{int32_t} and @code{int64_t}.
-Their corresponding unsigned types add @samp{u} at the front.
-To define these, include the header file @file{stdint.h}.
+Their corresponding unsigned types add @samp{u} at the front:
+@code{uint16_t}, @code{uint32_t} and @code{uint64_t}.
+To define all these types, include the header file @file{stdint.h}.
 
 
-The GNU C Compiler compiles for some embedded controllers that use two
+The GNU C Compiler can compile for some embedded controllers that use two
 bytes for @code{int}.  On some, @code{int} is just one ``byte,'' and
 bytes for @code{int}.  On some, @code{int} is just one ``byte,'' and
 so is @code{short int}---but that ``byte'' may contain 16 bits or even
 so is @code{short int}---but that ``byte'' may contain 16 bits or even
 32 bits.  These processors can't support an ordinary operating system
 32 bits.  These processors can't support an ordinary operating system
@@ -3886,8 +3895,11 @@ programs do not try to support them.
 @findex long double
 @findex long double
 
 
 @dfn{Floating point} is the binary analogue of scientific notation:
 @dfn{Floating point} is the binary analogue of scientific notation:
-internally it represents a number as a fraction and a binary exponent; the
-value is that fraction multiplied by the specified power of 2.
+internally it represents a number as a fraction and a binary exponent;
+the value is that fraction multiplied by the specified power of 2.
+(The C standard nominally permits other bases, but in GNU C the base
+is always 2.)
+@c ???
 
 
 For instance, to represent 6, the fraction would be 0.75 and the
 For instance, to represent 6, the fraction would be 0.75 and the
 exponent would be 3; together they stand for the value @math{0.75 * 2@sup{3}},
 exponent would be 3; together they stand for the value @math{0.75 * 2@sup{3}},
@@ -4025,8 +4037,9 @@ print_if_positive (double x, double y)
 @}
 @}
 @end example
 @end example
 
 
-A @code{void}-returning function is comparable to what some other languages
-call a ``procedure'' instead of a ``function.''
+A @code{void}-returning function is comparable to what some other
+languages (for instance, Fortran and Pascal) call a ``procedure''
+instead of a ``function.''
 
 
 @c ??? Already presented
 @c ??? Already presented
 @c @samp{%f} in an output template specifies to format a @code{double} value
 @c @samp{%f} in an output template specifies to format a @code{double} value
@@ -4039,9 +4052,10 @@ Beyond the primitive types, C provides several ways to construct new
 data types.  For instance, you can define @dfn{pointers}, values that
 data types.  For instance, you can define @dfn{pointers}, values that
 represent the addresses of other data (@pxref{Pointers}).  You can
 represent the addresses of other data (@pxref{Pointers}).  You can
 define @dfn{structures}, as in many other languages
 define @dfn{structures}, as in many other languages
-(@pxref{Structures}), and @dfn{unions}, which specify multiple ways
-to look at the same memory space (@pxref{Unions}).  @dfn{Enumerations}
-are collections of named integer codes (@pxref{Enumeration Types}).
+(@pxref{Structures}), and @dfn{unions}, which define multiple ways to
+interpret the contents of the same memory space (@pxref{Unions}).
+@dfn{Enumerations} are collections of named integer codes
+(@pxref{Enumeration Types}).
 
 
 @dfn{Array types} in C are used for allocating space for objects,
 @dfn{Array types} in C are used for allocating space for objects,
 but C does not permit operating on an array value as a whole.  @xref{Arrays}.
 but C does not permit operating on an array value as a whole.  @xref{Arrays}.
@@ -4053,7 +4067,7 @@ but C does not permit operating on an array value as a whole.  @xref{Arrays}.
 Some C constructs require a way to designate a specific data type
 Some C constructs require a way to designate a specific data type
 independent of any particular variable or expression which has that
 independent of any particular variable or expression which has that
 type.  The way to do this is with a @dfn{type designator}.  The
 type.  The way to do this is with a @dfn{type designator}.  The
-constucts that need one include casts (@pxref{Explicit Type
+constructs that need one include casts (@pxref{Explicit Type
 Conversion}) and @code{sizeof} (@pxref{Type Size}).
 Conversion}) and @code{sizeof} (@pxref{Type Size}).
 
 
 We also use type designators to talk about the type of a value in C,
 We also use type designators to talk about the type of a value in C,