360 likes | 513 Views
Week 3 - Friday. CS222. Last time. What did we talk about last time? Bitwise practice Precedence. Questions?. Project 1. Quiz. Quotes. Unix is simple. It just takes a genius to understand its simplicity. Dennis Ritchie. Control flow.
E N D
Week 3 - Friday CS222
Last time • What did we talk about last time? • Bitwise practice • Precedence
Quotes Unix is simple. It just takes a genius to understand its simplicity. Dennis Ritchie
Control flow • Sequences of statements surrounded by braces are treated like a single statement with no value • Braces can be thrown in whenever you want • We used to say that "braces were optional" for one-line blocks, but this is the more accurate way to look at it • An expression can always become a statement inta = 150; a; //legal in C, illegal in Java
if statements • Like Java, the body of an if statement will only execute if the condition is true • The condition is evaluated to an int • True means not zero • An else is used to mark code executed if the condition is false Sometimes this is natural and clear; at other times it can be cryptic.
Anatomy of an if Any expression that has a value The if part if( condition ) statement Any single statement ending in a semicolon or a block in braces
Anatomy of an if-else if( condition ) statement1 else statement2 Two different outcomes
Nesting • We can nest if statements inside of other if statements, arbitrarily deep • Just like Java, there is no such thing as an elseif statement • But, we can pretend there is because the entire if statement and the statement beneath it (and optionally a trailing else) is treated like a single statement
switch statements • switch statements allow us to choose between many listed possibilities • Execution will jump to the matching label or to default (if present) if none match • Labels must be constant (either literal values or #define constants) • Execution will continue to fall through the labels until it reaches the end of the switch or hits a break • Don't leave out break statements unless you really mean to!
Anatomy of a switch statement switch( data ) { case constant1: statements1 case constant2: statements2 … case constantn: statementsn default: default statements }
Duff's device • C has relatively relaxed syntax rules • What the hell is that?! int n = (count + 7) / 8; switch(count % 8) { case0: do { *to++ = *from++; case7: *to++ = *from++; case6: *to++ = *from++; case5: *to++ = *from++; case4: *to++ = *from++; case3: *to++ = *from++; case2: *to++ = *from++; case1: *to++ = *from++; } while(--n > 0); }
Three loops • C has three loops, just like Java • while loop • You don't know how many times you want to run • for loop • You know how many times you want to run • do-while loop • You want to run at least once • Like if statements, the condition for them will be evaluated to an int, which is true as long as it is non-zero • All loops execute as long as the condition is true
while loop • A while loop is the keyword while followed by a pair of parentheses • Within the parentheses is a condition • If the condition is true, the body of the loop will be executed • At the end of the loop, the condition is checked again
Anatomy of a while loop while( condition ) statement
for loop • A for loop consists of three parts: • Initialization • Condition • Increment • The initialization is run when the loop is reached • If the condition is true, the body of the loop will be executed • At the end of the loop, the increment will be executed and the condition checked again • If the condition is empty (nothing in it), it is considered true
Anatomy of a for loop Starting Point Way to Progress for ( initialization ; condition ; increment ) statement Ending Point
The comma operator • C has a comma operator • Expressions can be written and separated by commas • Each will be evaluated, and the last one will give the value for the entire expression int a = 10; int b = 5; intc = a, b, ++a, a + b; //16
Adding the comma to for • Sometimes you want to do multiple things on each iteration • Consider this code to reverse an array • You can even use a comma in the condition part, but it doesn't usually make sense intstart; intend; int temp; for( start = 0, end = length - 1; start < end; start++, end-- ) { temp = array[start]; array[start] = array[end]; array[end] = temp; }
do-while loops • As in Java, there are do-while loops which are useful only occasionally • They work just like while loops except that that they are guaranteed to execute at least once • Unlike a while loop, the condition isn’t checked the first time you go into the loop • Sometimes this is useful for getting input from the user • Don't forget the semicolon at the end!
Anatomy of a do-while loop do statement while( condition );
Infinite loops • Loops can go on forever if you aren’t careful int n = 40; inti = 1; while( i <= 40 ) { printf("%d", i); //supposed to print all the numbers //less than 40, but i never increases }
Infinite for loops • Infinite for loops are unusual, but possible: • This situation is more likely: for( ; ; ) printf("Hey!"); inti; for(i = 0; i < 10; i++ ) { • printf("%d", i); • //lots of other code i--; //whoops, maybe changed from while? }
(Almost) infinite loops • Overflow and underflow will make some badly written loops eventually terminate inti; for( i = 1; i <= 40; i-- ) • //whoops, should have been i++ • printf("%d", i);
Fencepost errors • Being off by one is a very common loop error inti; for( i = 1; i < 40; i++ ) //runs 39 times • printf("%d", i);
Skipping loops entirely • If the condition isn’t true to begin with, the loop will just be skipped • inti; for( i = 1; i >= 40; i++ ) //oops, should be <= • printf("%d", i);
Misplaced semicolon • A misplaced semicolon can cause an empty loop body to be executed • Everything looks good, loop even terminates • But, only one number will be printed: 41 • Misplaced semicolon usually makes a while loop infinite inti; for( i = 1; i <= 40; i++ ); //semicolon is wrong { • printf("%d", i); }
Next time… • Systems programming concepts • Functions and prototypes
Reminders • Read LPI chapter 3 and K&R chapter 4 • Project 1 due tonight by midnight!