#include<stdio.h> int main(void) { /* requests two numbers and prints sum */ int a,b,c; printf("enter two numbers:\t"); scanf("%d %d",&a,&b); c = a + b; printf("the sum is %d\n",c); }
#include<math.h> /* provides M_PI */ #define C 3.0 int main() { float r, A; r = 0.3; A_over_C = (r*r * M_PI) / C; }
cc test.c | compile and create executable a.out |
cc test.c -o test | compile and create executable test |
cc test.c -c | compile test.c to object file (test.o) no executable is generated |
cc test.o -o test | create executable test from object file test.o |
#include<stdio.h> int main() { /* try this example also with floats. * what happens? what value is assigned to f */ int c, f; c = 0; f = 2/c; printf("%d",f); }
#include<stdio.h> int main() { int a; a = 0; scanf("%d",a); }
We say an operator op is left-to-right associative if
e_1 op e_2 ... op e_n == (...((e_1 op e_2) op e_3) ... op e_n).Otherwise an operator is right-to-left associative, meaning
e_1 op e_2 ... op e_n == (e_1 op (e_2 op (e3 op (...))))
It's good to be aware of the associativity of the operators. Arithmetic operators are usually left-to-right associative:
6/3/2 == ((6/3)/2) != (6/(3/2))
Operators take one or two values and evaluate the result. There are two types of operators:
Some operators also change the value of the operands like the assignment operator:
a = b assigns the value of b to the variable a . The value of this expression is b. This property allows you to write code as below. Question: What's the associativity rule for the assignment operator?
int a, b, c, d, e; a = b = c = d = e = 0
Here's another example: assume, b has value 1. The expression (a = b) + 1 evaluates to 2. As a side effect, a gets the value 1.
C has many more operators, perhaps the most useful operators are increment operators: The expression ++a increments a by one, and returns the result. However, the expression a++ increments a , but it returns the non-incremented (original) value.
Using these operators, one can write very compactly code - however, the semantic isn't always that obvious. Have a look at the following examples. Consider the initialization of a and b :
int a, b; a = 1; b = 2;
What are the values of the following expressions? How does an expression change a and b?
#include<stdio.h> int main() { /* The if statement has the syntax: * if conditional_expression * statement1 * else * statement2 */ char c; /* character variable */ c = 'b'; /* assign c the character 'b' */ if (c == 'a') printf("c == 'a'"); else printf("c != 'a'"); }
#include<stdio.h> int main() { /* the else-branch of the an if statement * can be omitted. What does this program * do? */ char c; c = 'b'; if (c == 'a') printf("c == 'a'"); }
#include<stdio.h> int main() { /* we can write group a sequence of statements * as a compound using "{", "}". That way we have * multiple statements in the if/else branches. */ int x, y; x = 1; y = 0; if (x == 1) { y = !x; printf("x == 1"); } else { y = x; printf("x != 0"); } }
#include<stdio.h> int main() { /* we can nest several if statements? * for which values of a and b is the * output XXX, resp. YYY? * is there a case when nothing is printed? */ int a; int b; a = 0; b = 3; if (a == 0) if (b == 1) printf("XXX\n"); else printf("YYY\n"); }
#include<stdio.h> int main() { /* for which values of a and b is the * output XXX, resp. YYY? */ int a = 0; int b = 3; if (a == 0) { if (b == 1) printf("XXX\n"); } else { printf("YYY\n"); } }
#include<stdio.h> int main() { /* the while statement is repeating the statements * repeats the statements in the loop-body as long * as the loop-condition is fulfilled (evaluates to * != 0) * * which values are printed during the iteration? * what's the value of x after the loop? */ int x; x = 0; while (x < 10) { printf("%d ",x); x++; } printf("\nafter loop %d",x); }
#include<stdio.h> int main() { /* the do statement is similar to the if statement * but the condition is checked after the execution * of the loop. * * is the output the same as for the program above? */ int x; x = 0; do { printf("%d ",x); x++; } while (x < 10); printf("\nafter loop %d",x); }
#include<stdio.h> int main() { /* what is printed in this case? */ int x; x = 11; while (x < 10) { printf("%d ",x); x++; } printf("\nafter loop %d",x); }
#include<stdio.h> int main() { /* do you now see the difference * between do and while loops? */ int x; x = 11; do { printf("%d ",x); x++; } while (x < 10); printf("\nafter loop %d",x); }
#include<stdio.h> int main() { /* a for-loop takes expressions for initialization, * loop-condition, and update after each iteration. * * Before the first iteration, the variables are initialized. * At each iteration the condition is checked. If it evaluates * to 1, the body of the loop is executed. After each single * iteration the update operation is evaluated. * * What is the output of this program? */ int i; for (i = 0; i < 10; i++) { printf("%d ",i); } printf("\nafter loop %d",i); }
while (cond) { statements }is equivalent to
if (cond) { do { statements } while (e) }
do { statements } while (cond)is equivalent to
statements while (cond) { statements }
#include<stdio.h> int main() { /* sum numbers 0 through 9 * do you know a closed form expression for this? */ int sum; int i; sum = 0; for (i = 0; i < 10; i++) { sum += i; } printf("sum:\t%d\n",sum); }
#include<stdio.h> int main() { /* compute the Fibonacci function * a(0) = 0 * a(1) = 1 * a(n) = f(n-1) + f(n-2), for n >= 1 * do you know any function which is growing * fast or faster than the Fibonacci function? */ int n; int i; int a_i, a_i_minus_1; int tmp; n = 10; a_i_minus_1 = 0; a_i = 1; i = 1; for (i = 1; i < n; i++) { /* maintains invariance: a_i == a(i) a_i_minus_1 == a(i-1) */ tmp = a_i; a_i = a_i + a_i_minus_1; a_i_minus_1 = tmp; } printf("a(%d) = %d\n",i,a_i); }
#include<stdio.h> int main() { /* sum user input * enter 0 to indicate end of input * * what do you need to change to archive the following: * the end-of-input should be indicated by 99. * i.e the output should be 4 for input 1 2 1 99? */ float sum; float number; sum = 0.0; do { printf("\n number:\t"); scanf("%f",&number); sum += number; } while (number != 0.0); printf("sum:\t%f\n",sum); }
#include<stdio.h> int main() { /* count a's, b'c and c's * in input string. * * terminate input by typing ctrl-d to mark * the end of input (EOF = end of file) * when using unix. */ char c; /* character variable */ int a_count, b_count, c_count; a_count = b_count = c_count = 0; /* we're using getchar to read a single character */ while ((c=getchar()) != EOF) { /* compare c to character 'a' rather than * one-character string "a" and increment * counters */ if (c == 'a') ++a_count; else if (c == 'b') ++b_count; else if (c == 'c') ++c_count; } printf("\n #a's: %d\t #b's: %d\t #c's: %d\n", a_count, b_count, c_count); }