# Wie unterschiedlich sind C, C++, C#, Java?



## dolbik (21. Februar 2013)

Ich programmiere mit Java seit ca. 5 Jahren, bin also etwas fortgeschritten. Leider hatte ich bisher nie das Glück, C, C++ oder C# zu lernen, außer wenigen Grundlagen.
Da ich nächstes Semester einen Kurs belege, wo C++-Grundkenntnisse verlangt werden, habe ich vor, mir in den Semesterferien etwas davon anzueignen. Am Ende des Kurses werde ich also auch etwas C++-Erfahrung vorweisen können.

Ich habe gelesen, dass C++ eine Erweiterung von C wäre, sodass man mit C arbeiten könnte, wenn man C++ verstanden hat.
Auch dass C# ähnlich wie Java wäre.

Stimmen diese beiden Aussagen?
Wie schwer wäre es, sich C mit C++-Kenntnissen bzw C# mit Java-Kenntnissen beizubringen?

Vielen Dank!


----------



## Der Wolf (22. Februar 2013)

Hallo,

also ich persönlich arbeite seit einiger Zeit mit Java und C++ und ich würde von meiner Seite aus sagen, dass du mit deinen Kenntnissen in Java nicht sehr viel Schwierigkeiten haben wirst dir C++ an zu lernen. Ich finde der größte Unterschied zwischen den beiden (wenn man die Reflection API und ähnliches von Java heraus lässt) ist, die explizite Verwendung von Pointern auf C++ Seite. Das nimmt dir Java ja komplett ab, das heisst du musst dich auf C++ Seite komplett selbst um dein Speicher-Management kümmern. Davon abgesehen hat man halt in C++ noch die Header-Files mit denen man die Deklarationen von Klassen, Funktionen, etc. von den Implementierungen trennt (zu einem großen Teil zumindest).

Kurzum, ich denke der Einstieg in C++ wird dir nicht so schwer fallen. Von C++ auf reines C ist da manchmal finde ich schon etwas schwerer. Mit C# habe ich selber direkt noch nie gearbeitet, aber da C# die Verwendung reiner C++ Bausteine unterstützt wird das auch schon gehen. Die direkte Ähnlichkeit zu Java kann ich aber nicht bewerten.

Gruß,
Der Wolf


----------



## sheel (22. Februar 2013)

Noch was zu C und C++:
Verallgemeinert gesagt stimmt es, dass C++ eine Erweiterung von C ist
(es gibt aber einige feinere Unterschiede, bei denen ein C-Programm
dann kein gültiges C++-Programm ist).

Im Fall Uni&Co aber eventuell ein Problem:
Es gibt für viele Sachen (angefangen von der normalen Konsolenausgabe)
C-Möglichkeiten, die in C++ schon auch funktionieren, und zusätzlich noch weitere
C++-Möglichkeiten, die im Endeffekt das Selbe machen, aber ziemlich anders zu verwenden sind.

Bei allem, wo du die Wahl zwischen mehreren Varianten hast,
wäre es eben für die Funktionalität egal, was du nimmst; was aber "schöner" ist
und ob bei der Uni-Abgabe eines "C++"-Programms auch Mischung
mit schon in C vorhandenen Sachen akzeptiert wird (solange es Alternativen gäbe)...


Zu C#:
Vor allem bei kleineren Übungsprogrammen am Anfang wird es dir wie ein Javaklon vorkommen
(wer weiß, vielleicht sollte es ja genau das sein :suspekt.
Sollte also sehr wenig Probleme beim Lernen geben.

C# ist sehr auf Windows ausgerichtet, während Java ja
von Haus aus auf Linux usw. genauso funktionieren will.
Man findet in C# daher auch Klassen, die tiefer in die OS-Eigenheiten reingehen,
als es beim Allgemein-Java sinnvoll und möglich ist.

Sonst...mit den tatsächlichen Unterschieden der Sprachen kommt man irgendwann
schon in Kontakt, wenn genug programmiert


----------



## Christian Fein (23. Februar 2013)

Sprachen allgemein sind jetzt nicht das Problem. Syntax Unterschiede lernt man recht schnell. Die Schwierigkeit besteht eher darin die Technologie zu meistern. Die Java Syntax lernt man in 2 Wochen, das Verhalten von Classloader / wichtige Frameworks wie Spring etc verbrauchen einen Grossteil der Lernarbeit.
Ebenso OOA & OOD bzw Pattern. Und hinzu kommen einfach noch Erfahrungen die einen gleich erkennen lässt wieso es hier ein Compilerfehler gibt.

```
public class MyContainer<T> {
private ArrayList myList = new ArrayList();

public T[] toArray() {
	return (T[]) myList;
}
}
```

Das sind die Feinheiten in einer Sprache die man schwer anlernen kann sondern mit Erfahrung in der jeweiligen Sprache kommen. 

Diese Feinheiten gibt es in jeder Sprache und dies anzulernen ist der eigentliche Knackpunkt. Die Syntax ansich von Java & C ist daher recht ähnlich aber das Programmiermodell eben nicht.

Neben Java programmiere ich gern noch in Objective C und Python. Beide Sprachen sind syntaktisch von Java sehr unterschiedlich. Python jedoch ist eine deutlich schwerere Hürde obwohl es syntaktisch in vielerlei hinsicht Java fast ähnlicher ist als Objective C. 

Objective C Beispiel:


```
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }    
    return cell;
}
```

Python ist recht mächtig aber wenn man keine Erfahrung hat mit z.b List Comprehension sieht so etwas sehr unverständlich aus (wobei das ein einfaches Beispiel ist):

```
fibs_max_count = int(sys.argv[1])
even_fibs = [num for num in islice(fib_gen(), fibs_max_count) if num%2 == 0]
```


Der Unterschied ist das Objective C  eine reine Objekt Orientierte Sprache ist und demnach ähnlich programmiert wird wie Java. Python zwar ebenso eine komplette OOP Sprache ist aber Funktionale Programmierung nicht nur möglich ist sondern auch genutzt wird in Frameworks wie Django etc und daher das Verständnis dafür von nöten ist.

Um direkt von Java auf C,C++,C# zu kommen.  Jeder Java Programmierer sollte eigentlich mit IDE Unterstützung sofort ohne Doku lesen können und mit wenigen Blicken wie in C# etwas gemacht wird auch überarbeiten bzw damit arbeiten können.

Bei C++ ist etwas mehr Einarbeitungszeit von nöten. Zwar gibts in C# auch Pointer (Einstiegshürde für nur Java Programmierer) aber sie werden nicht so intensiev genutzt wie in C++. Wenn dann noch Funktionspointer hinzukommen kann einen das schon sehr verwirren.

Der Weg von C++ auf C ist leider gerade falsch rum. C++ baut auf C auf aber um C++ zu verstehen solltest du mit C anfangen. 
Für C# brauchst du C nicht verstehen da bringen dir Java Kenntnisse mehr.  
Auch Objective C baut auf C auf und C Kenntnisse sind auch hier sinnvoll wobei Objective C hier nicht so üblen Gebrauch von Pointer macht wie C++ bzw anders als C++ aufgrund meist in einer bestimmten Umgebung arbeitet ( z.b Cocoa ) und hier mehr mit NSString hantiert als mit char* etc.


----------

