Chapter 11
Introduction to
Programming in C
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Compilation vs. Interpretation
Different ways of translating high-level language
Interpretation
•
•
•
•
•
interpreter = program that executes program statements
generally one line/command at a time
limited processing
easy to debug, make changes, view intermediate results
languages: BASIC, LISP, Perl, Java, Matlab, C-shell
Compilation
• translates statements into machine language
does not execute, but creates executable program
• performs optimization over multiple statements
• change requires recompilation
can be harder to debug, since executed code may be
different
• languages: C, C++, Fortran, Pascal
11-2
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Compilation vs. Interpretation
Consider the following algorithm:
•
•
•
•
•
Get W
X = W
Y = X
Z = Y
Print
from the keyboard.
+ W
+ X
+ Y
Z to screen.
If interpreting, how many arithmetic operations occur?
If compiling, we can analyze the entire program and
possibly reduce the number of operations. Can we
simplify the above algorithm to use a single
arithmetic operation?
11-3
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
C
Source and
Header Files
Compiling a C Program
Entire mechanism is usually called
the “compiler”
Preprocessor (No Java equivalent)
• macro substitution
• conditional compilation
• “source-level” transformations
output is still C
Linker
• combine object files
(including libraries)
into executable image
Compiler
Source Code
Analysis
Symbol Table
Target Code
Synthesis
Compiler
• generates object file
machine instructions
C Preprocessor
Library
Object Files
Linker
Executable
Image
11-4
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Multi-Pass Compiler
Source Code Analysis (Java does this)
• “front end”
• parses programs to identify its pieces
variables, expressions, statements, functions, etc.
• depends on language (not on target machine)
Code Generation (JVM or JIT does this)
•
•
•
•
“back end”
generates machine code from analyzed source
may optimize machine code to make it run more efficiently
very dependent on target machine
Symbol Table
• map between symbolic names and items
• like assembler, but more kinds of information
11-5
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Compiling and Linking
Various compilers available
• cc, gcc
• includes preprocessor, compiler, and linker
Lots and lots of options!
• level of optimization, debugging
• preprocessor, linker options
• intermediate files -object (.o), assembler (.s), preprocessor (.i), etc
•
•
•
•
gcc –S file.c // to spit out the assembly file (.s)
gcc –c file.c // spits out the object file (.o)
gcc file.c // produces a.out
gcc –o myprogram file.c // “-o” allows you to name output
11-6
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Major differences between C and Java
Preprocessor allows for efficient naming of constants
No String or boolean types
Keyboard input and monitor output
static, public, and private are slightly different
Memory allocation – must deallocate memory explicitly
No objects in C – though we can group data together.
How references / pointers are used
Most other differences are minor.
11-7
Equivalent to
Preprocessor
“import”
A Simple C Program
directive
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
#include <stdio.h>
#define STOP 0
Equivalent to
String[] args
“static public”
/* No
Function:
main
*/
/* Description: counts down from user input to STOP */
int main(int argc, char *argv[])
Declarations
{
are the same
/* variable declarations */
int counter; /* an integer to hold count values */
int startPoint; /* starting point for countdown
Printing*/a
/* prompt user for input */
screen
printf("Enter a positive number: ");
scanf("%d", &startPoint); /* read into startPoint */
/* count down and print count */
for (counter=startPoint; counter >= STOP; counter--)
printf("%d\n", counter);
Reading from
}
Printing an
the keyboard
11-8
integer
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Preprocessor Directives
#include <stdio.h>
#include <stdlib.h>
• These are the most common library files in C
• To make your functions visible to other code, place prototype
into a .h file
no restrictions -- could be any C source code
#define STOP 0
• Before compiling, preprocessor replaces all instances of the
string "STOP" with the string "0"
• Called a macro
• Used for values that won't change during execution,
but might change if the program is reused. (Must recompile.)
• Lots and lots of other uses – we might learn some later
11-9
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Comments
Begins with /* and ends with */
Can span multiple lines
Cannot have a comment within a comment
Comments are not recognized within a string
• example: "my/*don't print this*/string"
would be printed as: my/*don't print this*/string
// - style commenting is C++. Some C compilers accept it.
As before, use comments to help reader, not to confuse
or to restate the obvious
11-10
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
main Function
Every C program must have a function called main().
argc contains the number of arguments
argv is an array of char pointers (array of strings), just like
in Java
main(int argc, char *argv[])
{
/* code goes here */
}
11-11
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Variable Declarations – Just like Java
int counter, startPoint;
Predefined types in C:
int
integer (at least 16 bits) – short, long
double floating point (at least 32 bits)
char
character (at least 8 bits)
Sizes are influenced by register sizes of computer.
Declaring arrays in C:
int myArray[5];
Declaring references (pointers) in C:
int *myArray;
Dereferencing a pointer:
myArray[0] = 5;
*myArray = 5;
Note: In Java, references are tied to the type. No
references to primitive types, only references to objects.
11-12
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Literals
Integer
123
/* decimal */
-123
0x123 /* hexadecimal */
Floating point
6.023
6.023e23
5E12
/* 6.023 x 1023 */
/* 5.0 x 1012 */
Character
'c'
'\n' /* newline */
'\xA' /* ASCII 10 (0xA) */
11-13
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Bitwise Operators – the same as Java
Symbol
~
<<
>>
&
^
|
Operation
bitwise NOT
left shift
right shift
bitwise AND
bitwise XOR
bitwise OR
Usage
~x
x << y
x >> y
x & y
x ^ y
x | y
Precedence
Assoc
4
r-to-l
8
l-to-r
8
l-to-r
11
l-to-r
12
l-to-r
13
l-to-r
Operate on variables bit-by-bit.
• Like LC-3 AND and NOT instructions.
Shift operations are logical (not arithmetic).
Operate on values -- neither operand is changed.
11-14
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Logical Operators – Same syntax as Java
Different semantics since C has no boolean values
Symbol
Operation
Usage
Precedence
!
logical NOT
!x
4
&&
logical AND
x && y
14
||
logical OR
x || y
15
Assoc
r-to-l
l-to-r
l-to-r
Treats entire variable (or value)
as TRUE (non-zero) or FALSE (zero).
Result is 1 (TRUE) or 0 (FALSE).
11-15
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Input and Output
Variety of I/O functions in C Standard Library.
Must include <stdio.h> to use them.
printf("%d\n", counter);
• String contains characters to print and
formatting directions for variables.
• This call says to print the variable counter as a decimal integer,
followed by a linefeed (\n).
scanf("%d", &startPoint);
• String contains formatting directions for looking at input.
• This call says to read a decimal integer and assign it to the
variable startPoint. (Don't worry about the & yet.)
11-16
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
More About Output
Can print arbitrary expressions, not just variables
printf("%d\n", startPoint - counter);
Print multiple expressions with a single statement
printf("%d %d\n", counter,
startPoint - counter);
Different formatting options:
%d decimal integer
%x hexadecimal integer
%c ASCII character
%f floating-point number
%s string (char *)
11-17
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Examples
This code:
printf("%d
printf("43
printf("43
printf("43
is a
plus
plus
plus
prime
59 in
59 in
59 as
number.\n", 43);
decimal is %d.\n", 43+59);
hex is %x.\n", 43+59);
a character is %c.\n", 43+59);
produces this output:
43
43
43
43
is a
plus
plus
plus
prime
59 in
59 in
59 as
number.
decimal is 102.
hex is 66.
a character is f.
11-18
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Examples of Input
Many of the same formatting characters are
available for user input.
scanf("%c", &nextChar);
• reads a single character and stores it in nextChar
scanf("%f", &radius);
• reads a floating point number and stores it in radius
scanf("%d %d", &length, &width);
• reads two decimal integers (separated by whitespace),
stores the first one in length and the second in width
Must use ampersand (&) for variables being modified.
This is the symbol for “address of” because it needs to know where to
place the input.
11-19
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
public – everyone can see it
static
– always
exists
Scope in Java – For those who
know
Java
private – only MyClass code sees it
class MyClass {
static – always exists
public static int globalItem;
private static int onlyISeeGlobal;
Only exists during function call
Only accessible within function call
int myFunction()
{
int localItem;
Only exists while in if statement
if (true)
Hides earlier variable
{
int localItem; // hides early variable
} // if true
} // end of myFunction
} // end of MyClass
11-20
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Scope: Global and Local
Where is the variable accessible?
Global: accessed anywhere in program
Local: only accessible in a particular region
Compiler infers scope from where variable is declared
• programmer doesn't have to explicitly state
Variable is local to the block in which it is declared
• block defined by open and closed braces { }
• can access variable declared in any "containing" block
Global variable is declared outside all blocks
11-21
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example
#include <stdio.h>
int itsGlobal = 0;
main()
{
int itsLocal = 1;
/* local to main */
printf("Global %d Local %d\n", itsGlobal, itsLocal);
{
int itsLocal = 2;
/* local to this block */
itsGlobal = 4;
/* change global variable */
printf("Global %d Local %d\n", itsGlobal, itsLocal);
}
printf("Global %d Local %d\n", itsGlobal, itsLocal);
}
Output
Global 0 Local 1
Global 4 Local 2
Global 4 Local 1
11-22
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example
#include <stdio.h>
int itsGlobal = 0;
main()
{
int itsLocal = 1;
/* local to main */
printf("Global %d Local %d\n", itsGlobal, itsLocal);
{
itsLocal = 2;
/* local to this block */
itsGlobal = 4;
/* change global variable */
printf("Global %d Local %d\n", itsGlobal, itsLocal);
}
printf("Global %d Local %d\n", itsGlobal, itsLocal);
}
Output
Global 0 Local 1
Global 4 Local 2
Global 4 Local 2
11-23
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Scope Example 2
#include <stdio.h>
int nextCount(); // function prototype so compiler knows it exists
main()
{
int itsStatic = 5;
printf(“Counter: %d %d\n", nextCount(), itsStatic++);
printf(“Counter: %d,%d\n", nextCount(), itsStatic++);
printf(“Counter: %d\n", nextCount());
printf(“Counter: %d\n", nextCount());
}
int nextCount()
{
static int itsStatic = 0;
return ++itsStatic;
}
only visible in this function
static – always exists
Output
Counter:
Counter:
Counter:
Counter:
1, 5
2, 6
3
4
11-24
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Scope Example 2
#include <stdio.h>
int nextCount(); // function prototype so compiler knows it exists
main()
{
int itsStatic = 5;
printf(“Counter: %d %d\n", nextCount(), itsStatic++);
printf(“Counter: %d,%d\n", nextCount(), itsStatic++);
printf(“Counter: %d\n", nextCount());
printf(“Counter: %d\n", nextCount());
}
int nextCount()
{
static int itsStatic = 0;
return itsStatic++;
}
only visible in this function
static – always exists
Output
Counter:
Counter:
Counter:
Counter:
0, 5
1, 6
2
3
11-25
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Making variables visible to other programs
Must be a global variable where allocated
declared extern in other file
extern int otherGlobal;
Common practice:
Place “extern int otherGlobal” in code.h file
Place “int otherGlobal” in code.c file
Anyone who wants to use otherGlobal includes code.h:
#include “code.h”
Note: There can only be one instance of “int otherGlobal” declared
globally throughout all files. All global variables must have distinct
names.
11-26
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Local Variable Storage
Local variables are stored in an
activation record, also known as a stack frame.
Symbol table “offset” gives the
distance from the base of the frame.
• R5 is the frame pointer – holds address
of the base of the current frame.
• A new frame is pushed on the
run-time stack each time a block is entered.
• Because stack grows downward,
R5
base is the highest address of the frame,
and variable offsets are <= 0.
seconds
minutes
hours
time
rate
amount
11-27
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Allocating Space for Variables
Global data section
0x0000
• All global variables stored here
(actually all static variables)
• R4 points to beginning
Run-time stack
•
•
•
•
Used for local variables
R6 points to top of stack
R5 points to top frame on stack
New frame for each block
(goes away when block exited)
Offset = distance from beginning
of storage area
0xFFFF
• Global: LDR R1, R4, #4
• Local: LDR R2, R5, #-3
instructions
global data
run-time
stack
PC
R4
R6
R5
11-28
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Variables and Memory Locations
In our examples,
a variable is always stored in memory.
When assigning to a variable,
must store to memory location.
A real compiler would perform code optimizations
that try to keep variables allocated in registers.
Why?
11-29
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example: Compiling to LC-3
#include <stdio.h>
int inGlobal;
main()
{
int inLocal;
/* local to main */
int outLocalA;
int outLocalB;
/* initialize */
inLocal = 5;
inGlobal = 3;
/* perform calculations */
outLocalA = inLocal++ & ~inGlobal;
outLocalB = (inLocal + inGlobal) - (inLocal - inGlobal);
/* print results */
printf("The results are: outLocalA = %d, outLocalB = %d\n",
outLocalA, outLocalB);
}
11-30
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example: Symbol Table
Name
Type
Offset
Scope
inGlobal
int
0
global
inLocal
int
0
main
outLocalA
int
-1
main
outLocalB
int
-2
main
11-31
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example: Code Generation
; main
; initialize variables
AND R0, R0, #0
ADD R0, R0, #5 ; inLocal = 5
STR R0, R5, #0 ; (offset = 0)
AND R0, R0, #0
ADD R0, R0, #3
STR R0, R4, #0
; inGlobal = 3
; (offset = 0)
11-32
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example (continued)
; first statement:
; outLocalA = inLocal++
LDR R0, R5, #0 ;
ADD R1, R0, #1 ;
STR R1, R5, #0 ;
LDR
NOT
AND
STR
R1,
R1,
R2,
R2,
R4, #0
R1
R0, R1
R5, #-1
;
;
;
;
;
& ~inGlobal;
get inLocal
increment
store
get inGlobal
~inGlobal
inLocal & ~inGlobal
store in outLocalA
(offset = -1)
11-33
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example (continued)
; next statement:
; outLocalB = (inLocal + inGlobal)
;
- (inLocal - inGlobal);
LDR R0, R5, #0 ; inLocal
LDR R1, R4, #0 ; inGlobal
ADD R0, R0, R1 ; R0 is sum
LDR R2, R5, #0 ; inLocal
LDR R3, R5, #0 ; inGlobal
NOT R3, R3
ADD R3, R3, #1
ADD R2, R2, R3 ; R2 is difference
NOT R2, R2
; negate
ADD R2, R2, #1
ADD R0, R0, R2 ; R0 = R0 - R2
STR R0, R5, #-2 ; outLocalB (offset = -2)
11-34
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )