SlideShare a Scribd company logo
Washington
WASHINGTON UNIVERSITY IN ST LOUIS
Brief Introduction to the C
Programming Language
Fred Kuhns
fredk@cse.wustl.edu
Applied Research Laboratory,
Department of Computer Science and Engineering,
Washington University in St. Louis
2
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Introduction
• The C programming language was designed by Dennis
Ritchie at Bell Laboratories in the early 1970s
• Influenced by
– ALGOL 60 (1960),
– CPL (Cambridge, 1963),
– BCPL (Martin Richard, 1967),
– B (Ken Thompson, 1970)
• Traditionally used for systems programming, though
this may be changing in favor of C++
• Traditional C:
– The C Programming Language, by Brian Kernighan and Dennis
Ritchie, 2nd Edition, Prentice Hall
– Referred to as K&R
3
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Standard C
• Standardized in 1989 by ANSI (American National
Standards Institute) known as ANSI C
• International standard (ISO) in 1990 which was
adopted by ANSI and is known as C89
• As part of the normal evolution process the standard
was updated in 1995 (C95) and 1999 (C99)
• C++ and C
– C++ extends C to include support for Object Oriented
Programming and other features that facilitate large software
development projects
– C is not strictly a subset of C++, but it is possible to write
“Clean C” that conforms to both the C++ and C standards.
4
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Elements of a C Program
• A C development environment includes
– System libraries and headers: a set of standard libraries and
their header files. For example see /usr/include and glibc.
– Application Source: application source and header files
– Compiler: converts source to object code for a specific platform
– Linker: resolves external references and produces the
executable module
• User program structure
– there must be one main function where execution begins when
the program is run. This function is called main
• int main (void) { ... },
• int main (int argc, char *argv[]) { ... }
• UNIX Systems have a 3rd way to define main(), though it is not
POSIX.1 compliant
int main (int argc, char *argv[], char *envp[])
– additional local and external functions and variables
5
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
A Simple C Program
• Create example file: try.c
• Compile using gcc:
gcc –o try try.c
• The standard C library libc is included
automatically
• Execute program
./try
• Note, I always specify an absolute path
• Normal termination:
void exit(int status);
– calls functions registered with
atexit()
– flush output streams
– close all open streams
– return status value and control to host
environment
/* you generally want to
* include stdio.h and
* stdlib.h
* */
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
printf(“Hello Worldn”);
exit(0);
}
6
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Source and Header files
• Just as in C++, place related code within the same module
(i.e. file).
• Header files (*.h) export interface definitions
– function prototypes, data types, macros, inline functions and other
common declarations
• Do not place source code (i.e. definitions) in the header
file with a few exceptions.
– inline’d code
– class definitions
– const definitions
• C preprocessor (cpp) is used to insert common definitions
into source files
• There are other cool things you can do with the
preprocessor
7
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Another Example C Program
example.c
/* this is a C-style comment
* You generally want to palce
* all file includes at start of file
* */
#include <stdio.h>
#include <stdlib.h>
int
main (int argc, char **argv)
{
// this is a C++-style comment
// printf prototype in stdio.h
printf(“Hello, Prog name = %sn”,
argv[0]);
exit(0);
}
/* comments */
#ifndef _STDIO_H
#define _STDIO_H
... definitions and protoypes
#endif
/usr/include/stdio.h
/* prevents including file
* contents multiple
* times */
#ifndef _STDLIB_H
#define _STDLIB_H
... definitions and protoypes
#endif
/usr/include/stdlib.h
#include directs the preprocessor
to “include” the contents of the file
at this point in the source file.
#define directs preprocessor to
define macros.
8
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Passing Command Line Arguments
• When you execute a program
you can include arguments on
the command line.
• The run time environment will
create an argument vector.
– argv is the argument vector
– argc is the number of
arguments
• Argument vector is an array of
pointers to strings.
• a string is an array of
characters terminated by a
binary 0 (NULL or ‘0’).
• argv[0] is always the program
name, so argc is at least 1.
./try –g 2 fred
argc = 4,
argv = <address0>
‘t’‘r’‘y’‘0’
argv:
[0] <addres1>
[1] <addres2>
[2] <addres3>
[3] <addres4>
[4] NULL
‘-’‘g’‘0’
‘2’‘0’
‘f’‘r’‘e’‘d’‘0’
9
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
C Standard Header Files you may want to use
• Standard Headers you should know about:
– stdio.h – file and console (also a file) IO: perror, printf,
open, close, read, write, scanf, etc.
– stdlib.h - common utility functions: malloc, calloc,
strtol, atoi, etc
– string.h - string and byte manipulation: strlen, strcpy,
strcat, memcpy, memset, etc.
– ctype.h – character types: isalnum, isprint,
isupport, tolower, etc.
– errno.h – defines errno used for reporting system errors
– math.h – math functions: ceil, exp, floor, sqrt, etc.
– signal.h – signal handling facility: raise, signal, etc
– stdint.h – standard integer: intN_t, uintN_t, etc
– time.h – time related facility: asctime, clock, time_t,
etc.
10
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
The Preprocessor
• The C preprocessor permits you to define simple
macros that are evaluated and expanded prior to
compilation.
• Commands begin with a ‘#’. Abbreviated list:
– #define : defines a macro
– #undef : removes a macro definition
– #include : insert text from file
– #if : conditional based on value of expression
– #ifdef : conditional based on whether macro defined
– #ifndef : conditional based on whether macro is not defined
– #else : alternative
– #elif : conditional alternative
– defined() : preprocessor function: 1 if name defined, else 0
#if defined(__NetBSD__)
11
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Preprocessor: Macros
• Using macros as functions, exercise caution:
– flawed example: #define mymult(a,b) a*b
• Source: k = mymult(i-1, j+5);
• Post preprocessing: k = i – 1 * j + 5;
– better: #define mymult(a,b) (a)*(b)
• Source: k = mymult(i-1, j+5);
• Post preprocessing: k = (i – 1)*(j + 5);
• Be careful of side effects, for example what if we did
the following
– Macro: #define mysq(a) (a)*(a)
– flawed usage:
• Source: k = mysq(i++)
• Post preprocessing: k = (i++)*(i++)
• Alternative is to use inline’ed functions
– inline int mysq(int a) {return a*a};
– mysq(i++) works as expected in this case.
12
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Preprocessor: Conditional Compilation
• Its generally better to use inline’ed functions
• Typically you will use the preprocessor to define
constants, perform conditional code inclusion, include
header files or to create shortcuts
• #define DEFAULT_SAMPLES 100
• #ifdef __linux
static inline int64_t
gettime(void) {...}
• #elif defined(sun)
static inline int64_t
gettime(void) {return (int64_t)gethrtime()}
• #else
static inline int64_t
gettime(void) {... gettimeofday()...}
• #endif
13
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Another Simple C Program
int main (int argc, char **argv) {
int i;
printf(“There are %d argumentsn”, argc);
for (i = 0; i < argc; i++)
printf(“Arg %d = %sn”, i, argv[i]);
return 0;
}
• Notice that the syntax is similar to Java
•What’s new in the above simple program?
– of course you will have to learn the new interfaces and utility
functions defined by the C standard and UNIX
– Pointers will give you the most trouble
14
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
• A variable declared as an array represents a contiguous
region of memory in which the array elements are stored.
int x[5]; // an array of 5 4-byte ints.
• All arrays begin with an index of 0
• An array identifier is equivalent to a pointer that
references the first element of the array
– int x[5], *ptr;
ptr = &x[0] is equivalent to ptr = x;
• Pointer arithmetic and arrays:
– int x[5];
x[2] is the same as *(x + 2), the compiler will assume you
mean 2 objects beyond element x.
Arrays and Pointers
0
1
2
3
4
1
0 2 3
little endian byte ordering
memory layout for array x
15
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Pointers
• For any type T, you may form a pointer type to T.
– Pointers may reference a function or an object.
– The value of a pointer is the address of the corresponding object or
function
– Examples: int *i; char *x; int (*myfunc)();
• Pointer operators: * dereferences a pointer, & creates a pointer
(reference to)
– int i = 3; int *j = &i;
*j = 4; printf(“i = %dn”, i); // prints i = 4
– int myfunc (int arg);
int (*fptr)(int) = myfunc;
i = fptr(4); // same as calling myfunc(4);
• Generic pointers:
– Traditional C used (char *)
– Standard C uses (void *) – these can not be dereferenced or used in
pointer arithmetic. So they help to reduce programming errors
• Null pointers: use NULL or 0. It is a good idea to always initialize
pointers to NULL.
16
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Pointers in C (and C++)
Address
0x3dc
0x3d8
Program Memory
0x3cc
0x3c8
0x3c4
0x3c0
Note: The compiler converts z[1] or *(z+1) to
Value at address (Address of z + sizeof(int));
In C you would write the byte address as:
(char *)z + sizeof(int);
or letting the compiler do the work for you
(int *)z + 1;
Step 1:
int main (int argc, argv) {
int x = 4;
int *y = &x;
int *z[4] = {NULL, NULL, NULL, NULL};
int a[4] = {1, 2, 3, 4};
...
0x3bc
0x3b8
0x3b4
0x3b0
0x3d4
0x3d0
z[3]
z[2]
z[1]
z[0]
a[3]
a[2]
a[1]
a[0]
4
0x3dc
0
0
0
0
4
3
2
1
NA
NA
x
y
17
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Pointers Continued
4
0x3dc
Address
0x3dc
0x3d8
Program Memory
0x3bc
0x3b8
0x3b4
0x3b0
0x3cc
0x3c8
0x3c4
0x3c0
Step 1:
int main (int argc, argv) {
int x = 4;
int *y = &x;
int *z[4] = {NULL, NULL, NULL, NULL};
int a[4] = {1, 2, 3, 4};
Step 2: Assign addresses to array Z
z[0] = a; // same as &a[0];
z[1] = a + 1; // same as &a[1];
z[2] = a + 2; // same as &a[2];
z[3] = a + 3; // same as &a[3];
0x3bc
0x3b8
0x3b4
0x3b0
4
3
2
1
NA 0x3d4
0x3d0
z[3]
z[2]
z[1]
z[0]
a[3]
a[2]
a[1]
a[0]
NA
x
y
18
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Pointers Continued
4
0x3dc
Address
0x3dc
0x3d8
Program Memory
0x3bc
0x3b8
0x3b4
0x3b0
0x3cc
0x3c8
0x3c4
0x3c0
Step 1:
int main (int argc, argv) {
int x = 4;
int *y = &x;
int *z[4] = {NULL, NULL, NULL, NULL};
int a[4] = {1, 2, 3, 4};
Step 2:
z[0] = a;
z[1] = a + 1;
z[2] = a + 2;
z[3] = a + 3;
Step 3: No change in z’s values
z[0] = (int *)((char *)a);
z[1] = (int *)((char *)a
+ sizeof(int));
z[2] = (int *)((char *)a
+ 2 * sizeof(int));
z[3] = (int *)((char *)a
+ 3 * sizeof(int));
0x3bc
0x3b8
0x3b4
0x3b0
4
3
2
1
NA 0x3d4
0x3d0
z[3]
z[2]
z[1]
z[0]
a[3]
a[2]
a[1]
a[0]
NA
x
y
19
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Getting Fancy with Macros
#define QNODE(type) 
struct { 
struct type *next; 
struct type **prev; 
}
#define QNODE_INIT(node, field) 
do { 
(node)->field.next = (node); 
(node)->field.prev = 
&(node)->field.next; 
} while ( /* */ 0 );
#define QFIRST(head, field) 
((head)->field.next)
#define QNEXT(node, field) 
((node)->field.next)
#define QEMPTY(head, field) 
((head)->field.next == (head))
#define QFOREACH(head, var, field) 
for ((var) = (head)->field.next; 
(var) != (head); 
(var) = (var)->field.next)
#define QINSERT_BEFORE(loc, node, field) 
do { 
*(loc)->field.prev = (node); 
(node)->field.prev = 
(loc)->field.prev; 
(loc)->field.prev = 
&((node)->field.next); 
(node)->field.next = (loc); 
} while (/* */0)
#define QINSERT_AFTER(loc, node, field) 
do { 
((loc)->field.next)->field.prev = 
&(node)->field.next; 
(node)->field.next = (loc)->field.next; 
(loc)->field.next = (node); 
(node)->field.prev = &(loc)->field.next; 
} while ( /* */ 0)
#define QREMOVE(node, field) 
do { 
*((node)->field.prev) = (node)->field.next;
((node)->field.next)->field.prev = 
(node)->field.prev; 
(node)->field.next = (node); 
(node)->field.prev = &((node)->field.next);
} while ( /* */ 0)
20
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
typedef struct wth_t
{
int state;
QNODE(wth_t) alist;
} wth_t;
#define QNODE(type) 
struct { 
struct type *next; 
struct type **prev; 
}
After Preprocessing and Compiling
typedef struct wth_t {
int state;
struct {
struct wth_t *next;
struct wth_t **prev;
} alist;
} wth_t;
<integer> state
<address> next
<address> prev
3 words in memory
0
0x00100
0x00104
0x100
head: instance of wth_t
0x104
0x108
memory layout after GCC
CPP
QNODE_INIT(head, alist)
#define QNODE_INIT(node, field) 
do { 
(node)->field.next = (node); 
(node)->field.prev = &(node)->field.next;
} while ( /* */ 0 );
21
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next;
(node)->alist.next = (head); 
} while (/* */0)
QNODE Manipulations
0x100 0
0x100
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node0, alist);
?
before
22
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next;
(node)->alist.next = (head); 
} while (/* */0)
0x100 0
0x100
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node0, alist);
0x100 0
0x1a0
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QNODE Manipulations
before
23
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next;
(node)->alist.next = (head); 
} while (/* */0)
0x100 0
0x100
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node0, alist);
0x100 0
0x1a0
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x104
node0
0x1a4
0x1a8
QNODE Manipulations
before
24
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next;
(node)->alist.next = (head); 
} while (/* */0)
0x100 0
0x100
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node0, alist);
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x1a0
0x104
node0
0x1a4
0x1a8
QNODE Manipulations
before
25
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next;
(node)->alist.next = (head); 
} while (/* */0)
0x100 0
0x100
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node0, alist);
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QNODE Manipulations
before
26
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next;
(node)->alist.next = (head); 
} while (/* */0)
0x100 0
0x100
0x104
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node0, alist);
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QNODE Manipulations
before
27
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Adding a Third Node
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node1, alist);
0x200 0
0x200
0x204
node1
0x204
0x208
#define QINSERT_BEFORE(head, node, alist)
do { 
*(head)->alist.prev = (node); 
(node)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node)->alist.next; 
(node)->alist.next = (head); 
} while (/* */0)
0x200 0
0x200
0x204
node1
0x204
0x208
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
28
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Adding a Third Node
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node1, alist);
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x200
0x204
node1
0x204
0x208
#define QINSERT_BEFORE(head, node1, alist)
do { 
*(head)->alist.prev = (node1); 
(node1)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node1)->alist.next; 
(node1)->alist.next = (head); 
} while (/* */0)
0x200 0
0x200
0x204
node1
0x204
0x208
(1)
(1)
29
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Adding a Third Node
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node1, alist);
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x200
0x204
node1
0x204
0x208
#define QINSERT_BEFORE(head, node1, alist)
do { 
*(head)->alist.prev = (node1); 
(node1)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node1)->alist.next; 
(node1)->alist.next = (head); 
} while (/* */0)
0x200 0
0x200
0x1a4
node1
0x204
0x208
(1)
(2)
(2)
30
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Adding a Third Node
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node1, alist);
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x200
0x204
node1
0x204
0x208
#define QINSERT_BEFORE(head, node1, alist)
do { 
*(head)->alist.prev = (node1); 
(node1)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node1)->alist.next; 
(node1)->alist.next = (head); 
} while (/* */0)
0x200 0
0x200
0x1a4
node1
0x204
0x208
(1)
(1)
(2)
(2)
(3)
(3)
31
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Adding a Third Node
0x100 0
0x1a0
0x1a4
head
0x104
0x108
0x1a0 0
0x100
0x104
node0
0x1a4
0x1a8
QINSERT_BEFORE(head, node1, alist);
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x200
0x204
node1
0x204
0x208
#define QINSERT_BEFORE(head, node1, alist)
do { 
*(head)->alist.prev = (node1); 
(node1)->alist.prev = (head)->alist.prev; 
(head)->alist.prev = &(node1)->alist.next; 
(node1)->alist.next = (head); 
} while (/* */0)
0x200 0
0x100
0x1a4
node1
0x204
0x208
(1)
(1)
(2)
(2)
(3)
(3)
(4)
(4)
32
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
0x100 0
??
??
head
0x104
0x108
0x1a0 0
??
??
node0
0x1a4
0x1a8
0x200 0
??
??
node1
0x204
0x208
#define QREMOVE(node, alist) 
do { 
(1) *((node)->alist.prev) = (node)->alist.next; 
(2) ((node)->alist.next)->alist.prev = (node)->alist.prev;
(3) (node)->alist.next = (node); 
(4) (node)->alist.prev = &((node)->alist.next); 
} while ( /* */ 0)
33
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
#define QREMOVE(node, alist) 
do { 
*((node)->alist.prev) = (node)->alist.next; 
((node)->alist.next)->alist.prev = (node)->alist.prev;
(node)->alist.next = (node); 
(node)->alist.prev = &((node)->alist.next); 
} while ( /* */ 0)
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
34
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
0x100 0
0x200
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
#define QREMOVE(node0, alist) 
do { 
(1) *((node0)->alist.prev) = (node0)->alist.next; 
((node0)->alist.next)->alist.prev = (node0)->alist.prev;
(node0)->alist.next = (node0); 
(node0)->alist.prev = &((node0)->alist.next); 
} while ( /* */ 0)
(1)
35
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
0x100 0
0x200
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x104
node1
0x204
0x208
Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
#define QREMOVE(node0, alist) 
do { 
*((node0)->alist.prev) = (node0)->alist.next; 
(2) ((node0)->alist.next)->alist.prev = (node0)->alist.prev;
(node0)->alist.next = (node0); 
(node0)->alist.prev = &((node0)->alist.next); 
} while ( /* */ 0)
(2)
36
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
0x100 0
0x200
0x204
head
0x104
0x108
0x1a0 0
0x1a0
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x104
node1
0x204
0x208
Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
#define QREMOVE(node0, alist) 
do { 
*((node0)->alist.prev) = (node0)->alist.next; 
((node0)->alist.next)->alist.prev = (node0)->alist.prev;
(3) (node0)->alist.next = (node0); 
(node0)->alist.prev = &((node0)->alist.next); 
} while ( /* */ 0)
(3)
37
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
0x100 0
0x200
0x204
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
0x200 0
0x100
0x104
node1
0x204
0x208
Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
#define QREMOVE(node0, alist) 
do { 
*((node0)->alist.prev) = (node0)->alist.next; 
((node0)->alist.next)->alist.prev = (node0)->alist.prev;
(node0)->alist.next = (node0); 
(4) (node0)->alist.prev = &((node0)->alist.next); 
} while ( /* */ 0)
(4)
38
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Solution to Removing a Node
0x100 0
0x1a0
0x204
head
0x104
0x108
0x1a0 0
0x200
0x104
node0
0x1a4
0x1a8
0x200 0
0x100
0x1a4
node1
0x204
0x208
QREMOVE(node0, alist);
0x100 0
0x200
0x204
head
0x104
0x108
0x1a0 0
0x1a0
0x1a4
node0
0x1a4
0x1a8
0x200 0
0x100
0x104
node1
0x204
0x208
#define QREMOVE(node, alist) 
do { 
(1) *((node)->alist.prev) = (node)->alist.next; 
(2) ((node)->alist.next)->alist.prev = (node)->alist.prev;
(3) (node)->alist.next = (node); 
(4) (node)->alist.prev = &((node)->alist.next); 
} while ( /* */ 0)
39
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Functions
• Always use function prototypes
int myfunc (char *, int, struct MyStruct *);
int myfunc_noargs (void);
void myfunc_noreturn (int i);
• C and C++ are call by value, copy of parameter passed to function
– C++ permits you to specify pass by reference
– if you want to alter the parameter then pass a pointer to it (or use
references in C++)
• If performance is an issue then use inline functions, generally
better and safer than using a macro. Common convention
– define prototype and function in header or name.i file
– static inline int myinfunc (int i, int j);
– static inline int myinfunc (int i, int j) { ... }
40
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Basic Types and Operators
• Basic data types
– Types: char, int, float and double
– Qualifiers: short, long, unsigned, signed, const
• Constant: 0x1234, 12, “Some string”
• Enumeration:
– Names in different enumerations must be distinct
– enum WeekDay_t {Mon, Tue, Wed, Thur, Fri};
enum WeekendDay_t {Sat = 0, Sun = 4};
• Arithmetic: +, -, *, /, %
– prefix ++i or --i ; increment/decrement before value is used
– postfix i++, i--; increment/decrement after value is used
• Relational and logical: <, >, <=, >=, ==, !=, &&, ||
• Bitwise: &, |, ^ (xor), <<, >>, ~(ones complement)
41
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Operator Precedence (from “C a Reference Manual”, 5th Edition)
Tokens
Operator
Class
Precedence
Associates
names,
literals
simple tokens primary
16
n/a
a[k] subscripting postfix left-to-right
f(...) function call postfix left-to-right
. direct selection postfix left-to-right
-> indirect selection postfix left to right
++ -- increment, decrement postfix left-to-right
(type){init} compound literal postfix left-to-right
++ -- increment, decrement prefix
15
right-to-left
sizeof size unary right-to-left
~ bitwise not unary right-to-left
! logical not unary right-to-left
- + negation, plus unary right-to-left
& address of unary right-to-left
*
indirection
(dereference)
unary right-to-left
Tokens
Operator
Class
Precedence
Associates
(type) casts unary 14 right-to-left
* / % multiplicative binary 13 left-to-right
+ - additive binary 12 left-to-right
<< >> left, right shift binary 11 left-to-right
< <= > >= relational binary 10 left-to-right
== != equality/ineq. binary 9 left-to-right
& bitwise and binary 8 left-to-right
^ bitwise xor binary 7 left-to-right
| bitwise or binary 6 left-to-right
&& logical and binary 5 left-to-right
|| logical or binary 4 left-to-right
?: conditional ternary 3 right-to-left
= += -=
*= /= %=
&= ^= |=
<<= >>=
assignment binary 2 right-to-left
, sequential eval. binary 1 left-to-right
42
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Structs and Unions
• structures
– struct MyPoint {int x, int y};
– typedef struct MyPoint MyPoint_t;
– MyPoint_t point, *ptr;
– point.x = 0;point.y = 10;
– ptr = &point; ptr->x = 12; ptr->y = 40;
• unions
– union MyUnion {int x; MyPoint_t pt; struct {int
3; char c[4]} S;};
– union MyUnion x;
– Can only use one of the elements. Memory will be allocated for
the largest element
43
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Conditional Statements (if/else)
if (a < 10)
printf(“a is less than 10n”);
else if (a == 10)
printf(“a is 10n”);
else
printf(“a is greater than 10n”);
• If you have compound statements then use brackets (blocks)
– if (a < 4 && b > 10) {
c = a * b; b = 0;
printf(“a = %d, a’s address = 0x%08xn”, a, (uint32_t)&a);
} else {
c = a + b; b = a;
}
• These two statements are equivalent:
– if (a) x = 3; else if (b) x = 2; else x = 0;
– if (a) x = 3; else {if (b) x = 2; else x = 0;}
• Is this correct?
– if (a) x = 3; else if (b) x = 2;
else (z) x = 0; else x = -2;
44
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Conditional Statements (switch)
int c = 10;
switch (c) {
case 0:
printf(“c is 0n”);
break;
...
default:
printf(“Unknown value of cn”);
break;
}
• What if we leave the break statement out?
• Do we need the final break statement on the default case?
45
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Loops
• flow control
– break – exit innermost loop
– continue – perform next iteration of loop
• Note, all these forms permit one statement to be executed. By
enclosing in brackets we create a block of statements.
for (i = 0; i < MAXVALUE; i++) {
dowork();
}
while (c != 12) {
dowork();
}
do {
dowork();
} while (c < 12);
46
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Building your program
• For all labs and programming assignments:
– you must supply a make file
– you must supply a README file that describes the assignment
and results. This must be a text file, no MS word.
– of course the source code and any other libraries or utility
code you used
– you may submit plots, they must be postscript or pdf
47
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
make and Makefiles, Overview
• Why use make?
– convenience of only entering compile directives once
– make is smart enough (with your help) to only compile and link modules
that have changed or which depend on files that have changed
– allows you to hide platform dependencies
– promotes uniformity
– simplifies my (and hopefully your) life when testing and verifying your
code
• A makefile contains a set of rules for building a program
target ... : prerequisites ...
command
...
• Static pattern rules.
– each target is matched against target-pattern to derive stem which is
used to determine prereqs (see example)
targets ... : target-pattern : prereq-patterns ...
command
...
48
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Makefiles
• Defining variables
MyOPS := -DWTH
MyDIR ?= /home/fred
MyVar = $(SHELL)
• Using variables
MyFLAGS := $(MyOPS)
• Built-in Variables
– $@ = filename of target
– $< = name of the first prerequisites
• Patterns
– use % character to determine stem
– foo.o matches the pattern %.o with foo as the stem.
– foo.o moo.o : %.o : %.c # says that foo.o depends on foo.c and
moo.o depends on moo.c
49
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Example Makefile for wulib
# Project specific
include ../Makefile.inc
INCLUDES = ${WUINCLUDES} –I.
LIBS = ${WILIBS} ${OSLIBS}
CFLAGS = ${WUCLFAGS} –DWUDEBUG
CC = ${WUCC}
HDRS := util.h
CSRCS := testapp1.c testapp2.c
SRCS := util.c callout.c
COBJS = $(addprefix ${OBJDIR}/, 
$(patsubst %.c,%.o,$(CSRCS)))
OBJS = $(addprefix ${OBJDIR}/, 
$(patsubst %.c,%.o,$(SRCS)))
CMDS = $(addprefix ${OBJDIR}/, $(basename $(CSRCS)))
all : $(OBJDIR) $(CMDS)
install : all
$(OBJDIR) :
mkdir $(OBJDIR)
$(OBJS) $(COBJS) : ${OBJDIR}/%.o : %.c $(HDRS)
${CC} ${CFLAGS} ${INCLUDES} –o $@ -c $<
$(CMDS) : ${OBJDIR}/% : ${OBJDIR}/%.o $(OBJS)
${CC} ${CFLAGS} -o $@ $@.o ${LIBS}
chmod 0755 $@
clean :
/bin/rm -f $(CMDS) $(OBJS)
# Makefile.inc
# Contains common definitions
MyOS := $(shell uname -s)
MyID := $(shell whoami)
MyHost := $(shell hostname)
WARNSTRICT := -W 
-Wstrict-prototypes

