Frage

Was macht der unäre Plusoperator?Es gibt mehrere Definitionen, die ich gefunden habe (Hier Und Hier), aber ich habe immer noch keine Ahnung, wofür es verwendet werden würde.Es scheint, als würde es nichts bewirken, aber es gibt doch einen Grund dafür, oder?

War es hilfreich?

Lösung

Es ist dort überlastet werden, wenn Sie das Bedürfnis verspüren; für alle vordefinierten Typen es ist im Wesentlichen ein No-op.

Die praktischen Anwendungen von einem No-op einstellige Rechenzeichen sind ziemlich begrenzt, und neigen dazu, die Folgen der Verwendung eines Wertes in einem arithmetischen Ausdruck zu beziehen, anstatt den Betreiber selbst. Zum Beispiel kann es verwendet werden, von kleineren ganzzahligen Typen zu zwingen Verbreiterung int, oder stellen Sie sicher, dass ein Ergebnis des Ausdrucks als R-Wert behandelt wird und daher nicht kompatibel mit ein nicht-const Referenzparametern. Ich behaupte jedoch, dass diese Verwendungen Code Golf besser geeignet sind als die Lesbarkeit. : -)

Andere Tipps

Von K & R zweiter Ausgabe:

  

Die unäre + ist neu mit dem ANSI-Standard. Es wurde für die Symmetrie mit dem unären hinzugefügt -.

Ich habe es aus Gründen der Klarheit verwendet gesehen, den positiven Wert im Unterschied von einem negativen Wert zu betonen:

shift(+1);
shift(-1);

Aber das ist ein ziemlich schwacher Einsatz. Die Antwort ist auf jeden Fall zu überlasten.

Eine Sache, die sich im internen einstellige + tut, ist L-Wert in einen R-Wert drehen. Zum Beispiel können Sie dies tun,

int x;
&x;

Sie können dies aber nicht tun

&+x;

:)

P. S. „Überladen“ ist definitiv nicht die richtige Antwort. Unary + wurde von C geerbt und es gibt keinen User-Level-Operator in C zu überlasten.

Die Hauptsache einstellige + erreicht ist Typ Förderung in einen int für kleinere als int-Datentypen. Dies kann sehr nützlich sein, wenn Sie versuchen, char Daten mit std::cout als numerischen Daten zu drucken.

char x = 5;
std::cout << +x << "\n";

ist sehr verschieden von

char x=5;
std::cout << x << "\n";

Es ist auch für eine Überlastung zur Verfügung, aber in der Praxis Ihrer Überlastung sollte sein fast ein NOP.

Wenn Sie jemals den numerischen Wert von rohen Bytes drucken müssen (zB kleine Zahlen als Zeichen gespeichert) für Debug oder welchen Gründen auch immer, kann einstellige + den Druckcode vereinfachen. Betrachten

char c = 42;
cout << c << endl;           // prints "*\n", not what you want in this case
cout << (int)c << endl;      // prints "42\n", ok
cout << +c << endl;          // prints "42\n", much easier to type

Dies ist nur ein kleines Beispiel. Ich bin sicher, es gibt auch andere Zeiten, in denen einstelligen + Ihre Bytes mehr wie Zahlen statt wie Text behandeln helfen kann.

Ein historischer Leckerbissen.Das C99-Standardisierungskomitee war auch der Meinung, dass die bestehende Verwendung von unärem Plus eher selten sei, was sich daran zeigt, dass sie darüber nachgedacht haben, es wiederzuverwenden, um eine weitere Funktion in der Sprache zu erreichen:Hemmung der Übersetzungszeitauswertung von Gleitkomma-Konstantenausdrücken.Siehe das folgende Zitat aus der C-Begründung, Abschnitt F.7.4:

Eine frühe Version dieser Spezifikation ermöglichte die konstante Arithmetik der Übersetzungszeit, befugte jedoch den Unary + -Portierer, wenn er auf einen Operanden angewendet wurde, um die Bewertung der Übersetzungszeit zu hemmen.

Am Ende wurde die Semantik umgekehrt, wobei in den meisten Kontexten die Laufzeitauswertung erzwungen wurde (zumindest bis zur „als ob“-Regel) und die Möglichkeit bestand, die Übersetzungszeitauswertung durch die Verwendung statischer Initialisierer zu erzwingen.Beachten Sie, dass der Hauptunterschied im Auftreten von Gleitkomma-Ausnahmen und anderen Gleitkomma-Rundungs- oder Präzisionseinstellungen, sofern vorhanden, liegt.

