Implementieren von C++-Operatoren

C++C++Beginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie lernen, wie Sie verschiedene C++-Operatoren implementieren, einschließlich grundlegender mathematischer Operationen, Inkrement/Dekrement, relationaler und logischer Operatoren, bitweiser Operationen, zusammengesetzter Zuweisungen, Operatorrangfolge und des ternären bedingten Operators. Diese grundlegenden Operatoren sind unerlässlich für die Durchführung von Arithmetik, das Anstellen von Vergleichen und die Manipulation von Daten in der C++-Programmierung. Durch eine Reihe von praktischen Übungen werden Sie ein solides Verständnis dafür erlangen, wie Sie diese Operatoren effektiv nutzen können, um komplexere und effizientere C++-Anwendungen zu entwickeln.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Anfänger mit einer Abschlussquote von 80% ist. Es hat eine positive Bewertungsrate von 96% von den Lernenden erhalten.

Führen Sie grundlegende mathematische Operationen aus (+, -, *, /, %)

In diesem Schritt werden Sie lernen, wie Sie grundlegende mathematische Operationen in C++ ausführen. Mathematische Operationen sind für die Programmierung von grundlegender Bedeutung und ermöglichen es Ihnen, numerische Werte mit Standardarithmetikoperatoren zu manipulieren.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens math_operations.cpp im Verzeichnis ~/project:

touch ~/project/math_operations.cpp

Fügen Sie den folgenden Code zur Datei math_operations.cpp hinzu:

#include <iostream>

