| Feature |
C |
Java |
| type of language |
function oriented |
object oriented |
| basic programming unit |
function |
class = ADT |
| portability of source code |
possible with discipline |
yes |
| portability of compiled code |
no, recompile for each architecture |
yes, bytecode is “write once, run anywhere” |
| security |
limited |
built-in to language |
| compilation |
gcc hello.c creates machine language code |
javac Hello.java creates Java virtual machine language bytecode |
| linking in the Math library |
gcc -lm calculate.c |
no special flags needed |
| joint compilation |
gcc main.c helper1.c helper2.c |
javac Main.java - any dependent files are automatically re-compiled if needed |
| execution |
a.out loads and executes program |
java Hello interprets byte code |
| hello, world |
#include<stdio.h>
int main(void) {
printf(”Hello\n”);
return 0;
}
|
public class HelloWorld {
public static void main(String[] args) {
System.out.println(”Hello”);
}
} |
| integer types |
int usually 32 bit 2’s complement;
long usually 32 bit 2’s complement |
int is 32 bit 2’s complement;
long is 64 bit 2’s complement |
| floating point types |
float usually 32 bit;
double usually 64 bit |
float is 32 bit IEEE 754 binary floating point;
double is 64 bit IEEE 754 |
| boolean type |
use int: 0 for false, nonzero for true |
boolean is its own type - stores value true or false |
| character type |
char is usually 8 bit ASCII |
char is 16 bit UNICODE |
| for loops |
for (i = 0; i < N; i++) |
for (int i = 0; i < N; i++) |
| array declarations |
int *a = malloc(N * sizeof(*a)); |
int[] a = new int[N]; |
| array size |
arrays don’t know their own size |
a.length |
| strings |
”-terminated character array |
built-in immutable String data type |
| accessing a library |
#include <stdio.h> |
import java.io.File; |
| accessing a library function |
#include “math.h”
x = sqrt(2.2);
all function and variables names are global |
x = Math.sqrt(2.2);
functions have different namespaces |
| printing to standard output |
printf(”sum = %d”, x); |
System.out.println(”sum = ” + x); |
| formatted printing |
printf(”avg = %3.2f”, avg); |
System.out.printf(”avg = %3.2f”, avg) |
| reading from stdin |
scanf(”%d”, &x); |
Java library support, but easier to use our library
int x = StdIn.readInt(); |
| memory address |
pointer |
reference |
| manipulating pointers |
*, &, + |
no direct manipulation permitted |
| functions |
int max(int a, int b) |
public static int max(int a, int b) |
| pass-by-value |
primitive data types, structs, and pointers are passed by value; array decays to pointer |
all primitive data types and references (which includes arrays), are passed by value |
| defining a data structure |
struct |
class - key difference is language support for defining methods to manipulate data |
| accessing a data structure |
a.numerator for elements |
a.numerator for instance variables,
c = a.plus(b) for methods |
| pointer chasing |
x->left->right |
x.left.right |
| allocating memory |
malloc |
new |
| de-allocating memory |
free |
automatic garbage collection |
| memory allocation of data structures and arrays |
heap, stack, data, or bss |
heap |
| buffer overflow |
segmentation fault, core dump, unpredicatable program |
checked run-time error exception |
| declaring constants |
const and #define |
final |
| variable auto-initialization |
not guaranteed |
instance variables (and array elements) initialized to 0, null, or false, compile-time error to access uninitialized variables |
| data hiding |
opaque pointers and static |
private |
| interface method |
non-static function |
public method |
| data type for generic item |
void * |
Object |
| casting |
anything goes |
checked exception at run-time or compile-time |
| demotions |
automatic, but might lose precision |
must explicitly cast, e.g., to convert from long to int |
| polymorphism |
union |
inheritence |
| overloading |
no |
yes for methods, no for operators |
| graphics |
use external libraries |
Java library support, use our standard drawing library |
| null |
NULL |
null |
| enumeration |
enum |
typesafe enum |
| preprocessor |
yes |
no |
| variable declaration |
at beginning of a block |
before you use it |
| variable naming conventions |
sum_of_squares |
sumOfSquares |
| commenting |
/* */ |
/* */ or // |
| file naming conventions |
stack.c, stack.h |
Stack.java - file name matches name of class |
| callbacks |
pointers to global functions |
use interfaces for commmand dispatching |
| variable number of arguments |
varargs |
String … |
| assertions |
assert |
assert |
| exit and return value to OS |
exit(1) |
System.exit(1) |