Nicht viel. Das allgemeine Argument dafür, dass die Überlastung der operator+() ist, dass es auf jeden Fall reale Welt verwendet operator-() für Überlastung, und es wäre sehr seltsam (oder asymmetrisch), wenn Sie eine Überlastung operator-() zu ermöglichen waren aber nicht operator+().

Ich glaube, dass ich zum ersten Mal dieses Argument von Stroustrop gelesen, aber ich meine Bücher nicht mit mir habe Recht, es zu überprüfen. Ich könnte falsch sein.

Unäres Plus war in C, wo es tat absolut nichts (ähnlich wie das auto Schlüsselwort). Um es nicht zu haben, hätte Stroustrup hatte eine unentgeltliche Inkompatibilität mit C einzuführen.

Sobald es in C ++ war, war es natürlich, einer Überlastfunktion zu ermöglichen, wie unäre Minus und Stroustrup es haben könnte aus diesem Grunde eingeführt, wenn es nicht bereits vorhanden ist.

Also, bedeutet es nichts. Es kann als als eine Art Dekoration verwendet werden, um die Dinge aussehen symmetrisch +1,5 als das Gegenteil zu -1,5 zum Beispiel. In C ++, kann es überlastet werden, aber es wird zu verwirrend sein, wenn operator+() etwas tut. Denken Sie daran, die Standardregel. Wenn arithmetische Operatoren Überlastung, Dinge zu tun, wie die ints tun

Wenn Sie nach einem Grund suchen, warum es da ist, finden etwas über die frühe Geschichte von C. Ich vermute, dass es keinen guten Grund war, wie C war nicht wirklich entworfen. Betrachten Sie das nutzlose auto Schlüsselwort (vermutlich im Gegensatz zu static, jetzt in C ++ 0x recycelt) und das entry Schlüsselwort, das nie etwas tat (und später ausgelassen in C90). Es gibt eine berühmte E-Mail, in dem Ritchie oder Kernighan sagen, dass, wenn sie die Rangfolge der Operatoren realisierten Probleme hatte, es mit Tausenden von Codezeilen bereits drei Anlagen waren, dass sie nicht brechen wollten.

Ich kann keine Quelle für diese zitieren, aber ich bin gekommen, zu verstehen, es für explizite Typ Förderung ist, die lossless Typumwandlung impliziert. Das bringt es an der Spitze der Umwandlung Hierarchie,

  • Promotion: new_type operator+(old_type)
  • Umsatz: new_type(old_type)
  • Darsteller: operator(new_type)(old_type)
  • Coercion: new_type operator=(old_type)

Natürlich, das ist aus meiner Interpretation einer Notiz in einem der Microsoft (wirklich alt) c / c ++ Handbüchern, die ich über 15 Jahre lesen vor, so nehmen Sie es mit einem Körnchen Salz.

#include <stdio.h>
int main()
{
    unsigned short x = 5;
    printf ("%d\n",sizeof(+x)); 
    printf ("%d\n",sizeof(x)); 
    return 0;
}

Wie oben in dem gezeigten Beispiel ist der einstellige + ändert wirklich die Art, Größe 4 bzw. 2. Seltsam, dass der Ausdruck + x in der Tat in der sizeof berechnet wird, dachte ich, dass nicht sollte. Vielleicht ist es aufgrund der Tatsache, dass sizeof die gleichen Priorität wie die einstelligen + hat.

Ich nehme an, Sie könnten es verwenden, um immer eine Zahl positiv zu machen. Nur Überlastung des unären Operators + abs sein. Nicht wirklich wert verwirrend Ihre anderen Entwicklern, es sei denn, Sie wirklich nur den Code wollen verschleiern. Dann würde es gut funktionieren.

Bearbeiten neu geschrieben vollständig, denn ich war waaaayyy off in meiner ursprünglichen Antwort.

Auf diese Weise können Sie die explizite Deklaration Ihrer Art als ein positiver Wert behandeln (ich glaube, in meist nicht-mathematische Operationen). Es scheint, dass Negation nützlicher sein würde, aber ich denke, hier ist ein Beispiel dafür, wo es könnte einen Unterschied machen:

public struct Acceleration
{
    private readonly decimal rate;
    private readonly Vector vector;

    public Acceleration(decimal rate, Vector vector)
    {
        this.vector = vector;
        this.rate = rate;
    }

    public static Acceleration operator +(Acceleration other)
    {
        if (other.Vector.Z >= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public static Acceleration operator -(Acceleration other)
    {
        if (other.Vector.Z <= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public decimal Rate
    {
        get { return rate; }
    }

    public Vector Vector
    {
        get { return vector; }
    }
}
scroll top