Академический Документы
Профессиональный Документы
Культура Документы
CIT 593 2
1
Syntax Compiling and Executing C programs Compilation Process
C
In the folder that contains the source code do for: Entire mechanism is usually called the compiler Source and
Header Files
Preprocessor
Acts upon C preprocessor directives
Compiling the program “Source-level” transformations C Preprocessor
Linker
./a.out
Combine object files (including libraries)
Executable
into executable image Image
Operators
p
Predefined actions performed on data items
Begins with // and ends with “end of line” E.g. *, +, /, ||, |, &&
Single-line comment Expressions
¾ E.g. //This is a comment Operators combined with variables/literals to form expressions
E.g. x * y
Introduced in C++, later back-ported to C
Statements
Compiling with ansi standards, gives error A defined behavior
Constitutes a unit of work for high-level language
Ends with a semicolon. E.g. z = x * y;
Why use comments ? Functions
Help readers understand programs better Named group of statements
Provides modularity to program
Enforces, DRY principle (Do not Repeat Yourself)
2
C program structure Variable Properties
int main(){ Identifier: variable name
/*
code goes here
Type: how data is interpreted, and how much space it
*/
needs
return 0;
Syntax:<type> <identifier>
}
Every C program must have the above format to develop
Later we will discuss:
application program(s)
One of files must contain above structure Scope: is the region of the program in which the variable is
¾ main is a special function in C alive and accessible
¾ similar to Java’s main method
Starting point for every program Storage: how C compiler allocates storage and whether or
All C programs start and finish execution in the main not the variable loses its value when the section that
Note: int main(int argc, char **argv) – main function can contains it has completed execution
also take arguments like in Java
CIT 593 9 CIT 593 10
3
Types Additional to Data Type
C has several basic data types
Literal
int integer (at least 16 bits, commonly 32 bits) Values we write in a conventional form whose value is
long integer (at least 32 bits) obvious
float floating point (at least 32 bits)
double floating point (commonly 64 bits)
char character (at least 8 bits)
Constant
Exact size can vary, depending on processor Variable whose values do not change during the
int is supposed to be "natural" integer size execution of the program
¾ 32 bits for most modern processors
So how do I know the size?
This is done by appending “const” before the type
¾ Use unary operator called sizeof. E.g. sizeof(int)
– returns answer in bytes
Symbol
Signed vs. unsigned:
Like constants but is preprocessor directive
Default is 2’s complement signed integers
Use “unsigned” keyword for unsigned numbers
CIT 593 13 CIT 593 14
4
Symbol is C Preprocessor Directive Expression
Symbol start with #define Expression
Must go before the “main function syntax” Any combination of literals, variables, constants,
operators, and function calls
Every expression has a type
type, derived from the types
Example: #define RADIUS 15.0 of its components (according to C typing rules)
Before compiling, replace all instances of the string
“RADIUS“ in the code with the string “15.0"
Examples:
Also known as a macro
Used for values that won't change during execution,
PI * RADIUS * RADIUS;
but might change if the program is reused(Must x + sqrt(y) //sqrt is function with input y
recompile)
x % 6 == 0
Statement Operators
Expresses a complete unit of work Three things to know about each operator
Executed in sequential order
(1) Function
Simple statement ends with semicolon (note: “;” is not a What does it do?
comment
co e t in C)
(2) Precedence
z = x * y; /* assign product to z */ In which order are operators combined?
y = y + 1; /* update y */ Example:
"a * b + c * d" is the same as "(a * b) + (c * d)"
; /* null statement */ because multiply (*) has a higher precedence than addition (+)
sqrt(y); /* containing a function call*/
(3) Associativity
Compound statement formed with braces In which order are operators of the same precedence combined?
Syntactically equivalent to a simple statement Example:
{ z = x * y; y = y + 1; } "a - b - c" is the same as "(a - b) - c"
because add/sub associate left-to-right
5
Assignment Operator Assignment Operator (contd..)
Changes the value of a variable All expressions evaluate to a value
x = x + 4; Even ones with the assignment operator e.g. y = x = 3
Assignment
g associates right
g to left
y = x = 3;
y gets the value 3, because (x = 3) evaluates to the value 3
y = (x = 3);
6
Relational Operators AND, OR, NOT
Symbol Operation Usage Precedence Assoc Two states: TRUE=1, FALSE=0
> greater than x > y 9 l-to-r
>= greater than or equal x >= y 9 l-to-r A B A AND B A B A OR B A NOT A
< less than x < y 9 l-to-r 0 0 0 0 0 0 0 1
0 1 0 0 1 1 1 0
<= less than or equal x <= y 9 l-to-r
1 0 0 1 0 1
== equal x == y 10 l-to-r 1 1 1 1 1 1
!= not equal x != y 10 l-to-r
View n
n-bit
bit number as a collection of n logical values
Result is non-zero (TRUE) or zero (FALSE) Operation applied to each bit independently (bitwise
operators)
No boolean data type in C
¾ Applications e.g. water marking, cryptography
All logical work is done via integer data type
Logical Operator is different from bitwise operators Conditions allow change in the control flow
Can skip certain instructions based on condition
Treats entire variable (or value) as TRUE (non-zero), or
FALSE (zero) if((c == ‘q’) || (c == ‘Q’)){
E.g.
Eg 1 && 8 = 1 (True && True = True) //Quit game
}
7
Bitwise Operators
Examples of Bitwise AND, OR, NOT
Symbol Operation Usage Precedence Assoc
~ bitwise NOT ~x 4 r-to-l AND
11000101
<< left shift x << y 8 l-to-r Useful for clearing bits
>> right shift x >> y 8 l-to-r ¾ AND with zero = 0 AND 00001111
& bitwise AND x & y 11 l-to-r ¾ AND with one = no change 00000101
^ bitwise XOR x ^ y 12 l-to-r
| bitwise OR x | y 13 l-to-r
OR 11000101
Bit-wise vs Logical AND Useful for setting bits OR 00001111
1 & 8 = 0 (000001 AND 001000 = 000000) ¾ OR with zero = no change
1 && 8 = 1 (True && True = True) ¾ OR with one = 1 11001111
NOT
NOT 11000101
Unary operation -- one argument
00111010
Flips every bit
CIT 593 29 CIT 593 30
Shift Operator: << (Left Shift Operator) …C and the Right Shift Operator (>>)
Operate on values -- neither operand is changed Does right shift sign extend or not?
Answer: Yes and No
Left Shift (<<)
variable << shift amount Unsigned
g values: zero extend
Shifts bits to the left by shift amount unsigned int x = ~0;
Fills spaces equivalent to shift amount on the right side Then, (x >> 10) will have 10 leading zeros
with zeroes
x = y << 1 same as x = y + y or 2 * y
Signed values:
“Right shifting a signed quantity will fill with
sign bits (“arithmetic shift”) on some machines and
with
ith 0
0-bits
bit (“l
(“logical
i l shift”)
hift”) on others.”
th ” - Kernighan
K i h and d
Ritchie
In practice, it does sign extend
¾ int x = ~0; /* signed */
¾ Then, (x >> 10) will still be all 1s
CIT 593 31 CIT 593 32
8
Special Operators: ++ and -- Using ++ and --
Changes value of variable by 1 before (or after) its x = 4;
value is used in an expression y = x++;
Results: x = 5, y = 4
Symbol Operation Usage PrecedenceAssoc (b
(because x iis iincremented
t d after
ft assignment)
i t)
++ postincrement x++ 2 r-to-l
-- postdecrement x-- 2 r-to-l x = 4;
++ preincrement ++x 3 r-to-l y = ++x;
-- predecrement --x
x 3 rr-to-l
to l Results: x = 5, y = 5
(because x is incremented before assignment)
Pre: Increment/decrement variable before using its value
Post: Increment/decrement variable after using its value
9
Output Examples
printf(“Counter value is %d\n", counter);
print the variable counter as a decimal integer, followed by a
linefeed (\n)
This code:
Linefeed will make the cursor go onto next line printf("%d is a prime number.\n", 43);
printf("43 plus 59 in decimal is %d.\n",
Can print arbitrary expressions, not just variables 43+59);
3 9
printf("%d\n", startPoint - counter); printf("43 plus 59 in hex is %x.\n",
43+59);
printf("43 plus 59 as a character is
Print multiple expressions with a single statement %c.\n", 43+59);
printf("%d %d\n", counter, startPoint - counter);
Examples of Input
scanf("%d", &startPoint);
read a decimal integer and assign it to the variable startPoint (& -
specifies the address of the operand….more on this when we do
pointers)
CIT 593 39
10