C Einführung

So...dann fangen wir mal an ein bisschen C zu programmieren...hooray.

1. Was ist denn C?

C ist eine Programmiersprache, die in den 70ern von Ken Thompson und Dennis Ritchie für das Betriebssystem UNIX geschrieben wurde.
Weiterentwickelungen sind unter anderem: Objective-C (Cocoa und Nextstep API), C++ (ihr werdet das ++ noch verstehen ;)), C# (von Microsoft) und Java (von Sun Microsystems).
Der Vorgänger hieß B und war eine interpretierte Sprache von Ken Thompson (ratet mal woher jetzt C kommt).

2. Wie eine Programmiersprache funktioniert

Also...das einzige, was ein Prozessor versteht sind nullen und einsen (Strom aus, Strom an) und damit kann er ganz schön viel anstellen.
Aber wie kann er C code verstehen? C code wird von einem so genannten compiler in Maschinencode (also 0 und 1) übersetzt. Man könnte zwar auch selber die nullen und einsen schreiben, das ist auch ganz nett, aber produktive Programme werden damit schwer.
Daher bedient man sich eine Hochsprache (die also nicht auf einer niedrigen ebene auf den Prozessor bezogen ist, alle verschiedenen Prozessoren Architekturen haben noch einen anderen Maschinencode), wie C.

Anmerkung: Wer sich fuer niedrige Programmiersprachen interessiert, sollte mal nach Assembler suchen und sich womöglich noch einige Dokumentationen der Hardware Hersteller (Intel, Motorola, IBM z.B.) besorgen.
Von mir gibt es eine Einführung in PowerPC Assembly, leider nicht vollständig (und in englisch): Hier

3. Das erste Programm

So...jetzt will ich euch nicht noch weiter auf die Folter spannen und nun endlich anfangen. Wir schreiben ein Programm, das "hello, world" ausgibt.
#include <stdio.h>

int main() {
	printf("hello, world\n");
	return 0;
}
Programm eingeben, compilen und ausführen.
Jetzt zur Erklärung:
Die erste Zeile bindet eine so genannte header Datei ein. Also eine Datei, in der schon viele Funktionen und Konstanten definiert sind, die brauchen wir für printf() und einige andere Sachen. stdio steht übrigens für STandarD Input Output
die nächste Zeile ruft die Funktion main() auf. Das ist die Hauptfunktion, die immer am Anfang eines Programmes ausgeführt wird, ihr werdet später noch sehen, was Funktionen sind. int bedeutet, dass der Rückgabewert ans Betriebssystem eine Ganzzahl (integer) ist. Also von -2147483648 bis 2147483647. Die Klammern stehen für eine Funktion, jede braucht welche.
Die geschweiften Klammern bezeichnen einen Block, den auch jede Funktion braucht.
printf() ist unsere erste Funktion. Man sieht wieder die für eine Funktion charakteristischen Klammern, in denen die Argumente stehen. In diesem Fall "hello, world\n".
"hello, world\n" ist ein String. Also eine Kette von Zeichen, dieser wird an die Funktion übergeben, was sie damit macht, ist ihre Sache, aber printf() gibt eben jenen im Standard Output Kanal aus (stdout).
Das Semikolon ist wichtig. Es muss immer am Ende einer Anweisung stehen, es gibt jedoch Ausnahmen, wie Blocks. Ausnahmen werden euch dann auffallen.
return 0 gibt 0 ans Betriebssystem zurück. Das heisst: Alles OK, kein Fehler im Programm. Alles != 0 wäre ein Fehler.

4. Variablen und Ein-/Ausgabe

Jetzt wollen wir und mal mit Variablen und Ein-/Ausgabe (kurz I/O) ausseinandersetzen
Eine Variable enthält irgendeine Zahl. Ganz einfach.
Jetzt muessen wir sehen, wie wir damit zurechtkommen:
#include <stdio.h>

int main() {
	int variable;
	variable = 4;
	printf("variable: %d\n", variable);
	return 0;
}
also...ich fang gleich bei main an:
int variable deklariert eine Ganzzahl (int) mit dem Namen "variable".
Wichtig: C ist case sensitive, also Gross- und Kleinschreibung beachten
in der nächsten Zeile wir der varible der Wert 4 zugewiesen mithilfe des = operators.
Mit printf() kann man dann den Wert ausgeben. %d ist eine Art Platzhalter fuer ints. Nach dem Komma werden die Variablen in der Reihenfolge angegeben, die an diese Stellen sollen.

Es gibt aber nicht nur int und %d, sondern noch viele andere:
Bezeichner "Übersetzung" Grösse Formatzeichen
int Ganzzahl 4 bytes %i oder %d
short Ganzzahl 2 bytes %i oder %d
long Ganzzahl 4 bytes %li oder %ld
long long Ganzzahl 8 bytes %li oder %ld
float Fliesskommazahl 4 bytes %f
doube Fliesskommazahl (doppelte Genauigkeit) 8 bytes %lf
char ASCII Zeichen (Zahlen von 0-255) 1 byte %c
Will man eine Zahl in hexadezimaler Schreibweise ausgeben, benutzt man %x oder %X, für Oktalzahlen %o.

