04 advanced c programming
TRANSCRIPT
-
8/7/2019 04 Advanced C Programming
1/26
1
Advanced C Programming
from Expert C Programming: Deep C Secrets byPeter van der Linden
CIS*2450Advanced Programming Concepts
-
8/7/2019 04 Advanced C Programming
2/26
2
Topics Scope of symbol names
4 flavours
Precedence of operators
associativity
syntax of declarations with multiple operators
-
8/7/2019 04 Advanced C Programming
3/26
3
Scope Definition
Region over which you can access a variable by
name.
There are 4 types of scope:
Program scope widest
File scope Function scope
Block scope narrowest
-
8/7/2019 04 Advanced C Programming
4/26
4
Scoping Principle Always define a symbol in the narrowest
scope that works
Reasons?
-
8/7/2019 04 Advanced C Programming
5/26
5
Program Scope The variable is active among all source files
that make up the executable.
In C, all functions
Global (extern) variables
How does it work?
-
8/7/2019 04 Advanced C Programming
6/26
6
External Symbols
Program scope symbols passed to linker in.o file
External definition, extdef
External reference, extref
In linked executable, each external symbol:
E
xactly 1 extdef, or else undefined external multiply defined external
Any number of extrefs
substituted with final memory address of symbol
-
8/7/2019 04 Advanced C Programming
7/26
7
E
xternals Having program scope (external symbols)
is a common requirement
assembly language
all kinds of programming languages
allows big program to be linked together out of
small modules
Each language has own convention for
designating extdef & extref
-
8/7/2019 04 Advanced C Programming
8/26
8
Using Program Scope in C
Function
extdef: MARCFILE *useMarcFile(FILE *filep){}
definition only appears in one .c (marcutil.c)
extref: MARCFILE *useMarcFile(FILE *filep);
prototype declaration (.h) included in many .c files
Variable (dont have any in A1)
extdef: MARCFILE *libfile;
definition only appears in one .c, outside any function
can initialize: type varname =initial_value;
extref: extern MARCFILE *libfile;
declaration appears anywhere, in/outside functions
-
8/7/2019 04 Advanced C Programming
9/26
9
File Scope A variable is active from its declaration
point to the end of the file.
In C, static variables.
If variable defined outside any function
would normally be program scope (global) static keyword keeps definition from being
passed to linker doesnt become external
-
8/7/2019 04 Advanced C Programming
10/26
10
Scope vs. Storage Class Static storage
One copy of variable in executable program
Applies to both program scope (global variables) & filescope (static variables)
Issue confused in C/C++ (real deep secret )
Program scope (globals) are static in nature, but without
static keyword
If you add static keyword, not global anymore!
-
8/7/2019 04 Advanced C Programming
11/26
11
Contrast Automatic Storage Associated with functions
Arguments
Local variables inside function
Fresh temporary copy created on stack every timefunction called
Copy can be initialized (same value each time)
Copy goes away when function returns to caller
Allows recursion to work!
static keyword changes local variable fromautomatic to static storage class
Initialization effective once, when program started
-
8/7/2019 04 Advanced C Programming
12/26
12
Function Scope Active from the beginning to the end of a
function.
In C, only goto labels have function scope;
thereforeyou will never see them
-
8/7/2019 04 Advanced C Programming
13/26
13
Block Scope The variable is active from its declaration
point to the end of the block in which it was
declared.
In C, these are local variables.
Includes functions parameters
-
8/7/2019 04 Advanced C Programming
14/26
14
Example
int i; /* Program scope */
static intj; /* File scope */
func ( int k) { /* func is program scope,k is block scope */
int m; /* Block scope */
.}
/* which are static storage, auto? */
-
8/7/2019 04 Advanced C Programming
15/26
15
What Happens?func() {
int a = 11;
{int b = 10;
}
printf ( %d %d\n,a,b);
}
Wont work!
The variable b is inside a block and therefore is not visibleto the rest of the function.
-
8/7/2019 04 Advanced C Programming
16/26
16
What Happens?newfunc() {
int a = 11;
{int b = 10;
printf ( %d\n,b);
}
printf ( %d\n,a);
}
WORKS!
-
8/7/2019 04 Advanced C Programming
17/26
17
Precedence of Operators Definition
Determines the order in which operators are
evaluated.
Operators are used to calculate values for both
numeric and pointer expressions
Operators also have an associativity whichis used to determine the order in which
operands are grouped with operators.
-
8/7/2019 04 Advanced C Programming
18/26
18
Associativity Applies with 2 or more operators of same
precedence:
A op1 B op2 C op3 D
Answers question: Which op is done first?
Associativity can be either Left-to-Right or
Right-to-Left
-
8/7/2019 04 Advanced C Programming
19/26
19
Associativity Left-to-Right is most common
a + b c;
The + and operators are both evaluated left-
to-right so the expression is
a plus b, then subtract c
Equivalent to: (a + b) c;
-
8/7/2019 04 Advanced C Programming
20/26
20
Associativity Right-to-Left is rare
a = b = c;
This expression is read
assign c to b, then to a
Equivalent to: a = (b = c);
Meaningful because in C assignment operator is
an expression with a value
-
8/7/2019 04 Advanced C Programming
21/26
21
Problems with Precedence The precedence of some operators produces
problems when they create behaviours
which are unexpected.
-
8/7/2019 04 Advanced C Programming
22/26
22
Problems with Precedence Pointer to structure: *p.f
Expectation: the field of what p points to
(*p).f
Actually: p.f gives a compile error
*(p.f)
Why: . is higher than *Note: The -> operator was made to correct this.
p->f
-
8/7/2019 04 Advanced C Programming
23/26
23
Problems with Precedence int *ap[]
Expectation: ap is a ptr to an array of ints
int (*ap)[]
Actually: ap is an array of pointers-to-int
int *(ap[])
Why: [] is higher than *Note: usually found in declarations.
-
8/7/2019 04 Advanced C Programming
24/26
24
Problems with Precedence int *fp()
Expectation: fp is a ptr to a function returning
an int
int (*fp)()
Actually: fp is a function returning a ptr-to-int
int *(fp())Why: () is higher than *
Note: usually found in declarations.
-
8/7/2019 04 Advanced C Programming
25/26
25
Problems with Precedence c = getchar() !=EOF
Expectation: ( c = getchar() ) !=EOF
Actually: c = (getchar() !=EOF)
c is set equal to the true/false value
Why: == and != have higher precedence than
assignment
-
8/7/2019 04 Advanced C Programming
26/26
26
Solution to Precedence Problems When in doubt
Use parentheses!!!
Better still, use parentheses anywayYou may not be in doubt, but the next reader
may be