C For Java Programmers
C For Java Programmers
CS 414 / CS 415
Niranjan Nagarajan
Department of Computer Science
Cornell University
[email protected]
Original Slides: Alin Dobra
Why use C instead of Java
• Intermediate-level language:
– Low-level features like bit operations
– High-level features like complex data-structures
• Access to all the details of the implementation
– Explicit memory management
– Explicit error detection
• Better performance than Java
void main(void){
printf("Hello World.\n");
}
$ ./hello
Hello World.
Primitive Types
• Integer types:
– char : used to represent characters or one byte data
(not 16 bit like in Java)
– int,short and long : versions of integer (architecture
dependent)
– can be signed or unsigned
• Floating point types: float and double like in Java.
• No boolean type, int or char used instead.
– 0 ⇒ false
– 6= 0 ⇒ true
Primitive Types Examples
char c=’A’;
char c=100;
int i=-2343234;
unsigned int ui=100000000;
float pi=3.14;
double long_pi=0.31415e+1;
Arrays and Strings
• Arrays:
/* declare and allocate space for array A */
int A[10];
for (int i=0; i<10; i++)
A[i]=0;
enum months{
JANUARY,
FEBRUARY,
MARCH
};
enum months{
JANUARY=1,
FEBRUARY=3,
MARCH
};
Pointers
• Operators:
– Arithmetic:
∗ +,-,*,/,%
∗ ++,--,*=,...
– Relational: <,>,<=,>=,==,!=
– Logical: &&, ||, !, ? :
– Bit: &,|,ˆ,!,<<,>>
Common Syntax with Java (cont.)
• Language constructs:
– if( ){ } else { }
– while( ){ }
– do { } while( )
– for(i=0; i<100; i++){ }
– switch( ) { case 0: ... }
– break, continue, return
• No exception handling statements.
Memory Allocation and Deallocation
Global variables:
• Characteristic: declared outside any function.
• Space allocated statically before program execution.
• Initialization done before program execution if necessary also.
• Cannot deallocate space until program finishes.
• Name has to be unique for the whole program (C has flat
name space).
Memory Allocation and Deallocation(cont.)
Local variables:
• Characteristic: are declared in the body of a function.
• Space allocated when entering the function (function call).
• Initialization before function starts executing.
• Space automatically deallocated when function returns:
– Attention: referring to a local variable (by means of a
pointer for example) after the function returned can have
unexpected results.
• Names have to be unique within the function only.
Memory Allocation and Deallocation(cont.)
Heap variables:
• Characteristic: memory has to be explicitly:
– allocated: void* malloc(int) (similar to new in Java)
– deallocated: void free(void*)
• Memory has to be explicitly deallocated otherwise all the
memory in the system can be consumed (no garbage col-
lector).
• Memory has to be deallocated exactly once, strange behav-
ior can result otherwise.
Memory Allocation and Deallocation(ex.)
#include <stdio.h>
#include <stdlib.h>
void main(void){
int* ptr; /* local variable of type int* */
/* check if successfull */
if (ptr == NULL)
exit(1); /* not enough memory in the system, exiting */
#include <stdio.h>
void main(void){
int total=sum(2+2,5); /* call function sum with parameters 4 and 5 */
#include <stdio.h>
void main(void){
int num1=5, num2=10;
swap(num1, num2);
printf("num1=%d and num2=%d\n", num1, num2);
}
$ ./swaptest
num1=5 and num2=10 NOTHING HAPPENED
Why pass by reference?(cont.)
#include <stdio.h>
void main(void){
int num1=5, num2=10;
int* ptr = &num1;
swap(ptr, &num2);
printf("num1=%d and num2=%d\n", num1, num2);
}
$ ./swaptest2
num1=10 and num2=5 CORRECT NOW
Pointer to Function
void main(void){
myproc(10); /* call myproc */
mycaller(myproc, 10); /* call myproc using mycaller */
}
The Preprocessor
• Module support
/* include standard library declaration */
#include <stdio.h>
/* include custom declarations */
#include "myheader.h"
if (DEBUG)
printf("Max length of list is %d.\n", MAX_LIST_LENGTH);
• Conditional compilation
#ifdef DEBUG
printf("DEBUG: line " _LINE_ " has been reached.\n");
#endif
Programs with Multiple Files
• File mypgm.h:
void myproc(void); /* function declaration */
int mydata; /* global variable */
void myproc(void){
mydata=2;
... /* some code */
}
Programs with Multiple Files (cont.)
• File main.c:
#include <stdio.h>
#include "mypgm.h"
void main(void){
myproc();
}