Download presentation
Presentation is loading. Please wait.
Published byMolly Rogers Modified over 8 years ago
1
C #include int main() { printf ("hello class\n"); return 0; }
2
2 Faculty אחראי קורס: ד"ר אופיר פלא מרצים: ד"ר אופיר פלא ד"ר מירי בן ניסן גב' חרות סטרמן מתרגלים: גב' חרות סטרמן מר נהור גולן מר אלכס קורבצקי מר יהונתן מילשטיין
3
3 Communications Moodle Forums: News – must read Q & A – ask the staff about course material
4
4 Course Objectives C programming language Practice of programming: Style Testing & Debugging Efficiency & Portability Modularity Basic computer structure
5
5 Books “The C Programming Language”, Brian W. Kernighan & Dennis M.Ritchie More books in website
6
6 Course Grading Exercises Frontal checking of the exercises with the T.A. כל העבודה ביחידים (אסור זוגות, שלשות וכו) חלק מהתרגילים ייבדקו פרונטלית עם המתרגל!
7
Late Submission שבוע אחד: קנס 10 נקודות. אין צורך באישור לא יינתנו הארכות נוספות להגשת התרגילים. סיבות אישיות באישור הדיקנט: ללא קנס. בקשות להארכה מסיבות אישיות (הריון, מילואים, מחלה, נישואים של מבקש/ת הבקשה, הולדת ילד של מבקש/ת הבקשה) יש להפנות יחד עם האישורים המתאימים לדיקנט הסטודנטים. לאחר קבלת אישור מהדיקנט יש להגיש אותו למתרגל. עומס לימודים ומועדי ב: לא סיבה לאיחור לא לשלוח למרצה מייל עם בקשות להארכה!
8
8 Plagiarism policy You may discuss your exercise with friends You must not exchange any written material (or code) between students You must understand all the code that you submit
9
How 2 get a 100 for the hw? Be honest! Organize your time = start as early as possible Read very carefully the instructions. Ask in the forum if something is unclear. Check each part of your code, including edge cases. Learn & explore by yourself! 9
10
10 Working environment Linux, gcc – slides 0_linux_and_gcc We’ll work with c9.io website, which works with ubuntu I recommend to install ubuntu too Also in tirgul
11
History 11 70 ’ s – Development of UNIX. (Richie+Kernigham – Bell labs) 70 ’ s – Development of UNIX. (Richie+Kernigham – Bell labs) 80 ’ s – Large efficient code. (Stroustrup – 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 EfficientSecure and Safe Welcome to C Easy to avoid bugs Easy to Debug C++CJava
12
History – C: K&R 1 st ed. ('78) ANSI C ('89) C99 ('99) C11(’11) This course, without the VLA! First "standard" Default int Enums Return struct void // VLA variadic macros inlining multithreading Anonymous structs _Generic
13
13 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
14
C – Warning Signs 14 No run-time checks Array boundary overruns Illegal pointers No memory management Programmer has to manage memory
15
First Program in C 15 // This line is a comment, /* and this line also. */ // This line defines standard I/O library #include // main – program entry point. Start form here int main() { // {…} define a block printf("Hello class!\n"); return 0; } 15
16
Similar to java – you should know it already. 16 The basic syntax
17
Basic 17 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; } ;
18
Statements - conditional 18 if (expression) //statement or block else if (expression) //statement or block else (expression) //statement or block switch (integer value) later...
19
Statements - loops 19 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 do //statement or block while (condition)
20
Statically typed – each variable has a type. Declare by:. int x; int x,y; Optionally initialize (otherwise undefined!) int x=0; Variables 20 Important word in C. Everything may happen. Probably won’t format your disk, but may very well give a hacker a way to do it…
21
Variables 21 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! }
22
Scopes 22 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
23
Second Program 23 #include 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; } 23
24
Running… 24 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 24
25
Functions 25 C allows to define functions Syntax: int power( int a, int b ) { … return 7; } Return type Parameter declaration Return statement 25
26
Procedures 26 Functions that return void void power( int a, int b ) { … return; } Return w/o value (optional) 26
27
Example – printing powers 27 #include 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; } 27
28
Functions Declaration 28 “Rule 1”: A function “knows” only functions which were declared above it. void funcA() {... } void funcB() { funcA(); } void funcC() { funcB(); funcA(); funcB(); } void funcA() {... } void funcB() { funcC(); } void funcC() { funcB(); } Error: funcC is not known yet. 28
29
Functions Declaration void funcC(int param); // or: void funcC(int); void funcA() { } void funcB() { funcC(7); } void funcC(int param) { } Amendment to “Rule 1” : Use forward declarations. 29
30
Boolean variables – non! 30 int main() { int a = 5; while(1) { if(!(a-3)) { printf("** a=3 **\n"); break; } printf("a=%d\n",a--); } return 0; }
31
31 Building a program in C: Preprocessor, Compilation and Linkage
32
Building a program in C – Preprocessor 32 A text processor Commands start with # // copy & paste the file here #include hello.c Preprocessor stdio.h tmpXQ.i (C code)
33
Building a program in C – Compiling 33 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 Compiler stdio.h tmpXQ.i (C code) hello.o (object file)
34
Linking 34 Combines object file with external references into an fully executable file, with no unresolved references Main Preprocessor, Compiler Main.c Main.o Linker libc.a
35
Link errors 35 Error 1 error LNK2019: unresolved external symbol _foo referenced in function _main c:\Users\ofirpele\documents\visual studio 2012\Projects\ConsoleApplication5\Console Application5\ConsoleApplication5.obj ConsoleApplication5
36
36 The Preprocessor
37
Compilation in C 37 hello.c Preprocessor Compiler stdio.h tmpXQ.i (C code) hello.o (object file)
38
Preprocessor 38 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.
39
Preprocessor 39 In linux with gcc, we can test what the preprocessor does: > gcc –E hello.c will print the C code after running the preprocessing
40
#include directive 40 #include "foo.h" Include the file “foo.h”, from current directory #include Include the file “stdio.h” from the standard library directory (part of compiler installation)
41
Modules & Header files 41 Complex.c // interface of function int area (int x1,int y1, int x2, int y2);... Square.h #include "Square.h" #include // implementation int area (int x1,int y1,int x2, int y2) {... } Square.c #include "Square.h" int main() { area (2,3, 5,6); } Main.c
42
Do all files get compiled every time we build the program??? 42 $ gcc –c Square.c –o Square.o $ gcc –c Main.c –o Main.o $ gcc Square.o Main.o –o Main Main Preprocessor Compiler Square.c Square.o Main.c Main.o Linker libc.a
43
Header files 43 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
44
#define directive 44 #define FOO 1 int x = FOO; is equivalent to int x = 1;
45
#define with arguments 45 #define SQUARE(x) x*x b = SQUARE (a); is the same as b = a*a;
46
46 #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; #define – cautions
47
47 #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;
48
#define 48 #define directive should be used with caution! Alternative to macros: Constants enum { FOO = 1 }; or const int FOO = 1; Functions – inline functions (C99,C++)
49
#define 49 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 !
50
#if directive 50 Allows to have conditional compilation #if defined(DEBUG) // compiled only when DEBUG exists printf("X = %d\n", X); #endif
51
#ifndef – for header safety 51 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' Error: Complex.h:1: redefinition of `struct Complex'
52
#ifndef – header safety 52 Complex.h (revised): #ifndef COMPLEX_H #define COMPLEX_H struct Complex {... #endif Main.c: #include "MyStuff.h" #include "Complex.h" // no error this time
53
#pragma once – header safety 53 Complex.h (revised): #pragma once struct Complex {... Main.c: #include "MyStuff.h" #include "Complex.h" // no error this time
54
Preprocessor – summary 54 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
55
55 vs Debug/Test mode vs Release mode
56
56 vs Debug/Test mode vs Release mode #include #define MAX_INTS 100 int main() { int ints[MAX_INTS]; // i should be in bounds, but is it really? i = foo( ); // safety assertions assert(i>=0); assert(i<MAX_INTS); ints[i] = 0;...
57
57 #include #define MAX_INTS 100 int main() { int ints[MAX_INTS]; // i should be in bounds, but is it really? i = foo( ); // safety assertions assert(i>=0); assert(i<MAX_INTS); ints[i] = 0;... vs Debug/Test mode vs Release mode
58
58 #include #define MAX_INTS 100 int main() { int ints[MAX_INTS]; // i should be in bounds, but is it really? i = foo( ); // safety assertions assert(i>=0); assert(i<MAX_INTS); ints[i] = 0;... #define NDEBUG
59
59 assert bad // bad, foo() will not be called // if the compiler removes the assert() // if NDEBUG is defined assert(foo() == 0); good // good int errCode = foo(); assert(errCode == 0);
60
60 Use for: Catching bugs Don't use for: checking malloc, user input,... assert
61
assert.h 61 #include // Sqrt(x) - compute square root of x // Assumption: x non-negative double sqrt(double x ) { assert( x >= 0 ); // aborts if x < 0 …
62
assert.h 62 // 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
63
assert.h 63 Important coding practice Declare implicit assumptions Sanity checks in code Check for violations during debugging/testing
64
64 Compilation
65
65 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.
66
“Assembly” 66 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 } 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.
67
Compiling warnings
68
68 Add “-Wall” flag to catch things like this: if (i=3) { //bug, we meant i==3 … }
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.