Research V6 development
[unix-history] / usr / doc / c / ca
CommitLineData
36fd3432
DR
1.pn 26
2.fp 3 G
3'tr ^\|
4'hc $
5'tr @
6'll 6.5i
7'ps 10
8.ds op \s6\d\fIopt\fP\u\s10
9.ds * \fR\v'.2'*\fP\v'-.2'
10.ds ~ \v'.5'\s14~\s10\v'-.5'
11'vs 11p
12.de pg
13.sp .4
14.ti 1
15..
16.de et
17.sp .2
18.ft R
19.ti 1
20..
21.de dp
22.sp .7
23.ne \\$1
24.ft I
25.nf
26..
27.de ed
28.fi
29.br
30.ft R
31..
32.de ul
33.sp 1.5
34.ne 4
35.ft G
36..
37.de ms
38.sp 1
39.ne 4
40..
41.de fo
42'bp
43..
44.de he
45.po 0
46.tl '-'''
47.po
48'sp 0.5i
49.ft I
50.if o .tl '''C Reference Manual - %'
51.if e .tl 'C Reference Manual - %'''
52.ft
53'sp 0.4i
54..
55.de bG
56.br
57.fp 3 G
58.ft G
59..
60.de eG
61.br
62.ft R
63..
64.de it
65.ft I
66\\$1
67.ft R
68..
69.de bd
70.ft G
71\\$1
72.ft R
73..
74.de se
75.br
76.ft I
77..
78.wh 0 he
79.wh -1i fo
80.sp 2
81.ce
82REFERENCES
83.sp 1.5
84.ta 2
85.tc @
86.in 2
87.ti 0
881. Johnson, S. C., and Kernighan, B. W.
89``The Programming Language B.'' Comp. Sci. Tech. Rep. #8., Bell Laboratories,
901972.
91.sp .6
92.ti 0
932. Ritchie, D. M., and Thompson, K. L.
94``The \s8UNIX\s10 Time-sharing System.''
95C. ACM \fG7, \fR17, July, 1974, pp. 365-375.
96.sp .6
97.ti 0
983. Peterson, T. G., and Lesk, M. E.
99``A User's Guide to the C Language on the IBM 370.''
100Internal Memorandum, Bell Laboratories, 1974.
101.sp .6
102.ti 0
1034. Thompson, K. L., and Ritchie, D. M.
104.ft I
105\s8UNIX\s10 Programmer's Manual.
106.ft R
107Bell Laboratories, 1973.
108.sp .7
109.ti 0
1105. Lesk, M. E., and Barres, B. A.
111``The \s8GCOS\s10 C Library.''
112Internal memorandum, Bell Laboratories,
1131974.
114.sp .7
115.to 0
116.ti 0
1176. Kernighan, B. W. ``Programming in C\(mi A Tutorial.''
118Unpublished internal memorandum,
119Bell Laboratories, 1974.
120.in 0
121.bp
122.sp 1.5
123.ce 2
124APPENDIX 1
125.sp .3
126Syntax Summary
127.sp 1.5
128.ta .5i 1i 1.5i 2i 2.5i
129.in 3
1301. Expressions.
131.sp 1
132.dp 4
133 expression:
134 primary
135 \**\fI expression
136 \fG&\fI expression
137 \fG\(mi\fI expression
138 \fG!\fI expression
139 \*~ expression
140 \fR++\fI lvalue
141 \fR\(mi\(mi\fI lvalue
142 lvalue \fR++\fI
143 lvalue \fR\(mi\(mi\fI
144 \fGsizeof \fIexpression
145 expression binop expression
146 expression \fG?\fI expression \fG:\fI expression
147 lvalue asgnop expression
148 expression \fG,\fI expression
149.ed
150.dp 6
151 primary:
152 identifier
153 constant
154 string
155 \fG( \fIexpression \fG)\fI
156 \fIprimary \fG( \fIexpression-list\*(op \fG)\fI
157 primary \fG[\fI expression \fG]\fI
158 lvalue \fG. \fIidentifier
159 primary \fG\(em> \fIidentifier
160.ed
161.dp 2
162 lvalue:
163 identifier
164 primary \fG[ \fIexpression \fG]\fI
165 lvalue \fG. \fIidentifier
166 primary \fG\(em>\fI identifier
167 \** \fI expression
168 \fG( \fIlvalue \fG)\fR
169.ed
170.fi
171.sp .7
172The primary-expression operators
173.dp
174.ft G
175 (^) [^] . \(em>
176.sp .5
177.ed
178have highest priority and group left-to-right.
179The unary operators
180.dp
181.ft G
182 \* & \(mi ! \*~ \fR++ \(mi\(mi \fGsizeof
183.ed
184.sp .5
185have priority below the primary operators
186but higher than any binary operator,
187and group right-to-left.
188Binary operators and the conditional operator
189all group left-to-right, and have priority
190decreasing
191as indicated:
192.dp
193.ft I
194 binop:
195.ft G
196 \** / %
197 + \(mi
198 >> <<
199 < > <= >=
200 == !=
201 &
202.tr ^^
203 ^
204.tr ^\|
205 \(or
206 &&
207 \(or\(or
208 ? :
209.tr ^^
210.sp .4
211.fi
212.ft R
213Assignment operators all have the same
214priority, and all group right-to-left.
215.dp 3
216.ft I
217 asgnop:
218.ft G
219 = =+ =\(mi =\** =/ =% =>> =<< =& =^ =\(or
220.ed
221.tr ^\|
222.sp .4
223.ft R
224The comma operator has the lowest priority, and groups left-to-right.
225.sp .7
2262. Declarations.
227.dp 2
228 declaration:
229 decl-specifiers declarator-list\*(op \fG;
230.ed
231.dp 5
232 decl-specifiers:
233 type-specifier
234 sc-specifier
235 type-specifier sc-specifier
236 sc-specifier type-specifier
237.ed
238.dp 4
239 sc-specifier:
240.ft G
241 auto
242 static
243 extern
244 register
245.ed
246.dp 6
247 type-specifier:
248 \fGint
249 \fGchar
250 \fGfloat
251 \fGdouble
252 struct { \fItype-decl-list }\fG
253 struct \fIidentifier { type-decl-list }\fG
254 struct \fIidentifier\fG
255.ed
256.dp 2
257 declarator-list:
258 declarator
259 declarator \fG,\fI declarator-list
260.ed
261.dp 6
262 declarator:
263 identifier
264 \** \fIdeclarator
265 declarator \fG( )\fI
266 declarator \fG[\fI constant-expression\*(op \fG]\fI
267 \fG( \fIdeclarator \fG)
268.ed
269.dp 2
270 type-decl-list:
271 type-declaration
272 type-declaration type-decl-list
273.ed
274.dp 2
275 type-declaration:
276 type-specifier declarator-list \fG;
277.ed
278.sp 1.5
2793. Statements.
280.dp 1
281 statement:
282 expression \fG;
283.se
284 { \fIstatement-list }
285.se
286 \fGif ( \fIexpression \fG) \fIstatement
287.se
288 \fGif ( \fI expression \fG) \fIstatement \fGelse \fIstatement
289.se
290 \fGwhile ( \fIexpression \fG) \fIstatement
291.se
292 \fGfor ( \fIexpression\*(op \fG; \fIexpression\*(op \fG; \fIexpression\*(op \fG) statement
293.se
294 \fGswitch ( \fIexpression \fG) \fIstatement
295.se
296 \fGcase \fIconstant-expression \fG:\fI statement
297.se
298 \fGdefault : \fIstatement
299.se
300 \fGbreak ;
301.se
302 \fGcontinue ;
303.se
304.ft G
305 return ;
306.se
307.ft G
308 return ( \fIexpression \fG) ;
309.se
310.ft G
311 goto \fIexpression \fG;
312.se
313 \fIidentifier \fG: \fIstatement
314.se
315 \fG;
316.ed
317.dp 2
318 statement-list:
319 statement
320 statement statement-list
321.sp 1.5
322.ft R
3234. External definitions.
324.dp 2
325 program:
326 external-definition
327 external-definition program
328.dp 2
329 external-definition:
330 function-definition
331 data-definition
332.ed
333.dp 2
334 function-definition:
335 type-specifier\*(op \fIfunction-declarator function-body
336.ed
337.dp 2
338 function-declarator:
339 declarator \fG( \fI parameter-list\*(op \fG)
340.ed
341.dp 1
342 parameter-list:
343 identifier
344 identifier \fG,\fI parameter-list
345.ed
346.dp 1
347 function-body:
348 type-decl-list function-statement
349.ed
350.dp 2
351 function-statement:
352 { declaration-list\*(op statement-list }
353.ed
354.dp 2
355 data-definition:
356 \fGextern\fI\*(op type-specifier\*(op init-declarator-list\*(op \fG;
357.ed
358.dp 2
359 init-declarator-list:
360 init-declarator
361 init-declarator \fG,\fI init-declarator-list
362.ed
363.dp 2
364 init-declarator:
365 declarator initializer\*(op
366.ed
367.dp 5
368 initializer:
369 constant
370 { constant-expression-list }
371.ed
372.dp 5
373 constant-expression-list:
374 constant-expression
375 constant-expression \fG,\fI constant-expression-list
376.ed
377.dp 2
378 constant-expression:
379 expression
380.ed
381.sp .4
3825. Preprocessor
383.dp 1
384 \fG# define \fIidentifier token-string
385.ed
386.dp 1
387 \fG# include "\fIfilename^\fG"
388.ed
389.in 0
390.bp
391.ds s \\s8
392.ds n \\s10
393.ft R
394.fi
395.sp 1
396.ce 2
397APPENDIX 2
398Implementation Peculiarities
399.sp 2
400This Appendix briefly summarizes the differences between the implementations
401of C on the \*sPDP\*n-11 under \*sUNIX\*n and on the
402\*sHIS\*n 6070 under \*sGCOS\*n;
403it includes some known bugs
404in each implementation.
405Each entry is keyed by an indicator as follows:
406.sp
407.ta .4i .8i
408.nf
409 h hard to fix
410 g \*sGCOS\*n version should probably be changed
411 u \*sUNIX\*n version should probably be changed
412 d Inherent difference likely to remain
413.sp
414.fi
415This list was prepared by M. E. Lesk, S. C. Johnson,
416E. N. Pinson, and the author.
417.sp 2
418.fi
419.ta .4i 1.2i
420.in 1.2i
421.ti0
422.ft I
423A. Bugs or differences from C language specifications
424.ft R
425.sp
426.ti0
427hg A.1) \*sGCOS\*n does not do type conversions in ``?:''.
428.ti0
429hg A.2) \*sGCOS\*n has a bug in \fGint\fR and \fGreal\fR comparisons; the numbers
430are compared by subtraction, and the difference must not overflow.
431.ti 0
432g A.3) When \fIx\fR is a \fGfloat\fR, the construction ``test ? \(mix : x''
433is illegal on \*sGCOS\*n.
434.ti0
435hg A.4) ``p1\(mi>p2 =+ 2'' causes a compiler error, where p1 and p2 are pointers.
436.ti0
437u A.5) On \*sUNIX\*n, the expression in a \fGreturn\fR statement is \fInot\fR
438converted to the type of the function, as promised.
439.ti0
440hug A.6) \fGentry\fR statement is not implemented at all.
441.sp
442.ne 5
443.ft I
444.ti0
445.ft I
446B. Implementation differences
447.ft R
448.sp
449.ti0
450d B.1) Sizes of character constants differ; \*sUNIX\*n: 2, \*sGCOS\*n: 4.
451.ti0
452d B.2) Table sizes in compilers differ.
453.ti0
454d B.3) \fGchar\fRs and \fGint\fRs have different sizes;
455\fGchar\fRs are 8 bits on \*sUNIX\*n, 9 on \*sGCOS\*n; words are 16 bits
456on \*sUNIX\*n and 36 on \*sGCOS\*n.
457There are corresponding differences in representations of
458\fGfloat\fRs and \fGdouble\fRs.
459.ti0
460d B.4) Character arrays stored left to right in a word
461in \*sGCOS\*n, right to left in \*sUNIX\*n.
462.ti0
463g B.5) Passing of floats and doubles differs;
464\*sUNIX\*n passes on stack, \*sGCOS\*n passes pointer (hidden to normal user).
465.ti0
466g B.6) Structures and strings are aligned on a word
467boundary in \*sUNIX\*n, not aligned in \*sGCOS\*n.
468.ti0
469g B.7) \*sGCOS\*n preprocessor supports #rename, #escape;
470\*sUNIX\*n has only #define, #include.
471.ti0
472u B.8) Preprocessor is not invoked on \*sUNIX\*n unless first
473character of file is ``#''.
474.ti0
475u B.9) The external definition ``static int .^.^.''
476is legal on \*sGCOS\*n, but gets a diagnostic on \*sUNIX\*n.
477(On \*sGCOS\*n it means an identifier global to the
478routines in the file but invisible to routines
479compiled separately.)
480.ti 0
481g B.10) A compound statement on \*sGCOS\*n must contain one ``;''
482but on \*sUNIX\*n may be empty.
483.ti 0
484g B.11) On \*sGCOS\*n case distinctions in identifiers and keywords are
485ignored; on \*sUNIX\*n case is significant everywhere,
486with keywords in lower case.
487.sp
488.ne 5
489.ti0
490.ft I
491C. Syntax Differences
492.ft R
493.sp
494.ti0
495g C.1) \*sUNIX\*n allows broader classes of initialization;
496on \*sGCOS\*n an initializer must be a constant, name, or string.
497Similarly,
498\*sGCOS\*n is much stickier about wanting braces
499around initializers and in particular they must be present
500for array initialization.
501.ti0
502g C.2) ``int extern'' illegal on \*sGCOS\*n; must have ``extern int''
503(storage class before type).
504.ti0
505g C.3) Externals on \*sGCOS\*n must have a type (not defaulted
506to \fGint\fR).
507.ti0
508u C.4) \*sGCOS\*n allows initialization of internal \fGstatic\fR
509(same syntax as for external definitions).
510.ti0
511g C.5) integer\(mi>... is not allowed on \*sGCOS\*n.
512.ti0
513g C.6) Some operators on pointers are illegal on \*sGCOS\*n (<, >).
514.ti0
515g C.7) \fGregister\fR storage class means something on \*sUNIX\*n,
516but is not accepted on \*sGCOS\*n.
517.ti0
518g C.8) Scope holes: ``int x; f^(^^)^{int x;}'' is illegal on
519\*sUNIX\*n but defines two variables on \*sGCOS\*n.
520.ti0
521g C.9) When function names are used as arguments on \*sUNIX\*n,
522either ``fname'' or ``&fname'' may be used to get a pointer to the function;
523on \*sGCOS\*n ``&fname'' generates a doubly-indirect pointer.
524(Note that both are wrong since the ``&''
525is supposed to be supplied for free.)
526.sp
527.ne 5
528.ti0
529.ft I
530D. Operating System Dependencies
531.sp
532.ft R
533.ti0
534d D.1) \*sGCOS\*n allocates external scalars by SYMREF;
535\*sUNIX\*n allocates external scalars as labelled common;
536as a result there may be many
537uninitialized external definitions of the same variable
538on \*sUNIX\*n but only one on \*sGCOS\*n.
539.ti0
540d D.2) External names differ in allowable length and
541character set;
542on \*sUNIX\*n, 7 characters and both cases; on \*sGCOS\*n
5436 characters and only one case.
544.sp
545.ne 5
546.ft I
547.ti0
548E. Semantic Differences
549.ft R
550.sp
551.ti0
552hg E.1) ``int i, *p; p=i; i=p;'' does nothing on \*sUNIX\*n,
553does something on \*sGCOS\*n (destroys right half of i) .
554.ti0
555d E.2) ``>>'' means arithmetic shift on \*sUNIX\*n, logical on \*sGCOS\*n.
556.ti0
557d E.3) When a \fGchar\fR is converted to integer, the result is always
558positive on \*sGCOS\*n but can be negative on \*sUNIX\*n.
559.ti0
560d E.4) Arguments of subroutines are evaluated left-to-right
561on \*sGCOS\*n, right-to-left on \*sUNIX\*n.