-Wmissing-prototypes
WARNLIGHT := -Wall
WARN := ${WARNLIGHT}
ALLFLGS := -D_GNU_SOURCE 
-D_REENTRANT 
-D_THREAD_SAFE
APPCFLGS = $(ALLFLGS) 
$(WARN)
WUCC := gcc
WUCFLAGS := -DMyOS=$(MyOS) 
$(OSFLAGS) 
$(ALLFLGS) $(WARN)
WUINCLUDES :=
WULIBS := -lm
ifeq (${MyOS), SunOS)
OSLIBS+= -lrt
endif
Makefile.inc Makefile
50
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Project Documentation
• README file structure
– Section A: Introduction
describe the project, paraphrase the requirements and state your
understanding of the assignments value.
– Section B: Design and Implementation
List all files turned in with a brief description for each. Explain your
design and provide simple psuedo-code for your project. Provide a simple
flow chart of you code and note any constraints, invariants, assumptions
or sources for reused code or ideas.
– Section C: Results
For each project you will be given a list of questions to answer, this is
where you do it. If you are not satisfied with your results explain why
here.
– Section D: Conclusions
What did you learn, or not learn during this assignment. What would you
do differently or what did you do well.
51
Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab
Attacking a Project
• Requirements and scope: Identify specific requirements and or goals.
Also note any design and/or implementation environment
requirements.
– knowing when you are done, or not done
– estimating effort or areas which require more research
– programming language, platform and other development environment
issues
• Approach: How do you plan to solve the problem identified in the first
step. Develop a prototype design and document. Next figure out how
you will verify that you did satisfy the requirements/goals. Designing
the tests will help you to better understand the problem domain and
your proposed solution
• Iterative development: It is good practice to build your project in
small pieces. Testing and learning as you go.
• Final Touches: Put it all together and run the tests identified in the
approach phase. Verify you met requirements. Polish you code and
documentation.
• Turn it in:

