In C ist es legal, etwas zu schreiben wie:
int foo = +4;
Soweit ich das beurteilen kann, ist das unäre Plus ( +) in +4jedoch 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 +4jedoch 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 .
+xist ein Noop es sei denn sizeof x < sizeof(int)?
sizeof(short) == sizeof(int)aber a shorteine Polsterung hat, und theoretisch muss bei einem solchen System die Polsterung auf Null gesetzt oder das Vorzeichen erweitert werden. Theoretisch.
floatoder 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 xein Zeiger ausgewertet wird.
Das ist ungefähr der einzige praktische Nutzen, den ich mir vorstellen kann.
(-(-(x)))?
intes 32-Bit ist und xzufällig intgleich ist -2^31, -xwird 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.
-xwenn xist INT_MINtechnisch 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 FOOdefiniert ist, muss es in der C-Sprache in diesem Fall durch 0 ersetzt werden. Wenn dies FOOjedoch 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 FOODefinition 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... :-)
FOOes 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
chars 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_castdie 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 promotionturning lvalue into rvalueBeispiel 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)4aber nicht dasselbe wie (char)4.