diff options
-rw-r--r-- | de-de/c-de.html.markdown | 75 |
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) |