Literals (examples) Operators (decreasing precedence down and across)
C Reference Card 2004-06-21
123 -4 0xAf0C 057 integers (int) () [] . -> Brackets, array, struct, pointer-struct substitutable parameters shown in italics 3.14159265 1.29e-23 reals (double) ++ -- - ! * Incr/decrement, unary minus, logical ´x´ ´\t´ ´\033´ characters (char) & ~ sizeof NOT, pointer deref., address-of, 1’s Compilation ″hello″ ″abc\″\n″ ″″ strings (char *) (typename) complement, size in bytes, cast gcc –flags program.c * / % + - Binary arithmetic operators Character and string escapes dcc –flags program.c (CSE labs only) << >> Bitwise left shift/right shift symbol represents symbol represents < <= > >= Relational operators –c Compile only, output to file.o == != & (In)equality operators; bitwise AND –o file Executable output to file \t tab \ddd ASCII value (octal) ^ | Bitwise exclusive OR, inclusive OR –g Generate debugging info for gdb \n newline \´ single quote && || ?: Logical AND and OR; conditional \r carriage-return \″ double quote –Wall Turn on all warnings = += -= *= Assignment (with optional arithmetic \0 null character \\ backslash /= %= etc operation) Declarations (examples) , Comma (sequential) operator Lexical structure, preprocessor int i, length; Left-associative except for (right associative) /* comment */ char *str, buf[BUFSIZ], prev; double x, values[MAX]; Statements // comment to end of line typedef enum { FALSE, TRUE } Bool; expression ; #include <libmodule.h> typedef struct { { statements… } #include ″usermodule.h″ char *key; if (expression) statement #define NAME replacement-text int val; if (expression) statement else statement #define NAME(args…) replacement-text } KeyValType; switch (expression) { type funcname(type param1, type param2 …); case constant : statements… break; Program structure: More types case constant : statements… break; Header files: declarations only (#includes, #defines, function default : statements prototypes) short (int) long (int, double) } Implementation files: #includes, #defines, prototypes for unsigned (int, char) while (expression) statement local functions, function definitions Storage classes (common) for (initialiser; condition; increment) statement Main program file: as for implementation, must have main: static local to file, or var saved across function calls do statement while (expression); int main(int argc, char **argv) extern accessible everywhere break; terminate loop or switch Identifiers start with a letter, followed by any number of Initialisation (examples) continue; resume next iteration of loop letters, digits or underscores return expr; return value from function int c = 0; goto identifier; transfer to label (rare) Identifiers starting with _ reserved for system use char prev = ´\n´; Reserved words (can’t use as identifiers): char *mssg = ″hello″; auto break case char const continue default do double else entry enum extern float for int seq[MAX] = { 1, 2, 3 }; goto if int long register return short KeyValType keylist[] = { signed sizeof static struct switch typedef union unsigned void volatile while ″NSW″, 0, ″Vic″, 5 , ″Qld″, -1 }; C library functions (and other objects) ctype.h Common programming patterns toupper(c) tolower(c) case mapping Read input a character at a time: Parameter name implies type: c char isupper(c) islower(c) case testing n int l long s string (char *) int c; isalpha(c) isalnum(c) alpha(betic|numeric) b buffer (char array) p pointer (void *) isdigit(c) isxdigit(c) decimal or hex digit while ((c = getchar()) != EOF) { d double fh file handle (FILE *) isspace(c) isprint(c) white space, printable putchar(c); // or some other use of c stdlib.h } string.h atoi(s) atof(s) string to int or double Read input a line at a time: strlen(s) length (excluding ´\0´) malloc(n) calloc(n) allocate n bytes strcpy(sd,ss) copy ss to sd, return sd char buf[BUFSIZ]; free(p) recycle memory strcat(sd,ss) append ss to sd, return sd exit(n) terminate with status n while(fgets(buf,BUFSIZ,stdin) != NULL) strcmp(s1,s2) compare, return <0 ==0 >0 process_line(buf); abs(n) labs(l) absolute value strncpy(sd,ss,n) strncat(sd,ss,n) Opening a file named on the command line: stdio.h strncmp(s1,s2,n) max n chars processed FILE *fp; stdin stdout stderr FILE * variables strchr(s,c) return ptr to first c in s BUFSIZ EOF NULL constants strrchr(s,c) return ptr to last c in s fp = fopen(argv[1], ″r″); fopen(s,mode) open file, returns fh strstr(s,sp) return ptr to first sp in s if (fp == NULL) { mode is one or more of ″r″, ″w″, ″a″ ″b″ ″+″ strpbrk(s,set) return ptr to first of any in set fprintf(stderr, ″can’t open %s\n″, fclose(fh) close file strspn(s,set) length of prefix of any in set argv[1]); exit(1); fgetc(fh) getchar() read char, EOF if none strcspn(s,set) length of prefix all not in set } fgets(b,n,fh) read line, NULL if none math.h (all parameters are double) Same, but file name is optional, default standard input: fputc(c,fh) putchar(c) write char fputs(s,fh) write line sin(d) cos(d) tan(d) trigonometry (radians) if (argc == 1) fread(p,size,nel,fh) read into binary buffer, asin(d) acos(d) atan(d) inverse (radians) process(stdin); return number of elements read atan2(y,x) = tan−1(y/x) else { fwrite(p,size,nel,fh) write from binary buffer sinh(d) cosh(d) tanh(d) hyperbolic // open fp as above Formatted output: exp(d) log(d) log10(d) exponential, logarithm process(fp); fprintf(fh, format, list) formatted output to fh pow(x,y) sqrt(d) xy, square root } printf(format, list) fmt output to stdout floor(d) ceil(d) integral bounds Print array of real numbers: sprintf(b, format, list) formatted output to string fabs(d) fmod(x,y) absolute value, x % y for (i=0; i < MAX; i++) format items %width.precision code printf(″%14.6f\n″, sample[i]); negative width left-justifies. code is one of Function to find the length of a string: d decimal o octal x hexadecimal f fixed point g general e exponential (scientific) int mystrlen(char *s) c character s string p pointer { int len = 0; % literal ´%´ character char *sp; Formatted input: fscanf(fh, format, list) formatted input from fh for (sp=s; *sp != ´\0´; sp++) scanf(format, list) fmt input from stdin len++; sscanf(s, format, list) formatted input from string return len; format codes similar to printf, list has addresses }