More Related Content

PPT
Brief introduction to the c programming language
PPT
C introduction by piyushkumar
PDF
C Programming Tutorial - www.infomtec.com
PPT
Csdfsadf
PPT
PPTX
C Programming Training in Ambala ! Batra Computer Centre
PDF
Introduction of c language
Brief introduction to the c programming language
C introduction by piyushkumar
C Programming Tutorial - www.infomtec.com
Csdfsadf
C Programming Training in Ambala ! Batra Computer Centre
Introduction of c language

Similar to C.ppt (20)

PPTX
C Programming UNIT 1.pptx
PPTX
Unit 1.1 - Introduction to C.pptx
PPTX
computer networksssssssssssssssssssssssssssss.pptx
PPTX
C for Engineers
PPT
C_Intro.ppt
PPTX
Basics of C Lecture 2[16097].pptx
PPT
8844632.ppt
PPTX
Introduction to C programming
DOCX
1 CMPS 12M Introduction to Data Structures Lab La.docx
PDF
88 c-programs
PDF
88 c programs 15184
PPTX
Lecture 01 Programming C for Beginners 001
PPT
358 33 powerpoint-slides_1-introduction-c_chapter-1
PDF
Introduction to C Programming | Importance of Learning C
DOC
complete data structure
DOC
Datastructurenotes 100627004340-phpapp01
PDF
c programming L-1.pdf43333333544444444444444444444
DOC
Basic c
PDF
Introduction to C programming
PPTX
High performance computing seminar1.pptx
C Programming UNIT 1.pptx
Unit 1.1 - Introduction to C.pptx
computer networksssssssssssssssssssssssssssss.pptx
C for Engineers
C_Intro.ppt
Basics of C Lecture 2[16097].pptx
8844632.ppt
Introduction to C programming
1 CMPS 12M Introduction to Data Structures Lab La.docx
88 c-programs
88 c programs 15184
Lecture 01 Programming C for Beginners 001
358 33 powerpoint-slides_1-introduction-c_chapter-1
Introduction to C Programming | Importance of Learning C
complete data structure
Datastructurenotes 100627004340-phpapp01
c programming L-1.pdf43333333544444444444444444444
Basic c
Introduction to C programming
High performance computing seminar1.pptx

