c tutorial
TRANSCRIPT
CSU480CSU480
“Hello World" Program
Data Types & Variables
printf() Arithmetic & Logical
Operations Conditionals Loops Arrays & Strings
Outline PointersPointers FunctionsFunctions Command-Line ArgumentCommand-Line Argument Data Structure Data Structure Memory AllocationMemory Allocation Programming TipsProgramming Tips C C vvs. C++s. C++ Books recommendedBooks recommended
The source code
#include <stdio.h> int main()
{ printf("Hello World\n"); return(0);
}
Hello World Program
Hello World Program How to compile?
$ gcc hello.c –o hello
gccgcc compiling commandcompiling command
hello.chello.c source filesource file
hellohello compiler-generated executable filecompiler-generated executable file
Note: the default output filename is “Note: the default output filename is “a.outa.out””
How to execute? ./hello
“./ ” indicates the following file “hello” resides under the current directory.
Hello World Program
Q: why “.” is not included in $PATH Q: why “.” is not included in $PATH environment variable?environment variable?
Hello World ProgramA: security consideration.
CommandCommand LocationLocation CommentComment
lsls /bin/ls/bin/ls provided by the provided by the systemsystem
lsls current directorycurrent directory virusvirus
NameName DescriptionDescription Size*Size* Range*Range*
charchar Character or small Character or small integerinteger
1 byte1 byte signed: -128 to 127signed: -128 to 127unsigned: 0 to 255 unsigned: 0 to 255
short intshort int(short)(short)
Short integerShort integer 2 bytes2 bytes signed: -32768 to 32767signed: -32768 to 32767unsigned: 0 to 65535 unsigned: 0 to 65535
intint IntegerInteger 4 bytes4 bytes signed: -2147483648 to signed: -2147483648 to 21474836472147483647unsigned: 0 to 4294967295 unsigned: 0 to 4294967295
long intlong int(long)(long)
Long integerLong integer 4 bytes4 bytes signed: -2147483648 to signed: -2147483648 to 21474836472147483647unsigned: 0 to 4294967295unsigned: 0 to 4294967295
floatfloat Floating point Floating point numbernumber
4 bytes4 bytes 3.4e +/- 38 (7 digits) 3.4e +/- 38 (7 digits)
doubledouble Double precision Double precision floating point numberfloating point number
8 bytes8 bytes 1.7e +/- 308 (15 digits) 1.7e +/- 308 (15 digits)
long long doubledouble
Long double Long double precision floating precision floating point numberpoint number
8 bytes8 bytes 1.7e +/- 308 (15 digits) 1.7e +/- 308 (15 digits)
Data types
Variable Declarationint length = 100; char num = ‘9’; //The actual value is 57float deposit = 240.5;unsigned short ID = 0x5544;
Try the following statements, and see what happens
unsigned char value = -1;printf(“The value is %d \n”, value);
unsigned char value = 300;printf(“The value is %d \n”, value);
ResultDefinitionDefinition Memory layoutMemory layout DisplayDisplay commentcomment
unsigned char unsigned char value = -1value = -1
1111111111111111 255255
unsigned char unsigned char value = 300value = 300
0010110000101100 4444 overflowoverflow
Local variableLocal variables are declared within the body of a function, and can only be used within that function.
Static variableAnother class of local variable is the static type. It is specified by the keyword static in the variable declaration. The most striking difference from a non-static local variable is, a static variable is not destroyed on exit from the function.
Global variable A global variable declaration looks normal, but is located outside any of the program's functions. So it is accessible to all functions.
Variable types
An example
int global = 10; //global variable
int func (int x){static int stat_var; //static local variableint temp; //(normal) local variableint name[50]; //(normal) local variable……}
Variable Definition vs Declaration
DefinitionDefinition Tell the compiler about the variable: its type Tell the compiler about the variable: its type and name, as well as allocated a memory cell for and name, as well as allocated a memory cell for the variablethe variable
DeclarationDeclaration DDescribe information ``about'' the variableescribe information ``about'' the variable, , doesn’tdoesn’t allocate memory cell for the variable allocate memory cell for the variable
http://www-ee.eng.hawaii.edu/~tep/EE150/book/chap14/subsection2.1.1.4.html
The printf() function can be instructed to
print integers, floats and string properly. The general syntax is
printf( “format”, variables);
An exampleint stud_id = 5200;char * name = “Mike”;printf(“%s ‘s ID is %d \n”, name, stud_id);
printf()
Format Identifiers%d decimal integers%x hex integer%c character%f float and double number%s string%p pointer
How to specify display space for a variable?printf(“The student id is %5d \n”, stud_id); The value of stud_id will occupy 5 characters space in the print-out.
Why “\n”It introduces a new line on the terminal screen.
\a\a alert (bell) character alert (bell) character \\\\ backslash backslash \b\b backspace backspace \?\? question mark question mark \f\f formfeedformfeed \’\’ single quote single quote \n\n newlinenewline \”\” double quote double quote \r\r carriage returncarriage return \000\000 octal number octal number \t\t horizontal tab horizontal tab \xhh\xhh hexadecimal number hexadecimal number \v\v vertical tab vertical tab
escape sequence
Arithmetic Operations
Arithmetic Assignment Operators
Increment and Decrement Operators
awkwardawkward easyeasy easiesteasiest
x = x+1;x = x+1; x += 1x += 1 x++x++
x = x-1;x = x-1; x -= 1x -= 1 x--x--
Arithmetic operatorsint i = 10;int j = 15;int add = i + j; //25int diff = j – i; //5int product = i * j; // 150int quotient = j / i; // 1int residual = j % i; // 5i++; //Increase by 1i--; //Decrease by 1
Example
Comparing themint i = 10;int j = 15;float k = 15.0;
j / i = ?j % i = ?k / i = ?k % i = ?
The Answerj / i = 1; j % i = 5;k / i = 1.5;k % i It is illegal.
Note: For %, the operands can only be integers.
What is “true” and “false” in C
In C, there is no specific data type to represent “true” and “false”. C uses value “0” to represent “false”, and uses non-zero value to stand for “true”.
Logical OperatorsA && B=> A and BA || B => A or BA == B => Is A equal to B?A != B => Is A not equal to B?
Logical Operations
A > B => Is A greater than B?A >= B => Is A greater than or equal to B?
A < B => Is A less than B?A <= B => Is A less than or equal to B?
Don’t be confused&& and || have different meanings from & and |.& and | are bitwise operators.
Short circuiting means that we don't evaluate
the second part of an AND or OR unless we really need to.
Some practicesPlease compute the value of the following logical expressions?
Short circuiting
int i = 10; int j = 15; int k = 15; int m = 0; if( i < j && j < k) =>if( i != j || k < j) =>if( j<= k || i > k) =>if( j == k && m) =>if(i) =>if(m || j && i ) =>
int i = 10; int j = 15; int k = 15; int m = 0; if( i < j && j < k) => falseif( i != j || k < j) => trueif( j<= k || i > k) => true if( j == k && m) => falseif(i) => trueif(m || j && i ) => true
Did you get the correct answers?
if statement
Three basic formats,if (expression){ statement …}if (expression) {statement …
}else{ statement …
}
Conditionals
if (expression) {
statement…} else if (expression) {
statement… } else{
statement… }
An exampleif(score >= 90){
a_cnt ++;}else if(score >= 80){
b_cnt++;}else if(score >= 70){
c_cnt++;}else if (score>= 60){
d_cnt++}else{
f_cnt++}
The switch statementswitch (expression) {
case item1: statement; break;
case item2: statement; break;
default: statement; break;
}
for statement
for (expression1; expression2; expression3){statement…
} expression1 initializes; expression2 is the terminate test; expression3 is the modifier;
Loops
An exampleint x;for (x=0; x<3; x++) {
printf("x=%d\n",x); }
First time: x = 0;Second time: x = 1;Third time: x = 2;Fourth time: x = 3; (don’t execute the body)
The while statementwhile (expression) {statement …}while loop exits only when the expression is false.
An exampleint x = 3; while (x>0) { printf("x=%d n",x); x--; }
for (expression1; expression2; expression3){
statement…}
for <==> whileexpression1;expression1;while (expression2)while (expression2){{statementstatement……;;expression3;expression3;}}
equals
Arrays
int ids[50];char name[100];int table_of_num[30][40];
Accessing an arrayids[0] = 40;i = ids[1] + j;table_of_num[3][4] = 100;Note: In C Array subscripts start at 0 and end one less than the array size. [0 .. n-1]
Arrays & Strings
StringsStrings are defined as arrays of characters.The only difference from a character array is, a symbol “\0” is used to indicate the end of a string.
For example, suppose we have a character array, char name[8], and we store into it a string “Dave”.Note: the length of this string 4, but it occupies 5 bytes.DD aa vv ee \0\0
Functions are easy to use; they allow complicated programs
to be broken into small blocks, each of which is easier to write, read, and maintain. This is called modulation.
How does a function look like?returntype function_name(parameters…) { local variables declaration; function code;return result; }
Functions
Sample function int addition(int x, int y)
{int add;add = x + y;return add;
} How to call a function?
int result;int i = 5, j = 6; result = addition(i, j);
Pointer is the most beautiful (ugliest) part of C, but
also brings most trouble to C programmers. Over 90% bugs in the C programs come from pointers.
“The International Obfuscated C Code Contest ”(http://www.ioccc.org/)
What is a pointer?A pointer is a variable which contains the address
in memory of another variable.
In C we have a specific type for pointers.
Pointers
Declaring a pointer variableint * pointer;
char * name; How to obtain the address of a variable?
int x = 0x2233;pointer = &x; where & is called address of operator.
How to get the value of the variable indicated by the pointer?int y = *pointer;
3333 2222 0000 0000
0x5200 0x5203
0x5200
pointer
What happens in the memory?
Suppose the address of variable x is 0x5200 in the above example, so the value of the variable pointer is 0x5200.
X
swap the value of two variables
Why is the left one not working?
swap
main
x, y
a, b
call swap(a, b) in main
x, y, a, b are all local variables
Why is the right one working?
Pointers and ArraysPointers and arrays are very closely linked in C. Array elements arranged in consecutive memory locations
Accessing array elements using pointersint ids[50];int * p = &ids[0];p[i] <=> ids[i]
Pointers and StringsA string can be represented by a char * pointer.
Char name[50];name[0] = ‘D’;name[1] = ‘a’;name[2] = ‘v’;name[3] = ‘e’;name[4] = ‘\0’;char * p = &name[0];printf(“The name is %s \n”, p);Note: The p represents the string “Dave”, but not
the arrayname[50].
In C you can pass arguments to main() function. main() prototype
int main(int argc, char * argv[]);argc indicates the number of argumentsargv is an array of input string pointers.
How to pass your own arguments? ./hello 10
Command-Line Argument
What value is argc and argv?Let’s add two printf statement to get the value of argc and argv.#include <stdio.h>
int main(int argc, char * argv[]);) { int i=0;printf("Hello World\n"); printf(“The argc is %d \n”, argc);for(i=0; i < argc; i++){ printf(“The %dth element in argv is %s\n”, i, argv[i]); }return(0); }
The output The argc is 2 The 0th element in argv is ./hello The 1th element in argv is 10 The trick is the system always passes the name of the executable file as the first argument to the main() function.
How to use your argument? Be careful. Your arguments to main() are always in string
format. Taking the above program for example, the argv[1] is string “10”, not a number. You must convert it into a number before you can use it.
A data structure is a collection of one or more variables,
possibly of different types.
An example of student recordstruct stud_record{char name[50];int id;int age;int major;……};
Data Structure
A data structure is also a data typestruct stud_record my_record;struct stud_record * pointer;pointer = & my_record;
Accessing a field inside a data structuremy_record.id = 10; “.”
or pointer->id = 10; “->”
Stack memory allocation
Non-static local variable is an example of stack memory allocation. Such memory allocations are placed in a system memory area called the stack.
Static memory allocationStatic local variable and global variable require static memory allocation. Static memory allocation happens before the program starts, and persists through the entire life time of the program.
Memory Allocation
Dynamic memory allocationIt allows the program determine how much memory it needs at run time, and allocate exactly the right amount of storage.
The region of memory where dynamic allocation and deallocation of memory can take place is called the heap.
Note: the program has the responsibility to free the dynamic memory it allocated.
Memory arrangement
Functions for the dynamic memory allocationvoid *malloc(size_t number_of_bytes);
allocates dynamic memorysize_t sizeof(type);
returns the number of bytes of typevoid free(void * p)
releases dynamic memory allocation
An example of dynamic memory allocationint * ids; //id arraysint num_of_ids = 40;ids = malloc( sizeof(int) * num_of_ids);
…….. Processing …...free(ids);
Allocating a data structure instancestruct stud_record * pointer;pointer = malloc(sizeof(struct stud_record));pointer->id = 10;
Never calculate the size of data structure yourself. The reason is the size of data types is machine-dependent. Give it to sizeof() function.
size of intsize of int
32-bytes machines32-bytes machines 3232
64-bytes machines64-bytes machines 6464
Replacing numbers in your code with macros
- don’t use magic numbers directly#define MAX_NAME_LEN 50;char name[MAX_NAME_LEN];
Avoiding global variables - modulation is more important
Giving variables and functions a nice name- a meaning name
Don’t repeat your code - make a subroutine/function
Don’t let the function body to exceed one screen- hard to debug
Programming Tips
Indenting your code (clearance)if(expression){
if(expression){
……}
} Commenting your code Don’t rush into coding. Plan first. Printing out more debugging information Using debugger (gdb)
C++ is a superset of C C++ has all the characteristics of C Using g++ to compile your source code
C vs. C++
Thanks