Modulo %
Der Modulo-Operator führt eine Restwert-Division zweier Elemente aus. Dieser Operator ist nur für Integer-Typen zulässig und entspricht der Berechnung des Restwertes einer Division.
|
|
Siehe auch Divisions-Operator /
Details
Der Modulo-Operator erwartet zwei Operanden als rvalues und wird von links nach rechts abgearbeitet. Der Rückgabewert ist ein rvalue und stets ein Integer-Typ.
Der Operator ist zulässig für Integer-Typen sowie den bool-Typ. Boolsche Werte werden als Integer-Werte aufgefasst. Der Modulo-Operator ist für Fliesskomma-Typen nicht zulässig. Der Compiler meldet einen Fehler wie invalid operands to binary %.
Die Modulo-Berechnung ergibt in C grundsätzlich nur mit positiven Werten sinnvolle Ergebnisse. Wenn der zweite Operand negativ ist, so wird dieses Vorzeichen von C schlichtweg ignoriert. Wenn der erste Operand negativ ist, so wird die Berechnung ausgeführt, als ob der Operand positiv wäre und schlussendlich dem Resultat das Vorzeichen wieder angehängt.
|
|
Um somit auch mit negativen Werten korrekte Resultate zu erhalten, ist eine Addition des Modulo-Operanden mit anschliessender erneuter Modulo-Operation notwendig. Dies funktioniert auch mit positiven Werten.
|
|
Überladen des Operators
Der Modulo-Operator hat grundsätzlich die semantische Bedeutung einer Modulo-Operation im mathematischem Sinne. Allerdings gibt es Klassen, die eine andere Semantik definieren, beispielsweise das Unterteilen von Strings in gleich grosse Teilstrings. Auch weitere, ähnliche Anwendungen des Modulo-Operators wären denkbar, allerdings wird dieser Operator selten für Überladungen verwendet, da die Semantik oftmals nicht direkt ersichtlich ist.
Die Prototypen für das Überladen des Modulo-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):
|
|
Im folgenden Beispiel werden zwei Klassen präsentiert für einen zweidimensionalen Vektor und eine zweidimensionale quadratische Matrix. Der überladene Modulo-Operator der Matrix gibt hier den gewünschten Kolonnenvektor zurück.
|
|