More from BhumaNagaPavan (7)

PPTX
DC GENERATORS-BEEE.pptx
PPT
DC MOTORS.ppt
PPTX
TRANSFORMER.pptx
PPT
packages.ppt
PPT
strings.ppt
PPTX
Python operator, data types.pptx
PPT
File Handling in c.ppt
DC GENERATORS-BEEE.pptx
DC MOTORS.ppt
TRANSFORMER.pptx
packages.ppt
strings.ppt
Python operator, data types.pptx
File Handling in c.ppt

Recently uploaded (20)

PDF
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
PPTX
Cell Types and Its function , kingdom of life
PPTX
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
PDF
RMMM.pdf make it easy to upload and study
PDF
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
PDF
A systematic review of self-coping strategies used by university students to ...
PDF
STATICS OF THE RIGID BODIES Hibbelers.pdf
PPTX
202450812 BayCHI UCSC-SV 20250812 v17.pptx
PPTX
Pharma ospi slides which help in ospi learning
PDF
Chinmaya Tiranga quiz Grand Finale.pdf
PDF
01-Introduction-to-Information-Management.pdf
PDF
VCE English Exam - Section C Student Revision Booklet
PDF
GENETICS IN BIOLOGY IN SECONDARY LEVEL FORM 3
PDF
Abdominal Access Techniques with Prof. Dr. R K Mishra
PPTX
Tissue processing ( HISTOPATHOLOGICAL TECHNIQUE
PDF
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
PDF
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
PPTX
master seminar digital applications in india
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
Cell Types and Its function , kingdom of life
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
RMMM.pdf make it easy to upload and study
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
A systematic review of self-coping strategies used by university students to ...
STATICS OF THE RIGID BODIES Hibbelers.pdf
202450812 BayCHI UCSC-SV 20250812 v17.pptx
Pharma ospi slides which help in ospi learning
Chinmaya Tiranga quiz Grand Finale.pdf
01-Introduction-to-Information-Management.pdf
VCE English Exam - Section C Student Revision Booklet
GENETICS IN BIOLOGY IN SECONDARY LEVEL FORM 3
Abdominal Access Techniques with Prof. Dr. R K Mishra
Tissue processing ( HISTOPATHOLOGICAL TECHNIQUE
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
master seminar digital applications in india
O7-L3 Supply Chain Operations - ICLT Program
O5-L3 Freight Transport Ops (International) V1.pdf

C.ppt

  • 1. Washington WASHINGTON UNIVERSITY IN ST LOUIS Brief Introduction to the C Programming Language Fred Kuhns fredk@cse.wustl.edu Applied Research Laboratory, Department of Computer Science and Engineering, Washington University in St. Louis
  • 2. 2 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Introduction • The C programming language was designed by Dennis Ritchie at Bell Laboratories in the early 1970s • Influenced by – ALGOL 60 (1960), – CPL (Cambridge, 1963), – BCPL (Martin Richard, 1967), – B (Ken Thompson, 1970) • Traditionally used for systems programming, though this may be changing in favor of C++ • Traditional C: – The C Programming Language, by Brian Kernighan and Dennis Ritchie, 2nd Edition, Prentice Hall – Referred to as K&R
  • 3. 3 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Standard C • Standardized in 1989 by ANSI (American National Standards Institute) known as ANSI C • International standard (ISO) in 1990 which was adopted by ANSI and is known as C89 • As part of the normal evolution process the standard was updated in 1995 (C95) and 1999 (C99) • C++ and C – C++ extends C to include support for Object Oriented Programming and other features that facilitate large software development projects – C is not strictly a subset of C++, but it is possible to write “Clean C” that conforms to both the C++ and C standards.
  • 4. 4 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Elements of a C Program • A C development environment includes – System libraries and headers: a set of standard libraries and their header files. For example see /usr/include and glibc. – Application Source: application source and header files – Compiler: converts source to object code for a specific platform – Linker: resolves external references and produces the executable module • User program structure – there must be one main function where execution begins when the program is run. This function is called main • int main (void) { ... }, • int main (int argc, char *argv[]) { ... } • UNIX Systems have a 3rd way to define main(), though it is not POSIX.1 compliant int main (int argc, char *argv[], char *envp[]) – additional local and external functions and variables
  • 5. 5 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab A Simple C Program • Create example file: try.c • Compile using gcc: gcc –o try try.c • The standard C library libc is included automatically • Execute program ./try • Note, I always specify an absolute path • Normal termination: void exit(int status); – calls functions registered with atexit() – flush output streams – close all open streams – return status value and control to host environment /* you generally want to * include stdio.h and * stdlib.h * */ #include <stdio.h> #include <stdlib.h> int main (void) { printf(“Hello Worldn”); exit(0); }
  • 6. 6 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Source and Header files • Just as in C++, place related code within the same module (i.e. file). • Header files (*.h) export interface definitions – function prototypes, data types, macros, inline functions and other common declarations • Do not place source code (i.e. definitions) in the header file with a few exceptions. – inline’d code – class definitions – const definitions • C preprocessor (cpp) is used to insert common definitions into source files • There are other cool things you can do with the preprocessor
  • 7. 7 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Another Example C Program example.c /* this is a C-style comment * You generally want to palce * all file includes at start of file * */ #include <stdio.h> #include <stdlib.h> int main (int argc, char **argv) { // this is a C++-style comment // printf prototype in stdio.h printf(“Hello, Prog name = %sn”, argv[0]); exit(0); } /* comments */ #ifndef _STDIO_H #define _STDIO_H ... definitions and protoypes #endif /usr/include/stdio.h /* prevents including file * contents multiple * times */ #ifndef _STDLIB_H #define _STDLIB_H ... definitions and protoypes #endif /usr/include/stdlib.h #include directs the preprocessor to “include” the contents of the file at this point in the source file. #define directs preprocessor to define macros.
  • 8. 8 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Passing Command Line Arguments • When you execute a program you can include arguments on the command line. • The run time environment will create an argument vector. – argv is the argument vector – argc is the number of arguments • Argument vector is an array of pointers to strings. • a string is an array of characters terminated by a binary 0 (NULL or ‘0’). • argv[0] is always the program name, so argc is at least 1. ./try –g 2 fred argc = 4, argv = <address0> ‘t’‘r’‘y’‘0’ argv: [0] <addres1> [1] <addres2> [2] <addres3> [3] <addres4> [4] NULL ‘-’‘g’‘0’ ‘2’‘0’ ‘f’‘r’‘e’‘d’‘0’
  • 9. 9 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab C Standard Header Files you may want to use • Standard Headers you should know about: – stdio.h – file and console (also a file) IO: perror, printf, open, close, read, write, scanf, etc. – stdlib.h - common utility functions: malloc, calloc, strtol, atoi, etc – string.h - string and byte manipulation: strlen, strcpy, strcat, memcpy, memset, etc. – ctype.h – character types: isalnum, isprint, isupport, tolower, etc. – errno.h – defines errno used for reporting system errors – math.h – math functions: ceil, exp, floor, sqrt, etc. – signal.h – signal handling facility: raise, signal, etc – stdint.h – standard integer: intN_t, uintN_t, etc – time.h – time related facility: asctime, clock, time_t, etc.
  • 10. 10 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab The Preprocessor • The C preprocessor permits you to define simple macros that are evaluated and expanded prior to compilation. • Commands begin with a ‘#’. Abbreviated list: – #define : defines a macro – #undef : removes a macro definition – #include : insert text from file – #if : conditional based on value of expression – #ifdef : conditional based on whether macro defined – #ifndef : conditional based on whether macro is not defined – #else : alternative – #elif : conditional alternative – defined() : preprocessor function: 1 if name defined, else 0 #if defined(__NetBSD__)
  • 11. 11 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Preprocessor: Macros • Using macros as functions, exercise caution: – flawed example: #define mymult(a,b) a*b • Source: k = mymult(i-1, j+5); • Post preprocessing: k = i – 1 * j + 5; – better: #define mymult(a,b) (a)*(b) • Source: k = mymult(i-1, j+5); • Post preprocessing: k = (i – 1)*(j + 5); • Be careful of side effects, for example what if we did the following – Macro: #define mysq(a) (a)*(a) – flawed usage: • Source: k = mysq(i++) • Post preprocessing: k = (i++)*(i++) • Alternative is to use inline’ed functions – inline int mysq(int a) {return a*a}; – mysq(i++) works as expected in this case.
  • 12. 12 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Preprocessor: Conditional Compilation • Its generally better to use inline’ed functions • Typically you will use the preprocessor to define constants, perform conditional code inclusion, include header files or to create shortcuts • #define DEFAULT_SAMPLES 100 • #ifdef __linux static inline int64_t gettime(void) {...} • #elif defined(sun) static inline int64_t gettime(void) {return (int64_t)gethrtime()} • #else static inline int64_t gettime(void) {... gettimeofday()...} • #endif
  • 13. 13 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Another Simple C Program int main (int argc, char **argv) { int i; printf(“There are %d argumentsn”, argc); for (i = 0; i < argc; i++) printf(“Arg %d = %sn”, i, argv[i]); return 0; } • Notice that the syntax is similar to Java •What’s new in the above simple program? – of course you will have to learn the new interfaces and utility functions defined by the C standard and UNIX – Pointers will give you the most trouble
  • 14. 14 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab • A variable declared as an array represents a contiguous region of memory in which the array elements are stored. int x[5]; // an array of 5 4-byte ints. • All arrays begin with an index of 0 • An array identifier is equivalent to a pointer that references the first element of the array – int x[5], *ptr; ptr = &x[0] is equivalent to ptr = x; • Pointer arithmetic and arrays: – int x[5]; x[2] is the same as *(x + 2), the compiler will assume you mean 2 objects beyond element x. Arrays and Pointers 0 1 2 3 4 1 0 2 3 little endian byte ordering memory layout for array x
  • 15. 15 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Pointers • For any type T, you may form a pointer type to T. – Pointers may reference a function or an object. – The value of a pointer is the address of the corresponding object or function – Examples: int *i; char *x; int (*myfunc)(); • Pointer operators: * dereferences a pointer, & creates a pointer (reference to) – int i = 3; int *j = &i; *j = 4; printf(“i = %dn”, i); // prints i = 4 – int myfunc (int arg); int (*fptr)(int) = myfunc; i = fptr(4); // same as calling myfunc(4); • Generic pointers: – Traditional C used (char *) – Standard C uses (void *) – these can not be dereferenced or used in pointer arithmetic. So they help to reduce programming errors • Null pointers: use NULL or 0. It is a good idea to always initialize pointers to NULL.
  • 16. 16 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Pointers in C (and C++) Address 0x3dc 0x3d8 Program Memory 0x3cc 0x3c8 0x3c4 0x3c0 Note: The compiler converts z[1] or *(z+1) to Value at address (Address of z + sizeof(int)); In C you would write the byte address as: (char *)z + sizeof(int); or letting the compiler do the work for you (int *)z + 1; Step 1: int main (int argc, argv) { int x = 4; int *y = &x; int *z[4] = {NULL, NULL, NULL, NULL}; int a[4] = {1, 2, 3, 4}; ... 0x3bc 0x3b8 0x3b4 0x3b0 0x3d4 0x3d0 z[3] z[2] z[1] z[0] a[3] a[2] a[1] a[0] 4 0x3dc 0 0 0 0 4 3 2 1 NA NA x y
  • 17. 17 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Pointers Continued 4 0x3dc Address 0x3dc 0x3d8 Program Memory 0x3bc 0x3b8 0x3b4 0x3b0 0x3cc 0x3c8 0x3c4 0x3c0 Step 1: int main (int argc, argv) { int x = 4; int *y = &x; int *z[4] = {NULL, NULL, NULL, NULL}; int a[4] = {1, 2, 3, 4}; Step 2: Assign addresses to array Z z[0] = a; // same as &a[0]; z[1] = a + 1; // same as &a[1]; z[2] = a + 2; // same as &a[2]; z[3] = a + 3; // same as &a[3]; 0x3bc 0x3b8 0x3b4 0x3b0 4 3 2 1 NA 0x3d4 0x3d0 z[3] z[2] z[1] z[0] a[3] a[2] a[1] a[0] NA x y
  • 18. 18 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Pointers Continued 4 0x3dc Address 0x3dc 0x3d8 Program Memory 0x3bc 0x3b8 0x3b4 0x3b0 0x3cc 0x3c8 0x3c4 0x3c0 Step 1: int main (int argc, argv) { int x = 4; int *y = &x; int *z[4] = {NULL, NULL, NULL, NULL}; int a[4] = {1, 2, 3, 4}; Step 2: z[0] = a; z[1] = a + 1; z[2] = a + 2; z[3] = a + 3; Step 3: No change in z’s values z[0] = (int *)((char *)a); z[1] = (int *)((char *)a + sizeof(int)); z[2] = (int *)((char *)a + 2 * sizeof(int)); z[3] = (int *)((char *)a + 3 * sizeof(int)); 0x3bc 0x3b8 0x3b4 0x3b0 4 3 2 1 NA 0x3d4 0x3d0 z[3] z[2] z[1] z[0] a[3] a[2] a[1] a[0] NA x y
  • 19. 19 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Getting Fancy with Macros #define QNODE(type) struct { struct type *next; struct type **prev; } #define QNODE_INIT(node, field) do { (node)->field.next = (node); (node)->field.prev = &(node)->field.next; } while ( /* */ 0 ); #define QFIRST(head, field) ((head)->field.next) #define QNEXT(node, field) ((node)->field.next) #define QEMPTY(head, field) ((head)->field.next == (head)) #define QFOREACH(head, var, field) for ((var) = (head)->field.next; (var) != (head); (var) = (var)->field.next) #define QINSERT_BEFORE(loc, node, field) do { *(loc)->field.prev = (node); (node)->field.prev = (loc)->field.prev; (loc)->field.prev = &((node)->field.next); (node)->field.next = (loc); } while (/* */0) #define QINSERT_AFTER(loc, node, field) do { ((loc)->field.next)->field.prev = &(node)->field.next; (node)->field.next = (loc)->field.next; (loc)->field.next = (node); (node)->field.prev = &(loc)->field.next; } while ( /* */ 0) #define QREMOVE(node, field) do { *((node)->field.prev) = (node)->field.next; ((node)->field.next)->field.prev = (node)->field.prev; (node)->field.next = (node); (node)->field.prev = &((node)->field.next); } while ( /* */ 0)
  • 20. 20 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab typedef struct wth_t { int state; QNODE(wth_t) alist; } wth_t; #define QNODE(type) struct { struct type *next; struct type **prev; } After Preprocessing and Compiling typedef struct wth_t { int state; struct { struct wth_t *next; struct wth_t **prev; } alist; } wth_t; <integer> state <address> next <address> prev 3 words in memory 0 0x00100 0x00104 0x100 head: instance of wth_t 0x104 0x108 memory layout after GCC CPP QNODE_INIT(head, alist) #define QNODE_INIT(node, field) do { (node)->field.next = (node); (node)->field.prev = &(node)->field.next; } while ( /* */ 0 );
  • 21. 21 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) QNODE Manipulations 0x100 0 0x100 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node0, alist); ? before
  • 22. 22 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) 0x100 0 0x100 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node0, alist); 0x100 0 0x1a0 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QNODE Manipulations before
  • 23. 23 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) 0x100 0 0x100 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node0, alist); 0x100 0 0x1a0 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x104 node0 0x1a4 0x1a8 QNODE Manipulations before
  • 24. 24 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) 0x100 0 0x100 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node0, alist); 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x1a0 0x104 node0 0x1a4 0x1a8 QNODE Manipulations before
  • 25. 25 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) 0x100 0 0x100 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node0, alist); 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QNODE Manipulations before
  • 26. 26 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) 0x100 0 0x100 0x104 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node0, alist); 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QNODE Manipulations before
  • 27. 27 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Adding a Third Node 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node1, alist); 0x200 0 0x200 0x204 node1 0x204 0x208 #define QINSERT_BEFORE(head, node, alist) do { *(head)->alist.prev = (node); (node)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node)->alist.next; (node)->alist.next = (head); } while (/* */0) 0x200 0 0x200 0x204 node1 0x204 0x208 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8
  • 28. 28 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Adding a Third Node 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node1, alist); 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x200 0x204 node1 0x204 0x208 #define QINSERT_BEFORE(head, node1, alist) do { *(head)->alist.prev = (node1); (node1)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node1)->alist.next; (node1)->alist.next = (head); } while (/* */0) 0x200 0 0x200 0x204 node1 0x204 0x208 (1) (1)
  • 29. 29 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Adding a Third Node 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node1, alist); 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x200 0x204 node1 0x204 0x208 #define QINSERT_BEFORE(head, node1, alist) do { *(head)->alist.prev = (node1); (node1)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node1)->alist.next; (node1)->alist.next = (head); } while (/* */0) 0x200 0 0x200 0x1a4 node1 0x204 0x208 (1) (2) (2)
  • 30. 30 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Adding a Third Node 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node1, alist); 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x200 0x204 node1 0x204 0x208 #define QINSERT_BEFORE(head, node1, alist) do { *(head)->alist.prev = (node1); (node1)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node1)->alist.next; (node1)->alist.next = (head); } while (/* */0) 0x200 0 0x200 0x1a4 node1 0x204 0x208 (1) (1) (2) (2) (3) (3)
  • 31. 31 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Adding a Third Node 0x100 0 0x1a0 0x1a4 head 0x104 0x108 0x1a0 0 0x100 0x104 node0 0x1a4 0x1a8 QINSERT_BEFORE(head, node1, alist); 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x200 0x204 node1 0x204 0x208 #define QINSERT_BEFORE(head, node1, alist) do { *(head)->alist.prev = (node1); (node1)->alist.prev = (head)->alist.prev; (head)->alist.prev = &(node1)->alist.next; (node1)->alist.next = (head); } while (/* */0) 0x200 0 0x100 0x1a4 node1 0x204 0x208 (1) (1) (2) (2) (3) (3) (4) (4)
  • 32. 32 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); 0x100 0 ?? ?? head 0x104 0x108 0x1a0 0 ?? ?? node0 0x1a4 0x1a8 0x200 0 ?? ?? node1 0x204 0x208 #define QREMOVE(node, alist) do { (1) *((node)->alist.prev) = (node)->alist.next; (2) ((node)->alist.next)->alist.prev = (node)->alist.prev; (3) (node)->alist.next = (node); (4) (node)->alist.prev = &((node)->alist.next); } while ( /* */ 0)
  • 33. 33 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); #define QREMOVE(node, alist) do { *((node)->alist.prev) = (node)->alist.next; ((node)->alist.next)->alist.prev = (node)->alist.prev; (node)->alist.next = (node); (node)->alist.prev = &((node)->alist.next); } while ( /* */ 0) 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208
  • 34. 34 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab 0x100 0 0x200 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); #define QREMOVE(node0, alist) do { (1) *((node0)->alist.prev) = (node0)->alist.next; ((node0)->alist.next)->alist.prev = (node0)->alist.prev; (node0)->alist.next = (node0); (node0)->alist.prev = &((node0)->alist.next); } while ( /* */ 0) (1)
  • 35. 35 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab 0x100 0 0x200 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x104 node1 0x204 0x208 Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); #define QREMOVE(node0, alist) do { *((node0)->alist.prev) = (node0)->alist.next; (2) ((node0)->alist.next)->alist.prev = (node0)->alist.prev; (node0)->alist.next = (node0); (node0)->alist.prev = &((node0)->alist.next); } while ( /* */ 0) (2)
  • 36. 36 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab 0x100 0 0x200 0x204 head 0x104 0x108 0x1a0 0 0x1a0 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x104 node1 0x204 0x208 Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); #define QREMOVE(node0, alist) do { *((node0)->alist.prev) = (node0)->alist.next; ((node0)->alist.next)->alist.prev = (node0)->alist.prev; (3) (node0)->alist.next = (node0); (node0)->alist.prev = &((node0)->alist.next); } while ( /* */ 0) (3)
  • 37. 37 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab 0x100 0 0x200 0x204 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 0x200 0 0x100 0x104 node1 0x204 0x208 Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); #define QREMOVE(node0, alist) do { *((node0)->alist.prev) = (node0)->alist.next; ((node0)->alist.next)->alist.prev = (node0)->alist.prev; (node0)->alist.next = (node0); (4) (node0)->alist.prev = &((node0)->alist.next); } while ( /* */ 0) (4)
  • 38. 38 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Solution to Removing a Node 0x100 0 0x1a0 0x204 head 0x104 0x108 0x1a0 0 0x200 0x104 node0 0x1a4 0x1a8 0x200 0 0x100 0x1a4 node1 0x204 0x208 QREMOVE(node0, alist); 0x100 0 0x200 0x204 head 0x104 0x108 0x1a0 0 0x1a0 0x1a4 node0 0x1a4 0x1a8 0x200 0 0x100 0x104 node1 0x204 0x208 #define QREMOVE(node, alist) do { (1) *((node)->alist.prev) = (node)->alist.next; (2) ((node)->alist.next)->alist.prev = (node)->alist.prev; (3) (node)->alist.next = (node); (4) (node)->alist.prev = &((node)->alist.next); } while ( /* */ 0)
  • 39. 39 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Functions • Always use function prototypes int myfunc (char *, int, struct MyStruct *); int myfunc_noargs (void); void myfunc_noreturn (int i); • C and C++ are call by value, copy of parameter passed to function – C++ permits you to specify pass by reference – if you want to alter the parameter then pass a pointer to it (or use references in C++) • If performance is an issue then use inline functions, generally better and safer than using a macro. Common convention – define prototype and function in header or name.i file – static inline int myinfunc (int i, int j); – static inline int myinfunc (int i, int j) { ... }
  • 40. 40 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Basic Types and Operators • Basic data types – Types: char, int, float and double – Qualifiers: short, long, unsigned, signed, const • Constant: 0x1234, 12, “Some string” • Enumeration: – Names in different enumerations must be distinct – enum WeekDay_t {Mon, Tue, Wed, Thur, Fri}; enum WeekendDay_t {Sat = 0, Sun = 4}; • Arithmetic: +, -, *, /, % – prefix ++i or --i ; increment/decrement before value is used – postfix i++, i--; increment/decrement after value is used • Relational and logical: <, >, <=, >=, ==, !=, &&, || • Bitwise: &, |, ^ (xor), <<, >>, ~(ones complement)
  • 41. 41 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Operator Precedence (from “C a Reference Manual”, 5th Edition) Tokens Operator Class Precedence Associates names, literals simple tokens primary 16 n/a a[k] subscripting postfix left-to-right f(...) function call postfix left-to-right . direct selection postfix left-to-right -> indirect selection postfix left to right ++ -- increment, decrement postfix left-to-right (type){init} compound literal postfix left-to-right ++ -- increment, decrement prefix 15 right-to-left sizeof size unary right-to-left ~ bitwise not unary right-to-left ! logical not unary right-to-left - + negation, plus unary right-to-left & address of unary right-to-left * indirection (dereference) unary right-to-left Tokens Operator Class Precedence Associates (type) casts unary 14 right-to-left * / % multiplicative binary 13 left-to-right + - additive binary 12 left-to-right << >> left, right shift binary 11 left-to-right < <= > >= relational binary 10 left-to-right == != equality/ineq. binary 9 left-to-right & bitwise and binary 8 left-to-right ^ bitwise xor binary 7 left-to-right | bitwise or binary 6 left-to-right && logical and binary 5 left-to-right || logical or binary 4 left-to-right ?: conditional ternary 3 right-to-left = += -= *= /= %= &= ^= |= <<= >>= assignment binary 2 right-to-left , sequential eval. binary 1 left-to-right
  • 42. 42 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Structs and Unions • structures – struct MyPoint {int x, int y}; – typedef struct MyPoint MyPoint_t; – MyPoint_t point, *ptr; – point.x = 0;point.y = 10; – ptr = &point; ptr->x = 12; ptr->y = 40; • unions – union MyUnion {int x; MyPoint_t pt; struct {int 3; char c[4]} S;}; – union MyUnion x; – Can only use one of the elements. Memory will be allocated for the largest element
  • 43. 43 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Conditional Statements (if/else) if (a < 10) printf(“a is less than 10n”); else if (a == 10) printf(“a is 10n”); else printf(“a is greater than 10n”); • If you have compound statements then use brackets (blocks) – if (a < 4 && b > 10) { c = a * b; b = 0; printf(“a = %d, a’s address = 0x%08xn”, a, (uint32_t)&a); } else { c = a + b; b = a; } • These two statements are equivalent: – if (a) x = 3; else if (b) x = 2; else x = 0; – if (a) x = 3; else {if (b) x = 2; else x = 0;} • Is this correct? – if (a) x = 3; else if (b) x = 2; else (z) x = 0; else x = -2;
  • 44. 44 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Conditional Statements (switch) int c = 10; switch (c) { case 0: printf(“c is 0n”); break; ... default: printf(“Unknown value of cn”); break; } • What if we leave the break statement out? • Do we need the final break statement on the default case?
  • 45. 45 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Loops • flow control – break – exit innermost loop – continue – perform next iteration of loop • Note, all these forms permit one statement to be executed. By enclosing in brackets we create a block of statements. for (i = 0; i < MAXVALUE; i++) { dowork(); } while (c != 12) { dowork(); } do { dowork(); } while (c < 12);
  • 46. 46 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Building your program • For all labs and programming assignments: – you must supply a make file – you must supply a README file that describes the assignment and results. This must be a text file, no MS word. – of course the source code and any other libraries or utility code you used – you may submit plots, they must be postscript or pdf
  • 47. 47 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab make and Makefiles, Overview • Why use make? – convenience of only entering compile directives once – make is smart enough (with your help) to only compile and link modules that have changed or which depend on files that have changed – allows you to hide platform dependencies – promotes uniformity – simplifies my (and hopefully your) life when testing and verifying your code • A makefile contains a set of rules for building a program target ... : prerequisites ... command ... • Static pattern rules. – each target is matched against target-pattern to derive stem which is used to determine prereqs (see example) targets ... : target-pattern : prereq-patterns ... command ...
  • 48. 48 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Makefiles • Defining variables MyOPS := -DWTH MyDIR ?= /home/fred MyVar = $(SHELL) • Using variables MyFLAGS := $(MyOPS) • Built-in Variables – $@ = filename of target – $< = name of the first prerequisites • Patterns – use % character to determine stem – foo.o matches the pattern %.o with foo as the stem. – foo.o moo.o : %.o : %.c # says that foo.o depends on foo.c and moo.o depends on moo.c
  • 49. 49 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Example Makefile for wulib # Project specific include ../Makefile.inc INCLUDES = ${WUINCLUDES} –I. LIBS = ${WILIBS} ${OSLIBS} CFLAGS = ${WUCLFAGS} –DWUDEBUG CC = ${WUCC} HDRS := util.h CSRCS := testapp1.c testapp2.c SRCS := util.c callout.c COBJS = $(addprefix ${OBJDIR}/, $(patsubst %.c,%.o,$(CSRCS))) OBJS = $(addprefix ${OBJDIR}/, $(patsubst %.c,%.o,$(SRCS))) CMDS = $(addprefix ${OBJDIR}/, $(basename $(CSRCS))) all : $(OBJDIR) $(CMDS) install : all $(OBJDIR) : mkdir $(OBJDIR) $(OBJS) $(COBJS) : ${OBJDIR}/%.o : %.c $(HDRS) ${CC} ${CFLAGS} ${INCLUDES} –o $@ -c $< $(CMDS) : ${OBJDIR}/% : ${OBJDIR}/%.o $(OBJS) ${CC} ${CFLAGS} -o $@ $@.o ${LIBS} chmod 0755 $@ clean : /bin/rm -f $(CMDS) $(OBJS) # Makefile.inc # Contains common definitions MyOS := $(shell uname -s) MyID := $(shell whoami) MyHost := $(shell hostname) WARNSTRICT := -W -Wstrict-prototypes -Wmissing-prototypes WARNLIGHT := -Wall WARN := ${WARNLIGHT} ALLFLGS := -D_GNU_SOURCE -D_REENTRANT -D_THREAD_SAFE APPCFLGS = $(ALLFLGS) $(WARN) WUCC := gcc WUCFLAGS := -DMyOS=$(MyOS) $(OSFLAGS) $(ALLFLGS) $(WARN) WUINCLUDES := WULIBS := -lm ifeq (${MyOS), SunOS) OSLIBS+= -lrt endif Makefile.inc Makefile
  • 50. 50 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Project Documentation • README file structure – Section A: Introduction describe the project, paraphrase the requirements and state your understanding of the assignments value. – Section B: Design and Implementation List all files turned in with a brief description for each. Explain your design and provide simple psuedo-code for your project. Provide a simple flow chart of you code and note any constraints, invariants, assumptions or sources for reused code or ideas. – Section C: Results For each project you will be given a list of questions to answer, this is where you do it. If you are not satisfied with your results explain why here. – Section D: Conclusions What did you learn, or not learn during this assignment. What would you do differently or what did you do well.
  • 51. 51 Fred Kuhns (1/22/2023) CSE332– Object Oriented Programming Lab Attacking a Project • Requirements and scope: Identify specific requirements and or goals. Also note any design and/or implementation environment requirements. – knowing when you are done, or not done – estimating effort or areas which require more research – programming language, platform and other development environment issues • Approach: How do you plan to solve the problem identified in the first step. Develop a prototype design and document. Next figure out how you will verify that you did satisfy the requirements/goals. Designing the tests will help you to better understand the problem domain and your proposed solution • Iterative development: It is good practice to build your project in small pieces. Testing and learning as you go. • Final Touches: Put it all together and run the tests identified in the approach phase. Verify you met requirements. Polish you code and documentation. • Turn it in: