summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--de-de/c-de.html.markdown75
1 files changed, 46 insertions, 29 deletions
diff --git a/de-de/c-de.html.markdown b/de-de/c-de.html.markdown
index 6670ac46..64159c31 100644
--- a/de-de/c-de.html.markdown
+++ b/de-de/c-de.html.markdown
@@ -73,9 +73,10 @@ int main(void){
// dein Programm
}
-// Die Kommandozeilenargumente, welche gebraucht werden, damit dein Programm läuft,
-// werden als Argumente der `main`-Funktion mitgegeben.
-// argc steht für die Anzahl von Argumenten. - Der Programmname ist das erste Argument.
+// Die Kommandozeilenargumente, welche gebraucht werden, damit dein Programm
+// läuft, werden als Argumente der `main`-Funktion mitgegeben.
+// argc steht für die Anzahl von Argumenten. - Der Programmname ist das erste
+// Argument.
// argv ist ein Array von Zeichenarrays, welche die Argumente beinhaltet.
// argv[0] = Name des Programms
// argv[1] = erstes Argument usw.
@@ -116,7 +117,8 @@ int main (int argc, char** argv){
// doubles sind normalerweise 64-Bit Gleitkommazahlen
double x_double = 0.0; // echte Zahlen ohne Suffix sind vom Typ double
- // integer-Typen können vorzeichenlos (unsigned) sein (grösser oder kleiner als 0)
+ // integer-Typen können vorzeichenlos (unsigned) sein
+ // (grösser oder kleiner als 0)
unsigned short ux_short;
unsigned int ux_int;
unsigned long long ux_long_long;
@@ -129,7 +131,7 @@ int main (int argc, char** argv){
// sizeof(T) gibt die Grösse einer Variablen des Typen T in Bytes zurück.
// sizeof(obj) ergibt die Grösse des Ausdrucks (Variable, Literal usw.)
- printf("%zu\n", sizeof(int)); // => 4 (auf den meisten Rechnern mit einem 4-Byte-Wort)
+ printf("%zu\n", sizeof(int)); // => 4 (auf den Rechnern mit einem 4-Byte-Wort)
// Wenn das Argument des `sizeof`-Operator ein Ausdruck ist, dann wird das
// Argument nicht ausgewertet (ausser Arrays mit variabler Länge)
@@ -174,7 +176,8 @@ int main (int argc, char** argv){
// In C99 (und als optionales Feature in C11) können Arrays mit variabler
// Länge deklariert werden. Die Grösse eines solchen Array muss eine Konstante
// zur Kompilierzeit sein.
- printf("Geben Sie die Arraygrösse an: "); //Frag den Benutzer nach der Arraygrösse
+ printf("Geben Sie die Arraygrösse an: "); //Frag den Benutzer nach
+ // der Arraygrösse
int array_size;
fcsanf(stdin, "%d", &array_size);
int var_length_array[array_size]; // deklariere Array mit variabler Länge
@@ -234,8 +237,8 @@ int main (int argc, char** argv){
// Es gibt auch die Möglichkeit, Modulo zu rechnen
11 % 3; // => 2
- // Vergleichsoperatoren sind vielleicht schon bekannt, aber in C gibt es keinen
- // Boolean-Typ. In C verwenden wir `int`. (Oder _Bool oder bool in C99.)
+ // Vergleichsoperatoren sind vielleicht schon bekannt, aber in C gibt es
+ // keinen Boolean-Typ. In C verwenden wir `int`. (Oder _Bool oder bool in C99)
// 0 ist falsch, alles andere ist wahr (Die Vergleichsoperatoren ergeben
// immer 1 oder 0.
3 == 2; // => 0 (falsch)
@@ -274,14 +277,16 @@ int main (int argc, char** argv){
// das gleiche gilt für j-- und --j
// Bitweise Operatoren
- ~0x0F; // => 0xFFFFFFF0 (Bitweise Negation, "Einer-Komplement", Beispielresultat für 32-Bit int)
+ ~0x0F; // => 0xFFFFFFF0 (Bitweise Negation, "Einer-Komplement",
+ // Beispielresultat für 32-Bit int)
0x0F & 0xF0; // => 0x00 (Bitweises UND)
0x0F | 0xF0; // => 0xFF (Bitweises ODER)
0x04 ^ 0x0F; // => 0x0B (Bitweises XOR)
0x01 << 1; // => 0x02 (Bitweises Linksverschiebung (left shift) (um 1))
0x02 >> 1; // => 0x01 (Bitweises Rechtsverschiebung (right shift) (um 1))
- // Sei vorsichtig beim Shift mit vorzeichenbehafteten Integern - folgende Ausdrücke sind nicht definiert:
+ // Sei vorsichtig beim Shift mit vorzeichenbehafteten Integern
+ // folgende Ausdrücke sind nicht definiert:
// - Verschiebung in das Vorzeichenbit (int a = 1 << 31)
// - Linksshift einer negativen Zahl (int a = -1 << 2)
// - Shift um einen Offset, welcher >= die Breite des linken Ausdrucks ist.
@@ -303,7 +308,8 @@ int main (int argc, char** argv){
// While-Schleifen existieren auch
int ii = 0;
while (ii < 10){ // JEDER Wert unter zehn ist wahr
- printf("%d, " ii++); //i++ inkrementiert ii NACHDEM der Wert gebraucht wurde.
+ printf("%d, " ii++); //i++ inkrementiert ii NACHDEM der Wert gebraucht
+ // wurde.
} // => gibt folgendes aus: "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n");
@@ -338,12 +344,13 @@ int main (int argc, char** argv){
switch (a){
case 0: // Labels müssen integrale *konstante* Ausdrücke sein (z.B. Enums)
printf("Hey, 'a' ist gleich 0!\n");
- break; //Wenn du kein break einsetzt, so geht der Kontrollfluss durch die Labels
+ break; //Wenn du kein break einsetzt, so geht der Kontrollfluss
+ // durch die Labels
case 1:
printf("Huh, 'a' ist gleich 1!\n");
break;
- // Sei vorsichtig - wenn man das `break` vergisst, werden alle Anweisungen
- // ausgeführt bis das nächste `break` erscheint.
+ // Sei vorsichtig - wenn man das `break` vergisst, werden alle
+ // Anweisungen ausgeführt bis das nächste `break` erscheint.
case 3:
case 4:
printf("Schau mal ... 'a' ist entweder 3 oder 4.\n");
@@ -388,7 +395,7 @@ error:
printf("%d\n", (char) x_hex); // => 1
// Typen werden überlaufen (overflow) ohne jegliche Warnung
- printf("%d\n", (unsigned char) 257); // => 1 (Max char = 255 wenn char 8 Bit lang ist)
+ printf("%d\n", (unsigned char) 257); // => 1 (Max char=255 wenn char 8 Bit ist)
// Um den maximalen Wert eines `char`, `signed char` oder `unsigned char`
// herauszufinden, können die Makros `CHAR_MAX`, `SCHAR_MAX` und `UCHAR_MAX`
@@ -413,7 +420,8 @@ error:
// von Variablen abrufen und dann mit diesen herumspielen.
int x = 0;
- printf("%p\n", (void *)&x); // verwende & um die Adresse der Variable zu erhalten
+ printf("%p\n", (void *)&x); // verwende & um die Adresse der Variable
+ // zu erhalten
// %p formattiert einen Objektpointer des Typen void*)
// => Gibt eine Adresse im Speicher aus
@@ -506,7 +514,8 @@ error:
// Das Dereferenzieren von nicht alloziertem Speicher führt zu einem
// Undefinierten Verhalten.
- printf("%d\n", *(mein_ptr + 21)); // Gibt irgendwas aus. Das Programm kann auch abstürzen
+ printf("%d\n", *(mein_ptr + 21)); // Gibt irgendwas aus.
+ // Das Programm kann auch abstürzen
// Nachdem du fertig mit einem Block bist, welcher `malloc` verwendet hat,
// muss der Speicher befreit werden. Ansonsten kann dieser Speicherbereich
@@ -562,7 +571,7 @@ void str_reverse(char *str_in){
// `strlen()` ist ein Teil der C Standard-Bibliothek.
// Merke: Die Länge, welche von `strlen` zurückgegeben wird, ist ohne den
// Null-Byte Terminator.
- for (ii = 0; i < laenge /2; ii++){ // in C99 kann man `ii` direkt hier deklarieren.
+ for (ii = 0; i < laenge /2; ii++){ // in C99 kann man `ii` hier deklarieren.
tmp = str_in[ii];
str_in[ii] = str_in[laenge - ii - 1]; //#ii'tes Zeichen vom Ende her
str_in[laenge - ii- 1] = tmp;
@@ -621,8 +630,9 @@ void test_funktion(){
// Das Schlüsselwort `static` macht, dass eine Variable ausserhalb der Kompilier-
// einheit nicht zugreifbar ist. (Auf den meisten Systemen ist eine Kompiliereinheit
-// eine `.c`-Datei.) Das Schlüsselwort `static` kann sowohl global (zur Kompiliereinheit gehörende)
-// Variablen, Funktionen und Funktionslokale Variablen angewendet werden.
+// eine `.c`-Datei.) Das Schlüsselwort `static` kann sowohl global
+// (zur Kompiliereinheit gehörende) Variablen, Funktionen und Funktionslokale
+// Variablen angewendet werden.
// Wenn man `static` bei lokalen Variablen verwendet, so ist diese Variable global
// erreichbar und behält dessen Wert über Funktionsaufrufe hinweg, aber sie ist
// nur innerhalb der deklarierten Funktion verfügbar. Ausserdem werden statische
@@ -665,8 +675,9 @@ void funktion_1(){
// Verwende Dereferenzierung, um Struct-Inhalte zu bearbeiten
(*mein_rechteck_ptr).breite = 30;
- //Noch besser: Verwende die Kurzschreibweise ->, um die Lesbarkeit zu verbessern.
- mein_rechteck_ptr->hoehe = 10; // Das gleiche wie: (*mein_rechteck_ptr).hoehe = 10;
+ //Noch besser: Verwende die Kurzschreibweise ->, um die Lesbarkeit zu
+ // verbessern.
+ mein_rechteck_ptr->hoehe = 10; // Gleich wie: (*mein_rechteck_ptr).hoehe = 10;
}
// Aus Bequemlichkeitsgründen ist es möglich einem `struct` ein `typedef` hinzuzufügen.
@@ -698,11 +709,13 @@ Zum Beispiel: Verwende str_reverse von einem Pointer
void str_reverse_through_pointer(char *str_in){
// Definiere eine Funktionspointer-Variable, welche f genannt wird.
void (*f)(char *); // Signatur sollte genau der Funktion entsprechen.
- f = &str_reverse; // weise die Adresse der wirklichen Funktion zu (zur Laufzeit bestimmt)
+ f = &str_reverse; // weise die Adresse der wirklichen Funktion zu
+ // (zur Laufzeit bestimmt)
// `f = str_reverse;` würde auch funktionieren, da Funktionen zu Pointern
// reduziert werden (ähnlich wie Arrays)
(*f)(str_in); // Die Funktion einfach mit dem Pointer aufrufen
- // f(str_in); // Dies ist eine weitere gültige Alternative um eine Funktion auzurufen.
+ // f(str_in); // Dies ist eine weitere gültige Alternative um eine Funktion
+ // auzurufen.
}
/*
@@ -733,7 +746,8 @@ typedef void (*mein_fnp_type)(char *);
'\?'; // Fragezeichen (question mark)
'\''; // einfaches Anführungszeichen (single quote)
'\"'; // doppeltes Anführungszeichen (double quote)
-'\xhh'; // Hexadezimale Zahl (hexadecimal number.) Beispiel: '\xb' = Zeichen für vertikalen Tab
+'\xhh'; // Hexadezimale Zahl (hexadecimal number.) Beispiel:
+ // '\xb' = Zeichen für vertikalen Tab
'\0oo'; // Oktalzahl (octal number). Beispiel \013 = Zeichen für vertikalen Tab
//Ausgabeformatierung
@@ -745,7 +759,8 @@ typedef void (*mein_fnp_type)(char *);
"%3.2f"; // Mindestens drei Zeichen vor und drei nach dem Komma.
"%7.4s"; // (Kann auch mit Strings gemacht werden)
"%c"; // einzelnes Zeichen (char)
-"%p"; // Pointer. Merke: man muss den Pointer zu void umwandeln, bevor `printf` funktioniert.
+"%p"; // Pointer. Merke: man muss den Pointer zu void umwandeln,
+ // bevor `printf` funktioniert.
"%x"; // Hexadezimal
"%o"; // Oktalzahl
"%%"; // Gibt % aus
@@ -841,8 +856,9 @@ Knoten erstelleVerketteteListe(int *werte, int laenge);
Das Beste wird es sein, wenn man sich ein Exemplar des Buches
["The C Programming Language"](https://de.wikipedia.org/wiki/The_C_Programming_Language) besorgt.
-Dieses Buch gilt als **das** Buch über die Programmiersprache C und wurde von Dennis Ritchie,
-dem Erfinder der Programmiersprache C, und Brian Kernighan geschrieben.
+Dieses Buch gilt als **das** Buch über die Programmiersprache C und wurde
+von Dennis Ritchie, dem Erfinder der Programmiersprache C, und Brian Kernighan
+geschrieben.
Sei vorsichtig, da dieses Buch mittlerweile schon etwas älter ist und gewisse
Unkorrektheiten (d.h. Ideen, welche nicht mehr als gut empfunden werden.) oder
mittlerweile geänderte Praktiken enthält. [Hinweis: Das Buch wurde auf Englisch
@@ -858,6 +874,7 @@ es wichtig, dass der Codestil möglichst konsistent ist. Es ist wichtiger, lesba
Code zu schreiben als Code, welcher clever und schnell ist. Es lohnt sich ein
Blick auf den [Codestil des Linuxkernel](https://www.kernel.org/doc/Documentation/process/coding-style.rst) zu werfen. [Englisch]
-Wenn die erwähnte Literatur dein Problem nicht löst, denke daran: "Google ist dein Freund"
+Wenn die erwähnte Literatur dein Problem nicht löst, denke daran:
+"Google ist dein Freund"
[1] [Why isn't sizeof for a struct equal to the sum of sizeof of each member?](http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member)