int main() {
    // Declare variables for mathematical operations
    int a = 10;
    int b = 3;

    // Addition (+)
    int sum = a + b;
    std::cout << "Addition: " << a << " + " << b << " = " << sum << std::endl;

    // Subtraction (-)
    int difference = a - b;
    std::cout << "Subtraction: " << a << " - " << b << " = " << difference << std::endl;

    // Multiplication (*)
    int product = a * b;
    std::cout << "Multiplication: " << a << " * " << b << " = " << product << std::endl;

    // Division (/)
    int quotient = a / b;
    std::cout << "Division: " << a << " / " << b << " = " << quotient << std::endl;

    // Modulus (%) - Remainder of division
    int remainder = a % b;
    std::cout << "Modulus: " << a << " % " << b << " = " << remainder << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ math_operations.cpp -o math_operations
./math_operations

Beispielausgabe:

Addition: 10 + 3 = 13
Subtraction: 10 - 3 = 7
Multiplication: 10 * 3 = 30
Division: 10 / 3 = 3
Modulus: 10 % 3 = 1

Lassen Sie uns die mathematischen Operatoren analysieren:

  1. + (Addition): Addiert zwei Zahlen. Beispielsweise würde 5 + 3 das Ergebnis 8 liefern.
  2. - (Subtraktion): Subtrahiert die zweite Zahl von der ersten. Beispielsweise würde 10 - 4 das Ergebnis 6 liefern.
  3. * (Multiplikation): Multipliziert zwei Zahlen. Beispielsweise würde 6 * 7 das Ergebnis 42 liefern.
  4. / (Division): Teilt die erste Zahl durch die zweite. Wenn beide Zahlen Ganzzahlen sind, ergibt dies eine Ganzzahldivision, d. h. der Dezimalteil wird abgeschnitten. Beispielsweise würde 10 / 3 das Ergebnis 3 liefern.
  5. % (Modulo): Gibt den Rest der Division zurück. Beispielsweise würde 10 % 3 das Ergebnis 1 liefern, da der Rest von 10 geteilt durch 3 gleich 1 ist.

Einige wichtige Hinweise:

  • Die Ganzzahldivision schneidet den Dezimalteil ab. Beispielsweise wird 5 / 2 das Ergebnis 2 und nicht 2,5 liefern.
  • Der Modulo-Operator funktioniert nur mit Ganzzahltypen. Sie können ihn nicht mit Fließkommazahlen (wie float oder double) verwenden.
  • Seien Sie immer vorsichtig bei der Division durch Null, die Laufzeitfehler verursacht. Ihr Programm stürzt ab, wenn Sie versuchen, eine beliebige Zahl durch Null zu teilen.

Verwenden Sie Prä- und Post-Inkrement/Dekrement (++i, i++)

In diesem Schritt werden Sie sich mit den Inkrement- und Dekrementoperatoren in C++ vertraut machen. Diese Operatoren ermöglichen es Ihnen, den Wert einer Variablen um 1 zu erhöhen oder zu verringern, wobei es feine Unterschiede zwischen Prä-Inkrement und Post-Inkrement gibt.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens increment_decrement.cpp im Verzeichnis ~/project:

touch ~/project/increment_decrement.cpp

Fügen Sie den folgenden Code zur Datei increment_decrement.cpp hinzu:

#include <iostream>

int main() {
    // Pre-increment (++i)
    int a = 5;
    std::cout << "Original value of a: " << a << std::endl;

    // Pre-increment: increment happens before the value is used
    std::cout << "Pre-increment (++a): " << ++a << std::endl;
    std::cout << "Value after pre-increment: " << a << std::endl;

    // Post-increment (i++)
    int b = 5;
    std::cout << "\nOriginal value of b: " << b << std::endl;

    // Post-increment: increment happens after the value is used
    std::cout << "Post-increment (b++): " << b++ << std::endl;
    std::cout << "Value after post-increment: " << b << std::endl;

    // Decrement operators work similarly
    int c = 5;
    std::cout << "\nPre-decrement (--c): " << --c << std::endl;

    int d = 5;
    std::cout << "Post-decrement (d--): " << d-- << std::endl;
    std::cout << "Value after post-decrement: " << d << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ increment_decrement.cpp -o increment_decrement
./increment_decrement

Beispielausgabe:

Original value of a: 5
Pre-increment (++a): 6
Value after pre-increment: 6

Original value of b: 5
Post-increment (b++): 5
Value after post-increment: 6

Pre-decrement (--c): 4
Post-decrement (d--): 5
Value after post-decrement: 4

Wichtige Unterschiede:

  • Prä-Inkrement ++i: Erhöht den Wert bevor er in einem Ausdruck verwendet wird. Im Codebeispiel erhöht ++a zunächst a auf 6, und dann wird der Wert 6 in der cout-Anweisung verwendet.
  • Post-Inkrement i++: Verwendet zunächst den aktuellen Wert in einem Ausdruck und erhöht dann den Wert. Im Codebeispiel verwendet b++ zunächst den aktuellen Wert von b, der in der cout-Anweisung 5 ist, und erhöht dann b auf 6.

Die gleichen Prinzipien gelten für die Dekrementoperatoren --i und i--, wobei --i zunächst den Wert verringert und dann verwendet, und i-- zunächst den Wert verwendet und dann verringert.

Wichtige Hinweise:

  • Prä-Inkrement ändert den Wert, bevor er in einem Ausdruck verwendet wird, was bedeutet, dass der erhöhte Wert sofort für die Verwendung zur Verfügung steht.
  • Post-Inkrement verwendet zunächst den ursprünglichen Wert und erhöht dann. Dies bedeutet, dass Sie in der aktuellen Anweisung den ursprünglichen Wert und in der nächsten den erhöhten Wert erhalten.
  • Diese Operatoren werden häufig in Schleifen (wie for-Schleifen) und komplexen Ausdrücken verwendet, wenn Sie eine Variable ändern möchten, während Sie gleichzeitig ihren Wert verwenden.
  • Wenn Sie diese Operatoren verwenden, insbesondere in komplexen Ausdrücken, ist es wichtig, zu bedenken, ob Sie die Prä- oder Post-Version benötigen, um das gewünschte Verhalten zu erzielen.

Vergleichen Sie Werte mit relationalen Operatoren (<, >, ==,!=)

In diesem Schritt werden Sie sich mit relationalen Operatoren in C++ vertraut machen. Diese Operatoren helfen Ihnen, Werte zu vergleichen und Beziehungen zwischen verschiedenen Zahlen oder Variablen zu bestimmen.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens relational_operators.cpp im Verzeichnis ~/project:

touch ~/project/relational_operators.cpp

Fügen Sie den folgenden Code zur Datei relational_operators.cpp hinzu:

#include <iostream>

int main() {
    int a = 10;
    int b = 5;
    int c = 10;

    // Less than (<)
    std::cout << "Less than (<):" << std::endl;
    std::cout << a << " < " << b << " is " << (a < b) << std::endl;
    std::cout << b << " < " << a << " is " << (b < a) << std::endl;

    // Greater than (>)
    std::cout << "\nGreater than (>):" << std::endl;
    std::cout << a << " > " << b << " is " << (a > b) << std::endl;
    std::cout << b << " > " << a << " is " << (b > a) << std::endl;

    // Equal to (==)
    std::cout << "\nEqual to (==):" << std::endl;
    std::cout << a << " == " << b << " is " << (a == b) << std::endl;
    std::cout << a << " == " << c << " is " << (a == c) << std::endl;

    // Not equal to (!=)
    std::cout << "\nNot equal to (!=):" << std::endl;
    std::cout << a << "!= " << b << " is " << (a!= b) << std::endl;
    std::cout << a << "!= " << c << " is " << (a!= c) << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ relational_operators.cpp -o relational_operators
./relational_operators

Beispielausgabe:

Less than (<):
10 < 5 is 0
5 < 10 is 1

Greater than (>):
10 > 5 is 1
5 > 10 is 0

Equal to (==):
10 == 5 is 0
10 == 10 is 1

Not equal to (!=):
10!= 5 is 1
10!= 10 is 0

Wichtige Punkte zu relationalen Operatoren:

  • < (Kleiner als): Überprüft, ob der linke Wert kleiner als der rechte Wert ist. Beispielsweise ist 5 < 10 wahr (gibt 1 zurück), während 10 < 5 falsch ist (gibt 0 zurück).
  • > (Größer als): Überprüft, ob der linke Wert größer als der rechte Wert ist. Beispielsweise ist 10 > 5 wahr (gibt 1 zurück), während 5 > 10 falsch ist (gibt 0 zurück).
  • == (Gleich): Überprüft, ob zwei Werte genau gleich sind. Beispielsweise ist 5 == 5 wahr (gibt 1 zurück), während 5 == 6 falsch ist (gibt 0 zurück).
  • != (Ungleich): Überprüft, ob zwei Werte ungleich sind. Beispielsweise ist 5!= 6 wahr (gibt 1 zurück), während 5!= 5 falsch ist (gibt 0 zurück).
  • Diese Operatoren geben 1 (wahr) oder 0 (falsch) zurück. In C++ steht 1 für wahr und 0 für falsch. Diese Werte können in bedingten Anweisungen verwendet werden.

Wichtige Hinweise:

  • Relationale Operatoren sind für die Erstellung von bedingten Anweisungen von grundlegender Bedeutung und ermöglichen es Ihrem Programm, Entscheidungen auf der Grundlage von Vergleichen zu treffen.
  • Sie geben immer einen booleschen Wert zurück, der in C++ durch eine Ganzzahl repräsentiert wird (1 für wahr, 0 für falsch).
  • Diese Operatoren werden häufig in if-Anweisungen, while-Schleifen und for-Schleifen verwendet, um den Programmablauf zu steuern.

Kombinieren Sie Bedingungen mit logischem UND (&&) und ODER (||)

In diesem Schritt werden Sie lernen, wie Sie mehrere Bedingungen mit den logischen Operatoren UND (&&) und ODER (||) in C++ kombinieren. Diese Operatoren helfen Ihnen, komplexere bedingte Anweisungen zu erstellen, indem sie mehrere Bedingungen auswerten.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens logical_operators.cpp im Verzeichnis ~/project:

touch ~/project/logical_operators.cpp

Fügen Sie den folgenden Code zur Datei logical_operators.cpp hinzu:

#include <iostream>

int main() {
    int x = 10;
    int y = 5;
    int z = 15;

    // Logical AND (&&) operator
    std::cout << "Logical AND (&&) operator:" << std::endl;

    // Both conditions must be true
    if (x > y && x < z) {
        std::cout << "x is greater than y AND less than z" << std::endl;
    }

    if (x > 20 && y < 10) {
        std::cout << "This will not be printed" << std::endl;
    }

    // Logical OR (||) operator
    std::cout << "\nLogical OR (||) operator:" << std::endl;

    // At least one condition must be true
    if (x > 20 || y < 10) {
        std::cout << "At least one condition is true" << std::endl;
    }

    if (x > 20 || z < 20) {
        std::cout << "Another true condition" << std::endl;
    }

    // Combining AND and OR
    std::cout << "\nCombining AND and OR:" << std::endl;

    if ((x > y && y < z) || x == 10) {
        std::cout << "Complex condition is true" << std::endl;
    }

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ logical_operators.cpp -o logical_operators
./logical_operators

Beispielausgabe:

Logical AND (&&) operator:
x is greater than y AND less than z

Logical OR (||) operator:
At least one condition is true
Another true condition

Combining AND and OR:
Complex condition is true

Wichtige Punkte zu logischen Operatoren:

  • && (UND): Beide Bedingungen, die durch && verbunden sind, müssen wahr sein, damit der gesamte Ausdruck wahr ist. Wenn eine der Bedingungen falsch ist, wird der gesamte Ausdruck als falsch ausgewertet. Im Code ist x > y && x < z wahr, weil x > y (10 > 5) und x < z (10 < 15) beide wahr sind.
  • || (ODER): Mindestens eine der Bedingungen, die durch || verbunden sind, muss wahr sein, damit der gesamte Ausdruck wahr ist. Wenn alle Bedingungen falsch sind, wird der gesamte Ausdruck als falsch ausgewertet. Im Code ist x > 20 || y < 10 wahr, weil y < 10 (5 < 10) wahr ist.
  • Sie können mehrere Bedingungen mit Klammern kombinieren, um die Auswertungsreihenfolge zu steuern. Dies macht Ihre komplexen Ausdrücke leichter lesbar und verständlich.
  • Diese Operatoren sind äußerst nützlich für die Erstellung komplexer Entscheidungslogiken in bedingten Anweisungen.

Wichtige Hinweise:

  • Logische Operatoren werden oft in if-Anweisungen, while-Schleifen und anderen Kontrollstrukturen verwendet, um Ihre Programme vielseitiger zu gestalten.
  • Sie helfen, ausgefeiltere bedingte Prüfungen zu erstellen, indem Sie es ermöglichen, mehrere Kriterien gleichzeitig zu prüfen.
  • Kurzschlussauswertung:
    • Bei && wird die zweite Bedingung nicht ausgewertet, wenn die erste Bedingung falsch ist, da der gesamte Ausdruck unabhängig von der zweiten Bedingung falsch sein wird. Diese Optimierung kann die Leistung verbessern.
    • Bei || wird die zweite Bedingung nicht ausgewertet, wenn die erste Bedingung wahr ist, da der gesamte Ausdruck wahr sein wird.

Anwenden von bitweisen Operationen zur Binärmanipulation

In diesem Schritt werden Sie sich mit bitweisen Operatoren in C++ vertraut machen. Diese Operatoren arbeiten direkt auf der binären Darstellung von Ganzzahlen und ermöglichen es Ihnen, einzelne Bits zu manipulieren.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens bitwise_operations.cpp im Verzeichnis ~/project:

touch ~/project/bitwise_operations.cpp

Fügen Sie den folgenden Code zur Datei bitwise_operations.cpp hinzu:

#include <iostream>
#include <bitset>

int main() {
    // Binary representation of numbers
    unsigned int a = 5;   // 0101 in binary
    unsigned int b = 3;   // 0011 in binary

    // Bitwise AND (&)
    std::cout << "Bitwise AND (&):" << std::endl;
    std::cout << "a = " << std::bitset<4>(a) << " (5 in decimal)" << std::endl;
    std::cout << "b = " << std::bitset<4>(b) << " (3 in decimal)" << std::endl;
    unsigned int and_result = a & b;
    std::cout << "a & b = " << std::bitset<4>(and_result)
              << " (" << and_result << " in decimal)" << std::endl;

    // Bitwise OR (|)
    std::cout << "\nBitwise OR (|):" << std::endl;
    unsigned int or_result = a | b;
    std::cout << "a | b = " << std::bitset<4>(or_result)
              << " (" << or_result << " in decimal)" << std::endl;

    // Bitwise XOR (^)
    std::cout << "\nBitwise XOR (^):" << std::endl;
    unsigned int xor_result = a ^ b;
    std::cout << "a ^ b = " << std::bitset<4>(xor_result)
              << " (" << xor_result << " in decimal)" << std::endl;

    // Bitwise NOT (~)
    std::cout << "\nBitwise NOT (~):" << std::endl;
    unsigned int not_result = ~a;
    std::cout << "~a = " << std::bitset<32>(not_result)
              << " (" << not_result << " in decimal)" << std::endl;

    // Left shift (<<)
    std::cout << "\nLeft Shift (<<):" << std::endl;
    unsigned int left_shift = a << 2;
    std::cout << "a << 2 = " << std::bitset<8>(left_shift)
              << " (" << left_shift << " in decimal)" << std::endl;

    // Right shift (>>)
    std::cout << "\nRight Shift (>>):" << std::endl;
    unsigned int right_shift = a >> 1;
    std::cout << "a >> 1 = " << std::bitset<4>(right_shift)
              << " (" << right_shift << " in decimal)" << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ bitwise_operations.cpp -o bitwise_operations
./bitwise_operations

Beispielausgabe:

Bitwise AND (&):
a = 0101 (5 in decimal)
b = 0011 (3 in decimal)
a & b = 0001 (1 in decimal)

Bitwise OR (|):
a | b = 0111 (7 in decimal)

Bitwise XOR (^):
a ^ b = 0110 (6 in decimal)

Bitwise NOT (~):
~a = 11111111111111111111111111111010 (4294967290 in decimal)

Left Shift (<<):
a << 2 = 00010100 (20 in decimal)

Right Shift (>>):
a >> 1 = 0010 (2 in decimal)

Wichtige Punkte zu bitweisen Operatoren:

  • & (AND): Vergleicht die entsprechenden Bits von zwei Zahlen. Wenn beide Bits 1 sind, ist das resultierende Bit 1; andernfalls ist es 0. Im Codebeispiel ergibt 5 & 3 (binär 0101 & 0011) 0001, was in Dezimaldarstellung 1 ist.
  • | (OR): Vergleicht die entsprechenden Bits von zwei Zahlen. Wenn mindestens eines der Bits 1 ist, ist das resultierende Bit 1; andernfalls ist es 0. Im Beispiel ergibt 5 | 3 (binär 0101 | 0011) 0111, was in Dezimaldarstellung 7 ist.
  • ^ (XOR): Vergleicht die entsprechenden Bits von zwei Zahlen. Wenn die Bits unterschiedlich sind, ist das resultierende Bit 1; andernfalls ist es 0. Im Beispiel ergibt 5 ^ 3 (binär 0101 ^ 0011) 0110, was in Dezimaldarstellung 6 ist.
  • ~ (NOT): Invertiert alle Bits einer Zahl. Wenn ein Bit 1 ist, wird es 0, und umgekehrt. Beachten Sie, dass die Ausgabe ~a 11111111111111111111111111111010 ist, was die binäre Darstellung des Ergebnisses ist, wenn die Zahl als 32-Bit vorzeichenlose Ganzzahl behandelt wird.
  • << (Linksshift): Verschiebt die Bits einer Zahl um eine angegebene Anzahl von Positionen nach links. Dies entspricht effektiv einer Multiplikation der Zahl mit 2 pro Verschiebung. Im Beispiel verschiebt 5 << 2 (binär 0101 << 2) die Bits zu 010100, was in Dezimaldarstellung 20 ist.
  • >> (Rechtsverschiebung): Verschiebt die Bits einer Zahl um eine angegebene Anzahl von Positionen nach rechts. Dies entspricht effektiv einer Division der Zahl durch 2 pro Verschiebung. Im Beispiel verschiebt 5 >> 1 (binär 0101 >> 1) die Bits zu 0010, was in Dezimaldarstellung 2 ist.

Wichtige Hinweise:

  • Bitweise Operationen arbeiten direkt auf den binären Darstellungen von Ganzzahlen und ermöglichen eine niedrigere Ebene der Manipulation und Optimierung.
  • Sie werden häufig in eingebetteten Systemen, Grafikprogrammierung und Szenarien verwendet, in denen Sie einzelne Bits innerhalb eines Werts setzen, löschen oder testen müssen.
  • Seien Sie vorsichtig mit vorzeichenbehafteten und vorzeichenlosen Ganzzahlen, da das Verhalten der Rechtsverschiebung variieren kann (arithmetische vs. logische Verschiebung).
  • Die Verwendung von std::bitset hilft dabei, zu verstehen, wie diese Operationen auf Bit-Ebene funktionieren.

Verwenden Sie zusammengesetzte Zuweisungsoperatoren (+=, -=, *=)

In diesem Schritt werden Sie sich mit zusammengesetzten Zuweisungsoperatoren in C++ vertraut machen. Diese Operatoren kombinieren eine arithmetische Operation mit einer Zuweisung, wodurch Ihr Code kompakter und lesbarer wird.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens compound_operators.cpp im Verzeichnis ~/project:

touch ~/project/compound_operators.cpp

Fügen Sie den folgenden Code zur Datei compound_operators.cpp hinzu:

#include <iostream>

int main() {
    // Initialize variables
    int x = 10;
    int y = 5;

    // Addition assignment (+=)
    std::cout << "Addition Assignment (+=):" << std::endl;
    std::cout << "Initial x: " << x << std::endl;
    x += 3;  // Equivalent to x = x + 3
    std::cout << "x += 3: " << x << std::endl;

    // Subtraction assignment (-=)
    std::cout << "\nSubtraction Assignment (-=):" << std::endl;
    std::cout << "Initial y: " << y << std::endl;
    y -= 2;  // Equivalent to y = y - 2
    std::cout << "y -= 2: " << y << std::endl;

    // Multiplication assignment (*=)
    std::cout << "\nMultiplication Assignment (*=):" << std::endl;
    int z = 4;
    std::cout << "Initial z: " << z << std::endl;
    z *= 3;  // Equivalent to z = z * 3
    std::cout << "z *= 3: " << z << std::endl;

    // Division assignment (/=)
    std::cout << "\nDivision Assignment (/=):" << std::endl;
    int a = 15;
    std::cout << "Initial a: " << a << std::endl;
    a /= 3;  // Equivalent to a = a / 3
    std::cout << "a /= 3: " << a << std::endl;

    // Modulus assignment (%=)
    std::cout << "\nModulus Assignment (%=):" << std::endl;
    int b = 17;
    std::cout << "Initial b: " << b << std::endl;
    b %= 5;  // Equivalent to b = b % 5
    std::cout << "b %= 5: " << b << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ compound_operators.cpp -o compound_operators
./compound_operators

Beispielausgabe:

Addition Assignment (+=):
Initial x: 10
x += 3: 13

Subtraction Assignment (-=):
Initial y: 5
y -= 2: 3

Multiplication Assignment (*=):
Initial z: 4
z *= 3: 12

Division Assignment (/=):
Initial a: 15
a /= 3: 5

Modulus Assignment (%=):
Initial b: 17
b %= 5: 2

Wichtige Punkte zu zusammengesetzten Zuweisungsoperatoren:

  • += (Addieren und zuweisen): Addiert den rechten Operanden zum linken Operanden und weist das Ergebnis dem linken Operanden zu. x += 3 ist äquivalent zu x = x + 3.
  • -= (Subtrahieren und zuweisen): Subtrahiert den rechten Operanden vom linken Operanden und weist das Ergebnis dem linken Operanden zu. y -= 2 ist äquivalent zu y = y - 2.
  • *= (Multiplizieren und zuweisen): Multipliziert den linken Operanden mit dem rechten Operanden und weist das Ergebnis dem linken Operanden zu. z *= 3 ist äquivalent zu z = z * 3.
  • /= (Dividieren und zuweisen): Dividiert den linken Operanden durch den rechten Operanden und weist das Ergebnis dem linken Operanden zu. a /= 3 ist äquivalent zu a = a / 3.
  • %= (Modulo und zuweisen): Berechnet den Modulo des linken Operanden durch den rechten Operanden und weist das Ergebnis dem linken Operanden zu. b %= 5 ist äquivalent zu b = b % 5.

Wichtige Hinweise:

  • Zusammengesetzte Zuweisungsoperatoren machen Ihren Code kompakter und leichter lesbar, indem sie eine Operation und eine Zuweisung in einem Schritt kombinieren.
  • Sie funktionieren mit allen grundlegenden arithmetischen Operationen (+, -, *, /, %).
  • Sie können die Tipparbeit reduzieren, den Code kürzer gestalten und möglicherweise die Leistung verbessern.

Verständnis der Operatorrangfolge bei mehreren Operatoren

In diesem Schritt werden Sie die Operatorrangfolge in C++ kennenlernen, die oft mit dem Akronym PEMDAS (Klammern, Exponenten, Multiplikation und Division, Addition und Subtraktion) in Erinnerung gehalten wird. Das Verständnis dieser Reihenfolge ist entscheidend für das Schreiben korrekter mathematischer Ausdrücke.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens order_of_operations.cpp im Verzeichnis ~/project:

touch ~/project/order_of_operations.cpp

Fügen Sie den folgenden Code zur Datei order_of_operations.cpp hinzu:

#include <iostream>

int main() {
    // Basic order of operations demonstration
    int a = 10;
    int b = 5;
    int c = 3;

    // Multiplication before addition
    std::cout << "Multiplication before Addition:" << std::endl;
    int result1 = a + b * c;
    std::cout << "a + b * c = " << result1 << std::endl;

    // Parentheses change the order of operations
    std::cout << "\nParentheses change order:" << std::endl;
    int result2 = (a + b) * c;
    std::cout << "(a + b) * c = " << result2 << std::endl;

    // Complex expression with multiple operators
    std::cout << "\nComplex Expression:" << std::endl;
    int x = 4;
    int y = 2;
    int z = 3;

    int complex_result = x + y * z - (x / y);
    std::cout << "x + y * z - (x / y) = " << complex_result << std::endl;

    // Demonstrating precedence with increment and multiplication
    std::cout << "\nIncrement and Multiplication:" << std::endl;
    int m = 3;
    int n = 2;
    int precedence_result = m++ * n;
    std::cout << "m++ * n = " << precedence_result << std::endl;
    std::cout << "m after operation = " << m << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ order_of_operations.cpp -o order_of_operations
./order_of_operations

Beispielausgabe:

Multiplication before Addition:
a + b * c = 25

Parentheses change order:
(a + b) * c = 45

Complex Expression:
x + y * z - (x / y) = 8

Increment and Multiplication:
m++ * n = 6
m after operation = 4

Wichtige Punkte zur Operatorrangfolge:

  • Die Operatorrangfolge, auch als Operatorpräzedenz bekannt, bestimmt, wie ein Ausdruck ausgewertet wird. C++ folgt dabei den Regeln der Mathematik.
  • PEMDAS/BODMAS: Dies ist ein gängiges Mnemonikum, um die Reihenfolge zu merken:
    • Parentheses / Brackets (Klammern): Ausdrücke in Klammern werden zuerst ausgewertet.
    • Exponents / Orders (Exponenten): Exponenten oder Potenzen (wie Quadratwurzeln) werden als nächstes ausgewertet. Obwohl C++ keinen eingebauten Exponentenoperator hat, bezieht sich dieser Schritt auf Operationen wie pow().
    • MD Multiplikation und Division: Multiplikation und Division haben die gleiche Präzedenz und werden von links nach rechts ausgewertet.
    • AS Addition und Subtraktion: Addition und Subtraktion haben die gleiche Präzedenz und werden von links nach rechts ausgewertet.
  • Im Code wird int result1 = a + b * c; zu 10 + (5 * 3) ausgewertet, was 10 + 15 = 25 ergibt, da Multiplikation eine höhere Präzedenz als Addition hat.
  • Klammern können die Standardoperatorrangfolge überschreiben. Der Ausdruck int result2 = (a + b) * c; wird zu (10 + 5) * 3 ausgewertet, was 15 * 3 = 45 ergibt, da der Ausdruck in den Klammern zuerst berechnet wird.
  • Die Inkrement- und Dekrementoperatoren haben spezifische Präzedenzregeln, die manchmal verwirrend sein können. Beim Post-Inkrementoperator m++ im Code wird zuerst der ursprüngliche Wert von m in der Multiplikation m * n verwendet, und erst danach wird die Variable m inkrementiert.
  • Im komplexen Ausdruck x + y * z - (x / y) werden Multiplikation und Division vor Addition und Subtraktion durchgeführt. Die Klammern sorgen dafür, dass die Ganzzahldivision x / y zuerst ausgeführt wird.
  • Verwenden Sie immer Klammern, um Ihre Absicht klar zu machen, insbesondere wenn Sie komplizierte Ausdrücke haben. Dies macht den Code nicht nur leichter lesbar, sondern stellt auch sicher, dass der Ausdruck genau wie beabsichtigt ausgewertet wird.

Wichtige Hinweise:

  • PEMDAS/BODMAS hilft dabei, vorherzusagen, wie Ausdrücke ausgewertet werden, aber beachten Sie, dass C++ keinen eingebauten Exponentenoperator hat.
  • Wenn Sie sich unsicher sind, verwenden Sie Klammern, um die Reihenfolge explizit zu definieren. Dies kann Ihren Code klarer machen und Fehler vermeiden, die durch ein fehlendes Verständnis der Operatorpräzedenz auftreten können.
  • Einige Operatoren haben die gleiche Präzedenz und werden von links nach rechts ausgewertet. Beispielsweise wird bei a - b + c die Subtraktion vor der Addition durchgeführt.
  • Seien Sie besonders vorsichtig, wenn Sie mehrere Operatoren in einem einzigen Ausdruck kombinieren, ohne Klammern zu verwenden. Dies kann zu subtlen Fehlern führen, wenn Sie die Operatorpräzedenz nicht richtig verstehen.

Übung mit dem ternären bedingten Operator

In diesem Schritt werden Sie sich mit dem ternären bedingten Operator vertraut machen, einer kompakten Methode, um einfache if-else-Anweisungen in einer einzigen Zeile zu schreiben. Dieser Operator bietet eine prägnante Möglichkeit, Entscheidungen in Ihrem Code zu treffen.

Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens ternary_operator.cpp im Verzeichnis ~/project:

touch ~/project/ternary_operator.cpp

Fügen Sie den folgenden Code zur Datei ternary_operator.cpp hinzu:

#include <iostream>

int main() {
    // Basic ternary operator syntax
    // condition? value_if_true : value_if_false

    // Simple comparison
    int x = 10;
    int y = 5;

    // Determine the larger number
    int max_value = (x > y)? x : y;
    std::cout << "Larger value: " << max_value << std::endl;

    // Check if a number is even or odd
    int number = 7;
    std::string result = (number % 2 == 0)? "Even" : "Odd";
    std::cout << number << " is " << result << std::endl;

    // Nested ternary operator
    int a = 15;
    std::string category = (a < 10)? "Small"
                         : (a < 20)? "Medium"
                         : "Large";
    std::cout << "Category: " << category << std::endl;

    // Ternary operator with function calls
    int abs_value = (x < 0)? -x : x;
    std::cout << "Absolute value of x: " << abs_value << std::endl;

    // Ternary operator in output
    std::cout << "Is x greater than y? "
              << ((x > y)? "Yes" : "No") << std::endl;

    return 0;
}

Kompilieren und führen Sie das Programm aus:

g++ ternary_operator.cpp -o ternary_operator
./ternary_operator

Beispielausgabe:

Larger value: 10
7 is Odd
Category: Medium
Absolute value of x: 10
Is x greater than y? Yes

Wichtige Punkte zum ternären Operator:

  • Syntax: condition? value_if_true : value_if_false. Dies ist eine Abkürzung für das Schreiben einer if-else-Anweisung in einer einzigen Zeile.
  • Die condition wird ausgewertet. Wenn sie wahr ist, gibt der Ausdruck value_if_true zurück; andernfalls gibt er value_if_false zurück.
  • Im Code bestimmt int max_value = (x > y)? x : y; die größere Zahl zwischen x und y. Wenn x größer als y ist, wird x an max_value zugewiesen, andernfalls wird y zugewiesen. Da x 10 und y 5 ist, wird max_value zu 10.
  • Der Ausdruck std::string result = (number % 2 == 0)? "Even" : "Odd"; verwendet den Modulo-Operator %, um zu prüfen, ob die Zahl gerade oder ungerade ist. Das Ergebnis ist entweder "Even" oder "Odd", je nachdem, wie die Prüfung ausgeht, und wird der String-Variablen result zugewiesen.
  • Ternäre Operatoren können verschachtelt werden, aber dies kann schnell den Code schwer lesbar machen. Im Beispiel weist der verschachtelte ternäre Operator je nach Wert der ganzen Zahl a die Zeichenkette "Small", "Medium" oder "Large" der Variablen category zu.
  • Das Beispiel mit int abs_value = (x < 0)? -x : x; zeigt, wie der ternäre Operator verwendet werden kann, um den absoluten Wert von x zu erhalten. Wenn x negativ ist, wird x negiert, was äquivalent ist zu seiner Umwandlung in den absoluten Wert. Andernfalls wird x unverändert zurückgegeben.
  • Das letzte Beispiel zeigt, wie das Ergebnis eines ternären Operators direkt ausgegeben werden kann: std::cout << "Is x greater than y? " << ((x > y)? "Yes" : "No") << std::endl;

Wichtige Hinweise:

  • Verwenden Sie den ternären Operator sparsam, um die Lesbarkeit des Codes aufrechtzuerhalten. Übermäßige Verwendung von ternären Operatoren, insbesondere verschachtelten, kann den Code schwer zu verstehen machen.
  • Der ternäre Operator kann schwer zu lesen werden, wenn er zu komplex wird. Komplexe Entscheidungen sollten oft mit vollständigen if-else-Blöcken ausgedrückt werden.
  • Der ternäre Operator wird hauptsächlich für einfache, unkomplizierte Bedingungen verwendet, bei denen einer von zwei Werten zurückgegeben oder zugewiesen werden muss.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie grundlegende mathematische Operationen in C++ durchführen, einschließlich Addition, Subtraktion, Multiplikation, Division und Modulo. Sie haben auch die Verwendung von Prä- und Post-Inkrement-/Dekrementoperatoren untersucht und die feinen Unterschiede zwischen ihnen verstanden. Darüber hinaus haben Sie sich mit relationalen und logischen Operatoren vertraut gemacht, um Werte effektiv zu vergleichen und zu kombinieren. Des Weiteren haben Sie bitweise Operationen zur Binärmanipulation und zusammengesetzte Zuweisungsoperatoren geübt, um arithmetische Operationen mit Zuweisungen zu vereinfachen und zu verkürzen. Schließlich haben Sie das Verständnis der Operatorrangfolge bei mehreren Operatoren erworben und den ternären bedingten Operator für prägnante bedingte Anweisungen verwendet. Diese grundlegenden Konzepte sind unerlässlich für das Erstellen robuster und effizienter C++-Programme. Indem Sie diese grundlegenden Operatoren beherrschen, sind Sie gut gerüstet, um komplexere Codierungsherausforderungen zu meistern.