In C ist es legal, etwas zu schreiben wie:
int foo = +4;
Soweit ich das beurteilen kann, ist das unäre Plus ( +
) in +4
jedoch ein No-Op. Ist es?
In C ist es legal, etwas zu schreiben wie:
int foo = +4;
Soweit ich das beurteilen kann, ist das unäre Plus ( +
) in +4
jedoch ein No-Op. Ist es?
+short(1)
Typ hat int
, nicht short
.
+
, die die Gruppierung erzwingen.
Antworten:
Gemäß C90-Standard in 6.3.3.3:
Das Ergebnis des Operators unary + ist der Wert seines Operanden . Die integrale Promotion wird für den Operanden durchgeführt. und das Ergebnis hat den heraufgestuften Typ.
und
Der Operand des unären Operators + oder - muss einen arithmetischen Typ haben .
+x
ist ein Noop es sei denn sizeof x < sizeof(int)
?
sizeof(short) == sizeof(int)
aber a short
eine Polsterung hat, und theoretisch muss bei einem solchen System die Polsterung auf Null gesetzt oder das Vorzeichen erweitert werden. Theoretisch.
float
oder a aus, oder double
?
Sie können es als eine Art Behauptung verwenden, dass ein Ausdruck einen arithmetischen Typ hat:
#define CHECK_ARITHMETIC(x) (+(x))
Dies erzeugt einen Fehler bei der Kompilierung, wenn x
ein Zeiger ausgewertet wird.
Das ist ungefähr der einzige praktische Nutzen, den ich mir vorstellen kann.
(-(-(x)))
?
int
es 32-Bit ist und x
zufällig int
gleich ist -2^31
, -x
wird eine vorzeichenbehaftete Ganzzahl überlaufen, die technisch undefiniertes Verhalten ist. :-)
INT_MIN
. (Nun, theoretisch jedenfalls. In der Praxis funktioniert es wahrscheinlich auf jeder realistischen Maschine einwandfrei.) Eine strenge Lesart des Standards besagt jedoch, dass diese unterschiedlich sind.
-x
wenn x
ist INT_MIN
technisch nicht definiertes Verhalten zu berufen ist, glaube ich.
Es gibt eine sehr praktische Verwendung des mir bekannten unären Plus-Operators: in Makros. Angenommen, Sie möchten so etwas tun
#if FOO > 0
Wenn dies nicht FOO
definiert ist, muss es in der C-Sprache in diesem Fall durch 0 ersetzt werden. Wenn dies FOO
jedoch mit einer leeren Definition definiert wurde, führt die obige Anweisung zu einem Fehler. Stattdessen können Sie verwenden:
#if FOO+0 > 0
Und jetzt ist die Direktive syntaktisch korrekt, unabhängig davon FOO
, ob sie undefiniert, als leer oder als ganzzahliger Wert definiert ist.
Ob dies die gewünschte Semantik ergibt, ist natürlich eine völlig separate Frage, aber in einigen nützlichen Fällen wird dies der Fall sein.
Bearbeiten: Beachten Sie, dass Sie dies sogar verwenden können, um die Fälle der FOO
Definition als Null gegenüber der Definition als leer zu unterscheiden, wie in:
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
FOO
- -
(Platzbedarf!) +
Soweit ich das +
beurteilen kann, was ziemlich redundant ist ... Nein, das ist falsch, es ist nicht äquivalent, wenn der Operand INT_MIN
... :-)
FOO
es definiert ist.
Ja schon. Es dient hauptsächlich der Vollständigkeit und um Konstruktionen wie diese ein wenig sauberer aussehen zu lassen:
int arr[] = {
+4,
-1,
+1,
-4,
};
+
s.
Der unäre +
Operator macht nur eines: Er wendet die ganzzahligen Beförderungen an . Da diese ohnehin auftreten würden, wenn der Operand in einem Ausdruck verwendet würde, stellt man sich vor, dass unary +
in C ist, nur um die Symmetrie mit unary zu gewährleisten -
.
Es ist schwierig, dies in Aktion zu sehen, da die Werbeaktionen so allgemein angewendet werden.
Ich habe mir das ausgedacht:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
welche (auf meinem Mac) druckt
1
4
char
s in C ++ mit std::cout
.
Was ist der Zweck des unären '+' - Operators in C?
Unäres Plus wurde zu C hinzugefügt, um die Symmetrie mit unärem Minus zu gewährleisten. C :
Unary Plus wurde vom C89-Komitee aus mehreren Implementierungen zur Symmetrie mit Unary Minus übernommen.
und es ist kein No-Op, es führt die ganzzahligen Heraufstufungen für seinen Operanden durch. Zitat aus meiner Antwort auf Führt der Unary + -Operator Typkonvertierungen durch? ::
Der Entwurf des C99-Standardabschnitts 6.5.3.3
Unäre arithmetische Operatoren lautet:
Das Ergebnis des Operators unary + ist der Wert seines (heraufgestuften) Operanden. Die ganzzahligen Heraufstufungen werden für den Operanden ausgeführt , und das Ergebnis hat den heraufgestuften Typ.
Es sei darauf hingewiesen, dass das Annotated C ++ Reference Manual ( ARM ) den folgenden Kommentar zu unary plus enthält:
Unary Plus ist ein historischer Unfall und im Allgemeinen nutzlos.
static_cast
die Absicht deutlicher zeigen würde, zum Beispiel das Auflösen einer mehrdeutigen Überlastung des Funktionszeigers und der std :: -Funktion für ein Lambda mit +
Ich habe zwei Dinge gefunden, die ein unärer +
Operator tut
integer promotion
turning lvalue into rvalue
Beispiel für eine Ganzzahl-Promotion:
#include <stdio.h>
int main(void) {
char ch;
short sh;
int i;
long l;
printf("%d %d %d %d\n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l));
printf("%d %d %d %d\n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l));
return 0;
}
Typische Ausgabe (auf 64-Bit-Plattform):
1 2 4 8
4 4 4 8
lvalue in rvalue verwandeln Beispiel:
int i=0,j;
j=(+i)++; // error lvalue required
sizeof(int)
. Ich habe keine Ahnung, wann ich es verwenden werde. Aber trotzdem schön. NB: Antwort bearbeitet, um zu zeigen, dass nicht alles bis 4.
Mit "no-op" meinen Sie die Montageanleitung?
Wenn ja, dann definitiv nicht.
+4 ist nur 4 - der Compiler fügt keine weiteren Anweisungen hinzu.
+(char)4
aber nicht dasselbe wie (char)4
.