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 hatint
, nichtshort
.+
, die die Gruppierung erzwingen.Antworten:
Gemäß C90-Standard in 6.3.3.3:
und
quelle
+x
ist ein Noop es sei dennsizeof x < sizeof(int)
?sizeof(short) == sizeof(int)
aber ashort
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, oderdouble
?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.
quelle
(-(-(x)))
?int
es 32-Bit ist undx
zufälligint
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
wennx
istINT_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 diesFOO
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
quelle
FOO
- -
(Platzbedarf!)+
Soweit ich das+
beurteilen kann, was ziemlich redundant ist ... Nein, das ist falsch, es ist nicht äquivalent, wenn der OperandINT_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, };
quelle
+
s.Nicht gerade ein No-Op
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
quelle
char
s in C ++ mitstd::cout
.Unäres Plus wurde zu C hinzugefügt, um die Symmetrie mit unärem Minus zu gewährleisten. C :
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:Es sei darauf hingewiesen, dass das Annotated C ++ Reference Manual ( ARM ) den folgenden Kommentar zu unary plus enthält:
quelle
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 tutinteger 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
quelle
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.
quelle
+(char)4
aber nicht dasselbe wie(char)4
.