fix article
This commit is contained in:
parent
d59fd50600
commit
a13fbc7d6d
@ -48,38 +48,56 @@ This page documents those incompatibilities and relative oddities.
|
||||
I have never done (and probably never will do) extensive programming in pre-ANSI C.
|
||||
These incompatibilities were discovered out of Appendix C in <I>The C Programming Language, 2nd ed.</I> but are described further.
|
||||
</P>
|
||||
<!--<H2 ID="octal89"><CODE>8</CODE> and <CODE>9</CODE> as valid octal digits</H2>
|
||||
<H2 ID="octal89"><CODE>8</CODE> and <CODE>9</CODE> as valid octal digits</H2>
|
||||
<UL>
|
||||
<LI><A HREF="https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/c">UNIX V6 C compiler source directory</A></LI>
|
||||
</UL>
|
||||
<PRE>
|
||||
main()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 10; ++i)
|
||||
printf("%c\t%o\n", i + '0', i);
|
||||
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",
|
||||
00, 01, 02, 03, 04, 05, 06, 07, 08, 09
|
||||
);
|
||||
}
|
||||
</PRE>
|
||||
<P>
|
||||
In pre-ANSI C, <CODE>8</CODE> and <CODE>9</CODE> were valid octal digits corresponding to <CODE>10</CODE> and <CODE>11</CODE>.
|
||||
On my machine, the GNU C compiler emits the following errors (this omits warnings) for the preceding piece of code:
|
||||
</P>
|
||||
<PRE>
|
||||
snippet.c:4:49: error: invalid digit "8" in octal constant
|
||||
4 | 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
|
||||
| ^~
|
||||
snippet.c:4:53: error: invalid digit "9" in octal constant
|
||||
4 | 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
|
||||
| ^~
|
||||
</PRE>
|
||||
<P>
|
||||
This is because in C (both pre-standardization and post-ANSI) integer constants with leading zeroes are parsed as octal (base 8) numbers.
|
||||
In pre-ANSI C, <CODE>8</CODE> and <CODE>9</CODE> were valid octal digits corresponding to <CODE>010</CODE>(b8) and <CODE>11</CODE>(0b8).
|
||||
This is documented in <I>The C Programming Language</I>, Appendix A, subsection 2.4.1, and evidenced by the preceding code block.
|
||||
The following is output of the compiled program in UNIX V6 on an emulated PDP-11:
|
||||
</P>
|
||||
<PRE>
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 10
|
||||
9 11
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
</PRE>
|
||||
<P>
|
||||
This behavior exists within <CODE>/usr/source/c/c0t.s</CODE>, which is a PDP-11 assembler file that parses integer constants (as far as I can tell).
|
||||
This file provides <CODE>getnum</CODE>, a function used in <CODE>/usr/source/c/c00.c</CODE>.
|
||||
My theory is that this behavior is a side-effect of a very efficient but imperfect method of parsing integer constants from a file stream,
|
||||
and that this implementation was "good enough" and informally the behavior of a C compiler supplied invalid octal constants was just undefined.
|
||||
My theory is that this behavior is a side-effect of a very efficient but imperfect method of parsing integer constants from a file stream.
|
||||
</P>
|
||||
<P>
|
||||
This wouldn't be a significant or even noticeable error; most programmers wouldn't use <CODE>8</CODE> or <CODE>9</CODE> as octal digits anyway.
|
||||
If not for its documentation within <I>The C Programming Language</I> it would probably be an obscure bug.
|
||||
This is also mentioned in <I>The C Programming Language, 2nd ed.</I> in Appendix C.
|
||||
</P>
|
||||
-->
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
Loading…
Reference in New Issue
Block a user