Was macht der unäre Plusoperator?

Lesezeit: 5 Minuten

Was macht der unare Plusoperator
vrisch88

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 einen Grund dafür, oder?

  • Ich denke, der historische Grund wird stark unterschätzt.

    – Wolf

    22. Mai 2015 um 8:04 Uhr


  • Eine Frage mit drei verschiedenen Sprach-Tags ist ziemlich mehrdeutig/schlecht! Die Antworten sind sehr unterschiedlich für C# (überladbar) und C (kein Überladen) und C++ (überladbar, aber erbt dies von C und damit auch dessen Eigenschaften).

    – legends2k

    19. August 2015 um 7:25 Uhr


  • Ich möchte einen Link zu Eric Lipperts Top-10-Fehlern von C# hinzufügen. Den unären Plus-Operator finden Sie in den lobenden Erwähnungen: informit.com/articles/article.aspx?p=2425867 Er sagt im Grunde, es sollte entfernt werden oder es hätte nie hinzugefügt werden sollen.

    – Noel Widmer

    13. Oktober 2016 um 20:09 Uhr

Was macht der unare Plusoperator
Karl Salvia

Eigentlich unäres Plus tut etwas tun – sogar in C. Es führt das aus übliche arithmetische Umrechnungen auf den Operanden und gibt einen neuen Wert zurück, der eine Ganzzahl größerer Breite sein kann. Wenn der ursprüngliche Wert eine Ganzzahl ohne Vorzeichen mit einer geringeren Breite als war intes wird in a geändert signed Wert auch.

Normalerweise ist das nicht so wichtig, aber es kann wirken, so ist es nicht Es ist eine gute Idee, unäres Plus als eine Art “Kommentar” zu verwenden, das anzeigt, dass eine ganze Zahl positiv ist. Betrachten Sie das folgende C++-Programm:

void foo(unsigned short x)
{
 std::cout << "x is an unsigned short" << std::endl;
}

void foo(int x)
{
 std::cout << "x is an int" << std::endl;
}

int main()
{
 unsigned short x = 5;
 foo(+x);
}

Dies zeigt “x is an int” an.

In diesem Beispiel hat also unary plus einen neuen Wert mit einem anderen Typ erstellt und Signiertheit.

  • Wenn Sie Code schreiben, der ein bestimmtes Ergebnis erzeugt, wenn ein Short- und ein Int-Wert angegeben werden, der gleich ist, dann haben Sie wahrscheinlich ein anderes Problem

    – Lüge Ryan

    11. Juli 2011 um 20:01 Uhr

  • Danke, das macht es klar (Nebenbemerkung: In C konnte ich das Beispiel nicht zum Laufen bringen, da ich die foo-Funktion nicht überladen kann)

    – Binär

    24. August 2013 um 5:22 Uhr


  • was bedeutet es zu sagen an integer of greater width?

    – Yekanchi

    22. April 2019 um 3:40 Uhr

  • in diesem Zusammenhang bezieht sich “Breite” auf die Anzahl der Speicherbytes, die dem Wert zugeordnet sind.

    – giles

    13. Mai 2019 um 18:34 Uhr

1646403009 228 Was macht der unare Plusoperator
Jeffrey Hantin

Es ist da, um überladen zu werden, wenn Sie das Bedürfnis verspüren; Für alle vordefinierten Typen ist es im Wesentlichen ein No-Op.

Die praktische Verwendung eines unären arithmetischen No-Op-Operators ist ziemlich begrenzt und bezieht sich eher auf die Folgen der Verwendung eines Werts in einem arithmetischen Ausdruck als auf den Operator selbst. Beispielsweise kann es verwendet werden, um eine Verbreiterung von kleineren ganzzahligen Typen zu erzwingen intoder stellen Sie sicher, dass das Ergebnis eines Ausdrucks als rvalue behandelt wird und daher nicht mit einem nicht-const Referenzparameter. Ich behaupte jedoch, dass diese Verwendungen besser für Code-Golf geeignet sind als Lesbarkeit. 🙂

  • Dies ist nicht wirklich wahr, wie einige Beispiele unten zeigen.

    – jkerian

    11. Oktober 2010 um 3:39 Uhr

  • Okay, ich nehme an, dass es einige Verwendungen hat, aber die meisten der unten besprochenen Verwendungen beziehen sich auf die Tatsache, dass es sich um einen numerischen Ausdruck handelt, der mit einem No-Op-Operator erstellt wurde: zum Beispiel die Beförderung zu int und zu einem rvalue führen, sind Effekte der Ausdrucksstärke, nicht des Operators + selbst.

    – Jeffrey Hantin

    11. Oktober 2010 um 20:57 Uhr

Aus der zweiten Ausgabe von K&R:

Das unäre + ist neu beim ANSI-Standard. Es wurde aus Symmetriegründen mit dem unären – hinzugefügt.

  • Absolut. *Dies ist der historische Grund. C++ musste es anpassen, also musste es mit Überladung umgehen.

    – Wolf

    22. Mai 2015 um 8:01 Uhr

Ich habe gesehen, dass es aus Gründen der Klarheit verwendet wird, um den positiven Wert im Unterschied zu einem negativen Wert hervorzuheben:

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

Aber das ist ein ziemlich schwacher Gebrauch. Die Antwort ist definitiv überladen.

Was macht der unare Plusoperator
Ameise

Eine Sache das eingebaute unäre + tut, lvalue in einen rvalue umzuwandeln. Beispielsweise können Sie dies tun

int x;
&x;

aber das kannst du nicht

&+x;

🙂

PS “Überladen” ist definitiv nicht die richtige Antwort. Einstellig + wurde von C geerbt und es gibt keine Operatorüberladung auf Benutzerebene in C.

1646403010 499 Was macht der unare Plusoperator
jkerian

Das Wichtigste, was unary + leistet, ist die Typumwandlung zu einem int für Datentypen, die kleiner als int sind. Dies kann sehr nützlich sein, wenn Sie versuchen, Zeichendaten mit zu drucken std::cout als numerische Daten.

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

unterscheidet sich sehr von

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

Es ist auch zum Überladen verfügbar, aber in der Praxis Ihre Überlastung sollte fast ein NOP sein.

1646403010 892 Was macht der unare Plusoperator
Nicu Stiurca

Wenn Sie jemals den numerischen Wert von Rohbytes (z. B. kleine Zahlen, die als Zeichen gespeichert sind) für die Fehlerbehebung oder aus irgendeinem Grund drucken müssen, kann unary + den Druckcode vereinfachen. Erwägen

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 kurzes Beispiel. Ich bin sicher, es gibt andere Zeiten, in denen unary + dazu beitragen kann, Ihre Bytes eher wie Zahlen als wie Text zu behandeln.

935520cookie-checkWas macht der unäre Plusoperator?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy