1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-12 01:34:19 +02:00

Changed some lines so that it is not more than 80 chars

This commit is contained in:
caminsha
2020-02-01 02:26:58 +01:00
parent a765253cd4
commit 8e1372e08b

View File

@@ -73,9 +73,10 @@ int main(void){
// dein Programm // dein Programm
} }
// Die Kommandozeilenargumente, welche gebraucht werden, damit dein Programm läuft, // Die Kommandozeilenargumente, welche gebraucht werden, damit dein Programm
// werden als Argumente der `main`-Funktion mitgegeben. // läuft, werden als Argumente der `main`-Funktion mitgegeben.
// argc steht für die Anzahl von Argumenten. - Der Programmname ist das erste Argument. // 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 ist ein Array von Zeichenarrays, welche die Argumente beinhaltet.
// argv[0] = Name des Programms // argv[0] = Name des Programms
// argv[1] = erstes Argument usw. // argv[1] = erstes Argument usw.
@@ -116,7 +117,8 @@ int main (int argc, char** argv){
// doubles sind normalerweise 64-Bit Gleitkommazahlen // doubles sind normalerweise 64-Bit Gleitkommazahlen
double x_double = 0.0; // echte Zahlen ohne Suffix sind vom Typ double 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 short ux_short;
unsigned int ux_int; unsigned int ux_int;
unsigned long long ux_long_long; 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(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.) // 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 // Wenn das Argument des `sizeof`-Operator ein Ausdruck ist, dann wird das
// Argument nicht ausgewertet (ausser Arrays mit variabler Länge) // 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 // 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 // Länge deklariert werden. Die Grösse eines solchen Array muss eine Konstante
// zur Kompilierzeit sein. // 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; int array_size;
fcsanf(stdin, "%d", &array_size); fcsanf(stdin, "%d", &array_size);
int var_length_array[array_size]; // deklariere Array mit variabler Länge 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 // Es gibt auch die Möglichkeit, Modulo zu rechnen
11 % 3; // => 2 11 % 3; // => 2
// Vergleichsoperatoren sind vielleicht schon bekannt, aber in C gibt es keinen // Vergleichsoperatoren sind vielleicht schon bekannt, aber in C gibt es
// Boolean-Typ. In C verwenden wir `int`. (Oder _Bool oder bool in C99.) // keinen Boolean-Typ. In C verwenden wir `int`. (Oder _Bool oder bool in C99)
// 0 ist falsch, alles andere ist wahr (Die Vergleichsoperatoren ergeben // 0 ist falsch, alles andere ist wahr (Die Vergleichsoperatoren ergeben
// immer 1 oder 0. // immer 1 oder 0.
3 == 2; // => 0 (falsch) 3 == 2; // => 0 (falsch)
@@ -274,14 +277,16 @@ int main (int argc, char** argv){
// das gleiche gilt für j-- und --j // das gleiche gilt für j-- und --j
// Bitweise Operatoren // 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; // => 0x00 (Bitweises UND)
0x0F | 0xF0; // => 0xFF (Bitweises ODER) 0x0F | 0xF0; // => 0xFF (Bitweises ODER)
0x04 ^ 0x0F; // => 0x0B (Bitweises XOR) 0x04 ^ 0x0F; // => 0x0B (Bitweises XOR)
0x01 << 1; // => 0x02 (Bitweises Linksverschiebung (left shift) (um 1)) 0x01 << 1; // => 0x02 (Bitweises Linksverschiebung (left shift) (um 1))
0x02 >> 1; // => 0x01 (Bitweises Rechtsverschiebung (right 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) // - Verschiebung in das Vorzeichenbit (int a = 1 << 31)
// - Linksshift einer negativen Zahl (int a = -1 << 2) // - Linksshift einer negativen Zahl (int a = -1 << 2)
// - Shift um einen Offset, welcher >= die Breite des linken Ausdrucks ist. // - 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 // While-Schleifen existieren auch
int ii = 0; int ii = 0;
while (ii < 10){ // JEDER Wert unter zehn ist wahr 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, " } // => gibt folgendes aus: "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "
printf("\n"); printf("\n");
@@ -338,12 +344,13 @@ int main (int argc, char** argv){
switch (a){ 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"); 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: case 1:
printf("Huh, 'a' ist gleich 1!\n"); printf("Huh, 'a' ist gleich 1!\n");
break; break;
// Sei vorsichtig - wenn man das `break` vergisst, werden alle Anweisungen // Sei vorsichtig - wenn man das `break` vergisst, werden alle
// ausgeführt bis das nächste `break` erscheint. // Anweisungen ausgeführt bis das nächste `break` erscheint.
case 3: case 3:
case 4: case 4:
printf("Schau mal ... 'a' ist entweder 3 oder 4.\n"); printf("Schau mal ... 'a' ist entweder 3 oder 4.\n");
@@ -388,7 +395,7 @@ error:
printf("%d\n", (char) x_hex); // => 1 printf("%d\n", (char) x_hex); // => 1
// Typen werden überlaufen (overflow) ohne jegliche Warnung // 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` // Um den maximalen Wert eines `char`, `signed char` oder `unsigned char`
// herauszufinden, können die Makros `CHAR_MAX`, `SCHAR_MAX` und `UCHAR_MAX` // 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. // von Variablen abrufen und dann mit diesen herumspielen.
int x = 0; 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*) // %p formattiert einen Objektpointer des Typen void*)
// => Gibt eine Adresse im Speicher aus // => Gibt eine Adresse im Speicher aus
@@ -506,7 +514,8 @@ error:
// Das Dereferenzieren von nicht alloziertem Speicher führt zu einem // Das Dereferenzieren von nicht alloziertem Speicher führt zu einem
// Undefinierten Verhalten. // 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, // Nachdem du fertig mit einem Block bist, welcher `malloc` verwendet hat,
// muss der Speicher befreit werden. Ansonsten kann dieser Speicherbereich // 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. // `strlen()` ist ein Teil der C Standard-Bibliothek.
// Merke: Die Länge, welche von `strlen` zurückgegeben wird, ist ohne den // Merke: Die Länge, welche von `strlen` zurückgegeben wird, ist ohne den
// Null-Byte Terminator. // 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]; tmp = str_in[ii];
str_in[ii] = str_in[laenge - ii - 1]; //#ii'tes Zeichen vom Ende her str_in[ii] = str_in[laenge - ii - 1]; //#ii'tes Zeichen vom Ende her
str_in[laenge - ii- 1] = tmp; str_in[laenge - ii- 1] = tmp;
@@ -621,8 +630,9 @@ void test_funktion(){
// Das Schlüsselwort `static` macht, dass eine Variable ausserhalb der Kompilier- // Das Schlüsselwort `static` macht, dass eine Variable ausserhalb der Kompilier-
// einheit nicht zugreifbar ist. (Auf den meisten Systemen ist eine Kompiliereinheit // 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) // eine `.c`-Datei.) Das Schlüsselwort `static` kann sowohl global
// Variablen, Funktionen und Funktionslokale Variablen angewendet werden. // (zur Kompiliereinheit gehörende) Variablen, Funktionen und Funktionslokale
// Variablen angewendet werden.
// Wenn man `static` bei lokalen Variablen verwendet, so ist diese Variable global // Wenn man `static` bei lokalen Variablen verwendet, so ist diese Variable global
// erreichbar und behält dessen Wert über Funktionsaufrufe hinweg, aber sie ist // erreichbar und behält dessen Wert über Funktionsaufrufe hinweg, aber sie ist
// nur innerhalb der deklarierten Funktion verfügbar. Ausserdem werden statische // nur innerhalb der deklarierten Funktion verfügbar. Ausserdem werden statische
@@ -665,8 +675,9 @@ void funktion_1(){
// Verwende Dereferenzierung, um Struct-Inhalte zu bearbeiten // Verwende Dereferenzierung, um Struct-Inhalte zu bearbeiten
(*mein_rechteck_ptr).breite = 30; (*mein_rechteck_ptr).breite = 30;
//Noch besser: Verwende die Kurzschreibweise ->, um die Lesbarkeit zu verbessern. //Noch besser: Verwende die Kurzschreibweise ->, um die Lesbarkeit zu
mein_rechteck_ptr->hoehe = 10; // Das gleiche wie: (*mein_rechteck_ptr).hoehe = 10; // 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. // 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){ void str_reverse_through_pointer(char *str_in){
// Definiere eine Funktionspointer-Variable, welche f genannt wird. // Definiere eine Funktionspointer-Variable, welche f genannt wird.
void (*f)(char *); // Signatur sollte genau der Funktion entsprechen. 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 // `f = str_reverse;` würde auch funktionieren, da Funktionen zu Pointern
// reduziert werden (ähnlich wie Arrays) // reduziert werden (ähnlich wie Arrays)
(*f)(str_in); // Die Funktion einfach mit dem Pointer aufrufen (*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) '\?'; // Fragezeichen (question mark)
'\''; // einfaches Anführungszeichen (single quote) '\''; // einfaches Anführungszeichen (single quote)
'\"'; // doppeltes Anführungszeichen (double 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 '\0oo'; // Oktalzahl (octal number). Beispiel \013 = Zeichen für vertikalen Tab
//Ausgabeformatierung //Ausgabeformatierung
@@ -745,7 +759,8 @@ typedef void (*mein_fnp_type)(char *);
"%3.2f"; // Mindestens drei Zeichen vor und drei nach dem Komma. "%3.2f"; // Mindestens drei Zeichen vor und drei nach dem Komma.
"%7.4s"; // (Kann auch mit Strings gemacht werden) "%7.4s"; // (Kann auch mit Strings gemacht werden)
"%c"; // einzelnes Zeichen (char) "%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 "%x"; // Hexadezimal
"%o"; // Oktalzahl "%o"; // Oktalzahl
"%%"; // Gibt % aus "%%"; // Gibt % aus
@@ -841,8 +856,9 @@ Knoten erstelleVerketteteListe(int *werte, int laenge);
Das Beste wird es sein, wenn man sich ein Exemplar des Buches 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. ["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, Dieses Buch gilt als **das** Buch über die Programmiersprache C und wurde
dem Erfinder der Programmiersprache C, und Brian Kernighan geschrieben. von Dennis Ritchie, dem Erfinder der Programmiersprache C, und Brian Kernighan
geschrieben.
Sei vorsichtig, da dieses Buch mittlerweile schon etwas älter ist und gewisse Sei vorsichtig, da dieses Buch mittlerweile schon etwas älter ist und gewisse
Unkorrektheiten (d.h. Ideen, welche nicht mehr als gut empfunden werden.) oder Unkorrektheiten (d.h. Ideen, welche nicht mehr als gut empfunden werden.) oder
mittlerweile geänderte Praktiken enthält. [Hinweis: Das Buch wurde auf Englisch 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 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] 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) [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)