C #include <stdio.h> int main() printf ("hello class\n"); return 0;
Working environment Linux, gcc We ll work with c9.io website, which works with ubuntu I recommend to install ubuntu too Also in tirgul 2
History C C++ Java 70 s Development of UNIX. (Richie+Kernigham Bell labs) 80 s Large efficient code. (Stroustrup Bell labs) 90 s Language for the web. (Sun Microsystems) Simple to convert to machine code. VM Fast and Efficient Secure and Safe 3 Welcome to C Easy to avoid bugs Easy to Debug
History C: First "standard" Default int Enums Return struct void // VLA variadic macros inlining multithreading Anonymous structs _Generic K&R 1 st ed. ('78) ANSI C ('89) C99 ('99) C11( 11) This course, without the VLA!
C Design Decisions Bare bones the language leaves maximal flexibility with the programmer Efficient code (operating systems) Full control on memory & CPU usage High-level Type checking High-level constructs Portable Standard language definition Standard library 5
C Warning Signs No run-time checks Array boundary overruns Illegal pointers No memory management Programmer has to manage memory 6
First Program in C // This line is a comment, /* and this line also. */ // This line defines standard I/O library #include <stdio.h> // main program entry point. Start form here int main() // define a block printf("hello class!\n"); return 0; 7
The basic syntax Similar to java you should know it already. 8
Basic Case sensitive White-space not important. End statements with ; Code block defined with and Return value from function using return X; String with " All lines below are legal: int x,y; x=5; x; ; 9
Statements - conditional if (expression) //statement or block else if (expression) //statement or block else (expression) //statement or block switch (integer value) later... 10
Statements - loops The usual suspects: int x,y; //in ANSI C you cannot declare inside the for! for (x=0,y=0;x<10 && y<5;x++,x+=2) //statement or block while (condition) //statement or block 11 do //statement or block while (condition)
Variables Statically typed each variable has a type. Declare by: <type> <name>. int x; int x,y; Optionally initialize (otherwise undefined!) int x=0; 12
Undefined important! int x; Undefined value: as in this example, can have any T (here T=int) value. Undefined behavior: Everything may happen. Probably won t format your disk, but may very well give a hacker a way to do it The biggest problem: often programs seems to work fine although their behavior is undefined, and then 13
Variables Where to declare? 1. Inside a block (C89 - block beginning), will be visible only in block. 2. Outside all blocks global - will be visible everywhere. int x=0; // global int main() int x=1; //local hides global int x=2; //local hides outer scope //x is 2 //x is 1 again! 14
Scopes 15 Code block defined with and. Only declarations inside current or outer scopes are visible. Declarations in inner scope hide declarations in outer scopes: Outmost scope (global) had no brackets. Keep in mind that a function is also a scope. int y=5,x=0; int x=y; //x is 5 int y; // x is 0
Second Program #include <stdio.h> int main() int i; // declares i as an integer int j = 0; // declares j as an integer, // and initializes it to 0 // for( initial ; test condition ; update step ) for( i = 0; i < 10; ++i ) j += i; // shorthand for j = j + i printf("%d %d %d\n", i, j, (i*(i+1))/2); return 0; 16
Running 0 0 0 1 1 1 2 3 3 3 6 6 4 10 10 5 15 15 6 21 21 7 28 28 8 36 36 9 45 45 17
Functions C allows to define functions Syntax: Return type int power( int a, int b ) return 7; Return statement Parameter declaration 18
Procedures Functions that return void void power( int a, int b ) return; Return w/o value (optional) 19
Example printing powers 20 #include <stdio.h> int power( int base, int n ) int i, p; p = 1; for( i = 0; i < n; i++ ) p = p * base; return p; int main() int i; for( i = 0; i < 10; i++ ) printf("%d %d %d\n", i, power(2,i), power(-3,i) ); return 0;
Functions Declaration void funca()... void funcb() funca(); void funcc() funcb(); funca(); funcb(); void funca()... void funcb() funcc(); void funcc() funcb(); Rule 1 : A function knows only functions which were declared above it. Error: funcc is not known yet. 21
Functions Declaration Amendment to Rule 1 : Use forward declarations. void funcc(int param); // or: void funcc(int); void funca() 22 void funcb() funcc(7); void funcc(int param)
Boolean variables non! int main() int a = 5; while(1) if(!(a-3)) printf("** a=3 **\n"); break; printf("a=%d\n",a--); return 0; 23
Building a program in C: Preprocessor, Compilation and Linkage 24
Building a program in C Preprocessor A text processor Commands start with # // copy & paste the file here #include <stdio.h> hello.c Preprocessor tmpxq.i (C code) stdio.h 25
Building a program in C Compiling Takes input C-code and produces machine code (object file) The object file does not contain all external references: It leaves names, such as printf, area, etc. as undefined references hello.c Preprocessor tmpxq.i (C code) Compiler 26 stdio.h hello.o (object file)
Linking Combines object file with external references into an fully executable file, with no unresolved references Main.c Main.o libc.a Main Preprocessor, Compiler Linker 27
Link errors Gcc: /media/sf_biteagle_projects/cbitcoin/test/testc BAddress.c:40: undefined reference to `CBNewByteArrayFromString Visual studio: Error 1 error LNK2019: unresolved external symbol _foo referenced in function _main c:\users\ofirpele\documents\visual studio 2012\Projects\ConsoleApplication5\ConsoleAp plication5\consoleapplication5.obj ConsoleApplication5 28
29 The Preprocessor
Compilation in C hello.c Preprocessor tmpxq.i (C code) Compiler stdio.h hello.o (object file) 30
Preprocessor A single-pass program that: 1. Include header files 2. Expands macros 3. Control conditional compilation 4. Remove comments Outputs a code ready for the compiler to work on. 31
Preprocessor In linux with gcc, we can test what the preprocessor does: > gcc E hello.c will print the C code after running the preprocessing 32
#include directive #include "foo.h" Include the file foo.h, from current directory #include <stdio.h> Include the file stdio.h from the standard library directory (part of compiler installation) 33
Modules & Header files Square.h // interface of function int area... (int x1,int y1, int x2, int y2); Complex.c Main.c #include "Square.h" int main() area (2,3, 5,6); Square.c #include "Square.h" #include <math.h> // implementation int area (int x1,int y1,int x2, int y2)... 34
Do all files get compiled every time we build the program??? $ gcc c Square.c o Square.o $ gcc c Main.c o Main.o $ gcc Square.o Main.o o Main Square.c Main.c Square.o Main.o libc.a Main Preprocessor Compiler Linker 35
Header files Header file contain 1. Definition of data types 2. Declarations of functions & constants 3. That are shared by multiple modules. #include directive allows several modules to share the same set of definitions/declarations 36
#define directive #define FOO 1 int x = FOO; is equivalent to int x = 1; 37
#define with arguments #define SQUARE(x) x*x b = SQUARE (a); is the same as b = a*a; 38
#define cautions #define SQUARE (x) x*x b = SQUARE (a+1); c = SQUARE (a++); Is it what we intended? b = a+1*a+1; //Actually: b = 2*a+1; c = a++*a++; //Actually: c = a*a; a+=2; 39
#define cautions #define SQUARE (x) ((x)*(x)) b = SQUARE (a+1); c = SQUARE (a++); Is it what we intended? b = ((a+1)*((a+1)); //Now ok c = ((a++)*(a++)); //Did not help: c = a*a; a+=2; 40
#define #define directive should be used with caution! Alternative to macros: Constants enum FOO = 1 ; or const int FOO = 1; Functions inline functions (C99,C++) 41
#define Multi-line: All preprocessor directive effect one line (not c statement). To insert a line-break, use \ : BAD: #define x (5 + 5) // x == 10! GOOD: #define x (5 + \ 5) // x == 10! 42
#if directive Allows to have conditional compilation #if defined(debug) // compiled only when DEBUG exists printf("x = %d\n", X); #endif 43
#ifndef for header safety Complex.h: struct Complex... MyStuff.h: #include "Complex.h" Main.c: #include "MyStuff.h" #include "Complex.h" Error: Complex.h:1: redefinition of `struct Complex' 44
#ifndef header safety Complex.h (revised): #ifndef COMPLEX_H #define COMPLEX_H struct Complex... #endif Main.c: #include "MyStuff.h" #include "Complex.h" // no error this time 45
#pragma once header safety Complex.h (revised): #pragma once struct Complex... Main.c: #include "MyStuff.h" #include "Complex.h" // no error this time 46
Preprocessor summary Text processing program. Does not know c rules Operates before compilation, output passed to compiler. Can do copy and paste / cut #include paste the included file here Commonly included file (.h by convention) contains forward declarations #define copy the macro body, paste it where macro name appears - constants, simple "functions" #if condition not fulfilled, cut the code - Conditional compilation e.g. debugging code 47
Debug/Test mode vs Release mode 48
Debug/Test mode vs Release mode #include <assert.h> #define MAX_INTS 100 int main() int ints[max_ints]; // i should be in bounds, but is it really? i = foo(<something complicated>); // safety assertions assert(i>=0); assert(i<max_ints); ints[i] = 0;... 49
Debug/Test mode vs Release mode #include <assert.h> #define MAX_INTS 100 int main() int ints[max_ints]; // i should be in bounds, but is it really? i = foo(<something complicated>); // safety assertions assert(i>=0); assert(i<max_ints); ints[i] = 0;... 50
#define NDEBUG #include <assert.h> #define MAX_INTS 100 int main() int ints[max_ints]; // i should be in bounds, but is it really? i = foo(<something complicated>); // safety assertions assert(i>=0); assert(i<max_ints); ints[i] = 0;... 51
assert // bad, foo() will not be called // if the compiler removes the assert() // if NDEBUG is defined assert(foo() == 0); // good int errcode = foo(); assert(errcode == 0); 52
assert Use for: Catching bugs Don't use for: checking malloc, user input,... 53
assert.h #include <assert.h> // Sqrt(x) - compute square root of x // Assumption: x non-negative double sqrt(double x ) assert( x >= 0 ); // aborts if x < 0 54
assert.h // procedure that actually prints error message void assert(char* file,int line,char* test); #ifdef NDEBUG #define assert(e) ((void)0) #else #define assert(e) \ ((e)? (void)0 : \ assert( FILE, LINE, #e)) #endif 55
assert.h Important coding practice Declare implicit assumptions Sanity checks in code Check for violations during debugging/testing 56
57 Compilation
Compilation Translate the c code to machine code. Every machine architecture has a different code. Need separate compilation. x86 : older but still common PCs 32-bit (Intel/AMD) x64 : newer PCs 64-bit (Intel/AMD) ARM : (many versions) Phones, tablets (ARM) Translated code is an executable the OS can load it to the machine memory, and the let the CPU do whatever you wrote in the code. 58
Assembly int y=2; int mult(int x) return x*y; mov eax,dword ptr [x] imul eax,dword ptr [1177000h] int main() return mult(5); push 5 call 11711A4h 59 Only part of the assembly code is shown here. Actually each command has binary code, and the sequence of these code is the object file.
Compiling warnings
Compiling warnings Add -Wall flag to catch things like this: if (i=3) //bug, we meant i==3 61