Außerdem kann man noch bestimmen, ob die Variable vorzeichenbehaftet ist oder nicht.
unsigned int
wäre eine positive Ganzzahl von 0 - 4294967925
;Während
signed int
von -2147483648 - 2147483647 reicht.

char

Der Typ char ist ein bisschen speziell. Er kann von 0-255 oder von -128 - 127 gehen (also ein byte). Das ist ein bisschen verwirrend, ändert zwar nichts am Bitmuster, aber verändert die "Interpretation",
kann deshalb, wie gesagt, sehr für Verwirrung sorgen. Wenn man mit bytes arbeitet, sollte man es vorher als unsigned deklarieren.
Um einem char ein Zeichen zuzuweisen, macht man folgendes: char variable = 'c'
Man muss ein einzelnes Zeichen immer in ' ' setzen, dadurch wird das Zeichen in den entsprechenden ASCII code geändert. Wir könnten auch folgendes schreiben: char variable = 67
Mal ein kleines Experiment:
#include <stdio.h>

int main() {
	char zeichen1 = '!', zeichen2 = 'B';
	printf("zeichen1 + zeichen2 = %c\n", zeichen1 + zeichen2);
	return 0;
}
Na? Überrascht? Wir ich bereits gesagt habe, hat jedes Zeichen einen ASCII code. ! hat den code 33 und B 66. 66 + 33 = 99, 99 == c (hurra, wir programmieren in 99 :P)

I/O

Jetzt beschäftigen wir uns ein bisschen mit I/O.
Erstmal eine Übersicht über einige Funktionen:
printf() gibt einen formatierten string aus
putchar(zeichen) gibt ein Zeichen auf stdout aus
putc(zeichen, stream) gibt ein Zeichen in einen stream aus
scanf() ließt einen formatierten String ein
getchar() ließt ein Zeichen von stdin ein
getc(stream) ließt ein Zeichen aus einem Stream ein

Das sollte erstmal reichen.
Um jetzt die Variablen bei printf() noch darzustellen (oder bei scanf() einzulesen) gibt es eben diese Formatzeichen, die ein Platzhalter sind (siehe Tabelle oben).
Damit sollte man schon ganz gut arbeiten können, aber es fehlen noch Escape Sequenzen.
Dazu gehoehren:
\n
\t
\\
%%
\a
\"
\'
Das sind die wichtigsten.
\n gibt eine neue Zeile aus, \t ist ein Zeilenvorschub, \\ gibt einen backslash aus, %% ein Prozentzeichen und \a macht einen netten Hardware beep.
' und " muss man auch escapen, da sie das Ende eines Strings bzw. Zeichens sein würden.
\\ escapt den Backslash, da diese verwendet wird, wenn man im Quelltext eine neue Zeile anfängt. Beispiel:
printf("hello,\
world\n");

5. Operatoren

Ahja...ein grosses Thema. Es gibt viele Operatoren. Erstmal die normalen arithmetischen, die vermutlich jeder kennt:
+
-
/
*
%
+
ist eine Addition, - eine Subtraktion, / eine Division, * eine Multiplikation und % ist der Rest einer Division (Modulo).
Man kann die Priorität mit Klammern festlegen, ansonsten gilt auch hier: Punkt vor Strichrechnung.
Diese sind noch nicht schwer zu verstehen, aber es gibt noch mehr, die Bitoperatoren(Wenn ihr nicht mit dem Binärsystem vertraut seid, versteht ihr das nicht):
&
|
^
~
<<
>>
das & ist der AND Operator. Er Manipuliert einzelne Bits:
0 0 1 1
1 0 1 0
- - - -
0 0 1 0
Es wird also nur ein Bit gesetzt, wenn es bei beiden Operanden auf 1 steht.

| ist das bitweise OR:
0 0 1 1
1 0 1 0
- - - -
1 0 1 1
Er setzt jedes Bit auf 1, wenn es wenigstens einmal gesetzt ist.

^ ist der EXKLUSIVE OR Operator:
0 0 1 1
1 0 1 0
- - - -
1 0 0 1
Er setzt alle Bits auf 1, bei denen nur einmal eine 1 kam.

Der ~ Operator (NOT) invertiert einfach das Bitmuster. Aus 1 wird 0 und aus 0 wird 1.

Die SHIFT Operatoren verschieben einzelne Bits. Angenommen wir haben folgendes Bitmuster: 111100001111
Wenn ich den rechtsshift (>>) Operator anwende, werden alle bits nach rechts verschoben, so sieht es aus:
111100001111 >>1 = 011110000111
Für die 1 könnte ich auch eine 5 nehmen, die Zahl dahiner gibt die Anzahl an, wie oft ich verschieben will:
111100001111 >>5 = 000001111000
Die Bits werden einfach an der Seite runtergeschoben und auf der anderen Seite wieder mit 0 aufgefuellt.
Das ganze gilt auch fuer den linksshift Operator.
Übrigens: Ein shift nach links entspricht einer Multiplikation mit 2, ein shift nach rechts einer Division durch 2, wobei der rest "rausfällt".