diff options
| -rw-r--r-- | de-de/c-de.html.markdown | 98 | 
1 files changed, 50 insertions, 48 deletions
| diff --git a/de-de/c-de.html.markdown b/de-de/c-de.html.markdown index 0b52284c..db64b6df 100644 --- a/de-de/c-de.html.markdown +++ b/de-de/c-de.html.markdown @@ -13,11 +13,11 @@ Programmierer je brauchen werden. Die Geschwindigkeit von C ist enorm, allerding  muss man sich stets der maneullen Speicherverwaltung bewusst sein. -> **Über Compiler Flags** +> **Über Compiler Optionen**  >   > Standardmässig sind `gcc` und `clang` ziemlich ruhig bezüglich Warnungen und   > Fehlern, obwohl dies sehr nützliche Informationen sein können. Es wird -> empfohlen, strengere Compiler Flags zu verwenden. Hier sind einige empfohlene +> empfohlen, strengere Compiler Optionen zu verwenden. Hier sind einige empfohlene  > Standards:  > `-Wall -Wextra -Werror -O2 -std=c99 -pedantic`  > @@ -33,7 +33,7 @@ mehrzeilige Kommentare sehen so aus. Diese funktionieren auch in C89  */  /*  -mehrzeilige Kommentare können nicht verschaltelt werden /* Sei Vorsichtig! */ // Kommentar endet auf dieser Linie ... +mehrzeilige Kommentare können nicht verschachtelt werden /* Sei Vorsichtig! */ // Kommentar endet auf dieser Linie ...  */ // ... nicht bei dieser!  // Konstanten: #define <keyword> @@ -89,7 +89,7 @@ int main (int argc, char** argv){      // Typen      //////////////////////////////////////////////// -    // Alle Variable müssen am Anfang des jetzigen Blocks deklariert werden. +    // Alle Variablen müssen am Anfang des jetzigen Blocks deklariert werden.      // Wir deklarieren die Variablen dynamisch im Code um die Lesbarkeit im      // Tutorial zu verbessern.      // C99-Konforme Compiler erlauben die Variablendeklaration an dem Punkt, an @@ -121,7 +121,7 @@ int main (int argc, char** argv){      unsigned int ux_int;      unsigned long long ux_long_long; -    // chars innerhalb von einfachen Anführungszeichen sind Integers im +    // Zeichen innerhalb von einfachen Anführungszeichen sind Integers im      // Maschinenzeichensatz      '0'; // => 48 im ASCII-Zeichensatz      'A'; // => 65 im ASCII-Zeichensatz @@ -187,7 +187,7 @@ int main (int argc, char** argv){      // Strings sind lediglich Arrays von `chars`, welche mit einem Null-Byte      // (0x00) beendet werden. In Strings wird das Nullbyte durch das Zeichen \0      // repräsentiert. Wir müssen das Null-Byte nicht angeben in String-Literalen; -    // Der Compiler fügt es am Ende des Array automatisch hinzu. +    // der Compiler fügt es am Ende des Array automatisch hinzu.      char ein_string[20] = "Das ist ein String";      printf("%s\n", ein_string); // %s formattiert einen String @@ -222,9 +222,9 @@ int main (int argc, char** argv){      i1 + i2; // => 3      i2 - i1; // => 1      i2 * i1; // => 2 -    i1 / i2; // 0 (0.5, aber abgeschnitten, da es int sind. +    i1 / i2; // 0 (0.5, aber abgeschnitten, da es int sind.) -    // Man muss mindestens ein Integer to einen float konvertieren, damit man als +    // Man muss mindestens ein Integer zu einen float konvertieren, damit man als      // Resultat eine Gleitkommazahl erhält.      (float)i1 / i2; // => 0.5f      i1 / (double)i2; // => 0.5 // das gleiche mit dem Typ `double` @@ -245,7 +245,7 @@ int main (int argc, char** argv){      2 <= 2; // => 1      2 >= 2; // => 1 -    // C ist nicht Python - Vergleiche können nicht verkettet werden. +    // C ist nicht Python - Vergleiche können nicht einfach verkettet werden.      // Warnung: die folgende Zeile wird kompilieren, aber es bedeutet `(0 < a) < 2`.      // Dieser Ausdruck ist immer wahr, weil (0 < a) kann entweder 1 oder 0 sein.      // In diesem Falle ist es 1, weil (0 < 1). @@ -278,8 +278,8 @@ int main (int argc, char** argv){      0x0F & 0xF0; // => 0x00 (Bitweises UND)      0x0F | 0xF0; // => 0xFF (Bitweises ODER)      0x04 ^ 0x0F; // => 0x0B (Bitweises XOR) -    0x01 << 1; // => 0x02 (Bitweises  Linksshift (left shift) (um 1)) -    0x02 >> 1; // => 0x01 (Bitweises Rechtsshift (right shift) (um 1)) +    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:      // - Verschiebung in das Vorzeichenbit (int a = 1 << 31) @@ -325,18 +325,18 @@ int main (int argc, char** argv){      printf("\n");      // **Merke** -    // Schleifen und Funktionen müssen einen Body haben. Wenn kein Body gebraucht +    // Schleifen und Funktionen müssen einen Rumpf haben. Wenn kein Rumpf gebraucht      // wird, kann folgendes gemacht werden:      int i;       for (i = 0; i <= 5; i++){ -        ; // Semikolon wird als Body behandelt (Null-Anweisung) +        ; // Semikolon wird als Rumpf behandelt (Null-Anweisung)      }      // Alternativ kann auch folgendes geschrieben werden:      for (i = 0; i <= 5; i++);      // Verzweigungen mit mehreren Möglichkeiten: `switch()`      switch (a){ -        case 0: //labels müssen integrale *konstante* Ausdrücke sein (z.B. Enums) +        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          case 1: @@ -405,10 +405,10 @@ error:      // In diesem Tutorial wird das deutsche Wort Zeiger nicht verwendet, da es      // bei einer weiteren Recherche einfacher ist, wenn man von Pointern ausgeht. -    // Ausserdem ist der Begriff Pointer auf im deutschen Sprachgebrauch zu finden. +    // Ausserdem ist der Begriff Pointer auch im deutschen Sprachgebrauch zu finden.      // Ein Pointer ist eine Variable, welche deklariert wurde, um eine Speicher- -    // Adresse zu speichern. Die Deklaration eines Pointers wird auch zeigen, +    // adresse zu speichern. Die Deklaration eines Pointers wird auch zeigen,      // auf welche Art von Daten der Pointer zeigt. Man kann die Speicheradresse      // von Variablen abrufen und dann mit diesen herumspielen. @@ -461,7 +461,7 @@ error:      // oder wenn das Array ein Stringliteral ist, welches gebraucht wird um ein      // `char`-Array zu initialisieren.      char anderer_arr[] = "foobarbazquirk"; -    // oder wenn es das Argument des des `sizeof` oder `alignof` Operators ist. +    // oder wenn es das Argument des `sizeof` oder `alignof` Operators ist.      int dritter_array[10];      int *ptr = dritter_array; // gleich wie: `int *ptr = &arr[0]`      printf("%zu, %zu\n", sizeof(dritter_array), sizeof(ptr)); @@ -515,7 +515,7 @@ error:      free(mein_ptr);      // Obwohl Strings normalerweise als Pointer-to-Char (Pointer zum ersten -    // Zeichen des Arrays) repräsentiert werden, sind Strings sind Arrays aus `char`s. +    // Zeichen des Arrays) repräsentiert werden, sind Strings Arrays aus `char`s.      // Es ist eine gute Praxis, `const char *` zu verwenden, wenn man ein      // String-Literal referenziert, da String-Literale nicht modifiziert werden      // sollten (z.B. "foo"[0] = 'a' ist ILLEGAL) @@ -536,22 +536,22 @@ error:  ////////////////////////////////////////////////  // Syntax einer Funktionsdeklaration -// <rueckgabe_wert> <funktion_name>(<args>) +// <rueckgabe_wert> <funktions_name>(<args>)  int addiere_zwei_integer(int x1, int x2){      return x1 + x2; // verwendet return, um einen Wert zurückzugeben  }  /*  - * Funktionen werden auf Grund des Wertes aufgerufen (call-by-value). Wenn eine  - * Funktion aufgerufen wird, sind die Argumente Kopien der ursprüunglichen Werte - * (ausgenommen Arrays). Alles, was man innerhalb einer Funktion mit den Werten  - * macht, hat keinen Einfluss auf die Originalwerte als die Funktion aufgerufen - *  wurde +Funktionen werden auf Grund des Wertes aufgerufen (call-by-value). Wenn eine  +Funktion aufgerufen wird, sind die Argumente Kopien der ursprüunglichen Werte +(ausgenommen Arrays). Alles, was man innerhalb einer Funktion mit den Werten  +macht, hat keinen Einfluss auf die Originalwerte als die Funktion aufgerufen +wurde - * Verwende Pointer, um den Originalinhalt zu bearbeiten. +Verwende Pointer, um den Originalinhalt zu bearbeiten. - * Beispiel: +Beispiel:  */  // Eine `void`-Funktion gibt keinen Wert zurück @@ -561,7 +561,7 @@ void str_reverse(char *str_in){      size_t laenge = strlen(str_in);      // `strlen()` ist ein Teil der C Standard-Bibliothek.      // Merke: Die Länge, welche von `strlen` zurückgegeben wird, ist ohne den  -    // Null-Byter Terminatur. +    // Null-Byte Terminator.      for (ii = 0; i < laenge /2; ii++){ // in C99 kann man `ii` direkt hier deklarieren.          tmp = str_in[ii];          str_in[ii] = str_in[laenge - ii - 1]; //#ii'tes Zeichen vom Ende her @@ -572,9 +572,9 @@ void str_reverse(char *str_in){  // verwendet werden kann.  /* -   * char c[] = "Das ist ein Test"; -   * str_reverse(c); -   * printf("%s\n", c), => "tseT nie tsi saD" +char c[] = "Das ist ein Test"; +str_reverse(c); +printf("%s\n", c), => "tseT nie tsi saD"  */  // Weil wir lediglich eine Variable zurückgeben können, kann zum Ändern mehrerer @@ -595,7 +595,7 @@ printf("Erste Zahl: %d\n Zweite Zahl: %d\n", erste_zahl, zweite_zahl);  Wenn man Arrays betrachtet, so werden diese immer als Pointer übergeben. Auch  wenn die Arrays statisch alloziert werden (wie zum Beispiel `arr[10]`), werden  diese als Pointer zum ersten Element des Arrays übergeben. -Auch hier soll noch einmal erwähnt werden, dass keinen Standard gibt, wie die  +Auch hier soll noch einmal erwähnt werden, dass es keinen Standard gibt, wie die   Grösse eines dynamischen Arrays herausgefunden werden kann.  */  // Die Grösse des Arrays muss unbedingt mitgegeben werden. @@ -616,7 +616,7 @@ ausgabe_int_array(mein_array, groesse);  // man das Schlüsselwort `extern` verwenden.  int i = 0;  void test_funktion(){ -    extern int i; //i braucht nun die externe Variable i +    extern int i; // i braucht nun die externe Variable i  }  // Das Schlüsselwort `static` macht, dass eine Variable ausserhalb der Kompilier- @@ -629,14 +629,14 @@ void test_funktion(){  // Variablen mit 0 initialisiert, wenn sie nicht mit einem anderen Startwert   // initialisiert werden.  // Es ist auch möglich, Funktionen als statisch zu deklarieren, damit diese -// `private` sind. Private heisst, dass sie nur in diesem Kontekt sichtbar sind. +// `private` sind. Privat heisst, dass sie nur in diesem Kontekt sichtbar sind.  ////////////////////////////////////////////////  // Benutzerdefinierte Typen und Strukturen (Structs)  //////////////////////////////////////////////// -// `typdef`s können verwendet werden, um Typenaliase zu erstellen. +// `typedef`s können verwendet werden, um Typenaliase zu erstellen.  typedef int mein_typ;  mein_typ meine_typ_var = 0; @@ -650,7 +650,7 @@ struct rechteck{  // Allgemein ist es nicht so, dass folgender Ausdruck wahr ist.  // sizeof(struct rechteck) == sizeof(int) + sizeof(int)  // Dies ist so, weil potentiell ein Padding zwischen den Struktur-Inhalten -// möglich ist). siehe [1] +// möglich ist). (siehe [1, Englisch])  void funktion_1(){      struct rechteck mein_rechteck; @@ -669,7 +669,7 @@ void funktion_1(){      mein_rechteck_ptr->hoehe = 10; // Das gleiche wie: (*mein_rechteck_ptr).hoehe = 10;  } -// Aus Bequemlichkeitsgründen ist es möglich einem `struct` ein `typedef`hinzuzufügen. +// Aus Bequemlichkeitsgründen ist es möglich einem `struct` ein `typedef` hinzuzufügen.  typedef struct rechteck recht;  int flaeche(recht r){ @@ -689,7 +689,7 @@ int flaecheptr(const recht *r){  /*   Zur Laufzeit sind Funktionen in einer Speicheradresse gespeichert.   Funktionspointer sind wie normale Pointer (es wird einfach eine Speicheradresse  -geseichert). Funktionspointer können verwendet werden, um Funktionen und +gespeichert). Funktionspointer können verwendet werden, um Funktionen und  Handler (oder Callback-Funktionen) direkt aufzurufen.  Wie auch immer, die Syntax kann zu Beginn verwirrend wirken. @@ -725,8 +725,10 @@ typedef void (*mein_fnp_type)(char *);  '\f'; // Neue Seite (new page (form feed))  '\r'; // Wagenrücklauf (carriage return)  '\b'; // Backspace-Zeichen (backspace character) -'\0'; // Null-Byte (NULL character). In C wird dieses Zeichen normalerweise am Ende eines Strings gesetzt. -//   Beispiel: Hallo\n\0. \0  wird per Konvention verwendet, um das Ende eines Strings zu kennzeichnen. +'\0'; // Null-Byte (NULL character). In C wird dieses Zeichen normalerweise am +// Ende eines Strings gesetzt. +// Beispiel: Hallo\n\0. "\0"  wird per Konvention verwendet, um das Ende +// eines Strings zu kennzeichnen.  '\\'; // Backslash (backslash)  '\?'; // Fragezeichen (question mark)  '\''; // einfaches Anführungszeichen (single quote) @@ -736,20 +738,20 @@ typedef void (*mein_fnp_type)(char *);  //Ausgabeformatierung  "%d";    // Integer -"%3d";   // integer mit einer minimalen Länge von drei Zeichen. +"%3d";   // Integer mit einer minimalen Länge von drei Zeichen.  "%s";    // String -"%f";    // Float -"%ld";   // Long -"%3.2f"; // Mindest drei Zeichen vor und drei nach dem Komma. +"%f";    // Gleitkommazahl (float) +"%ld";   // genauere Gleitkommazahl (long) +"%3.2f"; // Mindestens drei Zeichen vor und drei nach dem Komma.  "%7.4s"; // (Kann auch mit Strings gemacht werden) -"%c";    // Char -"%p";    // Pointer. Merke: man muss den Pointer zu void umwandeln, bevor `printf`funktioniert. +"%c";    // einzelnes Zeichen (char) +"%p";    // Pointer. Merke: man muss den Pointer zu void umwandeln, bevor `printf` funktioniert.  "%x";    // Hexadezimal  "%o";    // Oktalzahl  "%%";    // Gibt % aus  //////////////////////////////////////////////// -// Reihenfolge der Auswertung +// Reihenfolge der Auswertung von Operatoren  ////////////////////////////////////////////////  //-------------------------------------------------------// @@ -780,7 +782,7 @@ typedef void (*mein_fnp_type)(char *);  /*  Header-Dateien sind ein wichtiger Teil von C, da sie eine Verbindung zwischen   unterschiedlichen C-Quelldateien herstellen. Ausserdem vereinfachen Header-Dateien -den Code und Definitionen, da diese in separaten Daten geschrieben werden können. +den Code und Definitionen, da diese in separaten Dateien geschrieben werden können.  Header-Dateien sind von der Syntax her ähnlich zu C-Quelldateien, allerdings haben  die Header-Dateien die Dateiendung `.h`. Header-Dateien können im Quellcode mit @@ -811,7 +813,7 @@ befindet wie die C-Quelldatei.  // wichtig, damit sichergestellt werden kann, dass a und b nicht unerwartet   // erweitert werden. Zum Beispiel: `MUL (x,y) (x * y)`; Bei der Verwendung von   // `MUL(1 + 2, 3)` würde dies wie folgt erweitert werden: `(1 + 2 * 3)`, was zu -// einem falschen Resultat führen würde. +// einem falschen Resultat führt.  // Strukturen und Typendefinitionen können verwendet werden, um die Konsistenz  // zwischen unterschiedlichen Dateien beizubehalten. | 
