Führt der Unary +-Operator Typkonvertierungen durch?

Lesezeit: 4 Minuten

Benutzer-Avatar
Als Bhullar

Bis jetzt habe ich geglaubt, dass es keine Verwendung von unary gibt + Operator.

Aber dann bin ich auf folgendes Beispiel gestoßen:

char ch;
short sh;
int i;

printf("%d %d %d",sizeof(ch),sizeof(sh),sizeof(i)); // output: 1 2 4

printf("%d %d %d",sizeof(+ch),sizeof(+sh),sizeof(i)); // output: 4 4 4

Bedeutet es + macht hier eine Typkonvertierung?

Weil es sich wie folgt verhält

printf("%d %d %d",sizeof((int)ch),sizeof((int)sh),sizeof(i)); // output: 4 4 4

Das zwingt mich zum Nachdenken + führt eine Typkonvertierung durch.

Aber dann probiere ich es aus double

double f;
printf("%d %d %d", sizeof(+f), sizeof((int)f), sizeof(f)); // output: 8 4 8

Das zwingt mich, über Unäre nachzudenken + Operator.

Meine zweite Frage ist also: funktioniert unär + Operator hat Spezialeffekt in sizeof Operator?

  • Was verwirrt dich double? Zu deiner ersten Frage: Ja, + macht Konvertierung (IIRC Integer Promotions, so float bekommt nicht doubleaber ganze Zahlen werden (unsigned) int oder etwas mit höherem Rang).

    – Mafso

    17. Juli 2014 um 14:00 Uhr

Benutzer-Avatar
Shafik Yaghmur

Unär + ganzzahlige Beförderungen an seinem Operanden durchführt, können wir dies sehen, indem wir zum Entwurf des C99-Standardabschnitts gehen 6.5.3.3 Unäre arithmetische Operatoren was sagt (Hervorhebung von mir für die Zukunft):

Das Ergebnis des unären +-Operators ist der Wert seines (heraufgestuften) Operanden. Die ganzzahligen Heraufstufungen werden am Operanden durchgeführtund das Ergebnis hat den heraufgestuften Typ.

und Abschnitt 6.3.1 Arithmetische Operanden sagt:

Wenn ein int alle Werte des ursprünglichen Typs darstellen kann, wird der Wert in einen int konvertiert; andernfalls wird es in ein unsigned int konvertiert.
Diese werden als Integer-Promotions bezeichnet.48) Alle anderen Typen bleiben von den Integer-Promotions unverändert.

Beachten Sie, dass alle anderen Typen von den Integer-Promotions und daher unverändert bleiben doppelt bleibt a doppelt. Dies würde auch gelten für schweben auch, die nicht gefördert werden würde doppelt.

Beachten Sie auch, dass mit %d für das Ergebnis von sizeof ist undefiniertes Verhalten, da das Ergebnis ist Größe_t. der richtige Formatbezeichner wäre %zu.

  • danke für die Erwähnung des %zu-Formatbezeichners für sizeof, ich habe noch nie davon gehört

    – Als Bhullar

    17. Juli 2014 um 17:15 Uhr

  • „benutzen %d für das Ergebnis von sizeof ist undefiniertes Verhalten ” in der obigen Frage gibt es erwartete Ergebnisse , wann bekommen wir unerwartetes Verhalten ?

    – Vinay Shukla

    28. Mai 2015 um 5:53 Uhr


  • @yanivx undefiniertes Verhalten bedeutet, dass es unvorhersehbar ist, also ist ein vernünftig erscheinendes Verhalten ein mögliches undefiniertes Verhalten. Aber wir können viele Fälle wie diesen finden, in denen sich der Compiler die Freiheit nimmt, einige unerwartete Dinge zu tun. Es gibt viele UBs, die das tun, was Sie erwarten, aber in Zukunft möglicherweise nicht.

    – Shafik Yaghmour

    28. Mai 2015 um 9:24 Uhr


Wenn kleinere Typen an einem Ausdruck mit größeren Typen beteiligt sind (z. B. char ist kleiner als short die meist ist kleiner als int die kann kleiner sein als long), die beteiligten Typen sind gefördert zu den größeren Typen.

Also ja, wenn Sie das unäre verwenden + Betreiber, erhalten Sie eine intWeil int ist der natürliche ganzzahlige Typ in C.

Bezüglich der double Typ, der natürliche Fließkommatyp für C ist doubleweshalb es keine Heraufstufung für Werte oder Variablen gibt, die bereits vom Typ sind double.

Das sizeof Betreiber haben damit nichts zu tun.

  • Wenn Sie Vorkehrungen treffen, char ist nur meistens kleiner als short zu. Ein Prozessor, der nur eine Datenbreite verarbeitet (wie ein DSP), kann in einem standardkonformen C-Compiler programmiert werden, wo char, short und int alle haben dieselbe Breite (die beispielsweise 16-Bit, 24-Bit oder 32-Bit sein kann).

    – Pascal Cuoq

    17. Juli 2014 um 14:05 Uhr

  • Im ersten Absatz sagen Sie, dass die Beförderung passiert, „wenn kleinere Typen beteiligt sind … mit größeren Typen“, aber der Operand des unären + hat keine Beteiligung an anderen Typen (größer oder anders) in diesem Ausdruck. Der zweite Absatz folgt also nicht aus dem ersten, obwohl er ansonsten richtig ist.

    – Arkku

    17. Juli 2014 um 14:13 Uhr


  • @EliasVanOotegem Das ist genau der Grund int8_t wird nur definiert, ob es existiert und warum wir es haben int_least8_t. Wenn int8_t waren damals immer definiert int_least8_t würde keinen Sinn machen, wie es nur sein könnte int8_t. stackoverflow.com/a/5254321/139746

    – Pascal Cuoq

    17. Juli 2014 um 15:20 Uhr


  • @PascalCuoq: Nun, das hat mich zum Schweigen gebracht: D, guter Punkt. Unterschreiben Sie, dass es Zeit für mich ist, Schluss zu machen

    – Elias Van Ootegem

    17. Juli 2014 um 15:29 Uhr

  • @Joachim short wird in int konvertiert, weil int ein natürlicher Typ für ganze Zahlen ist. Wenn double ein natürlicher Typ für float ist, wird es dann in double konvertiert?

    – Als Bhullar

    17. Juli 2014 um 17:11 Uhr


Benutzer-Avatar
Grzegorz Szpetkowski

Unärer Operator + löst “initial” aus üblichen arithmetischen Umrechnungenalso alle Integer-Operanden, deren Typ einen niedrigeren Rang als Rang von hat int und unsigned int dazu befördert werden int (oder unsigned int wenn int Typ deckt nicht ab alle Werte des Typs, der bei dieser Implementierung gefördert wird).

Benutzer-Avatar
Torek

Es ist nicht sizeofes ist das unäre + selbst. Die Operanden von unär + “den üblichen arithmetischen Umrechnungen” unterzogen werden. Siehe zB diese andere Antwort mit gewöhnlicher Addition.

1073170cookie-checkFührt der Unary +-Operator Typkonvertierungen durch?

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

Privacy policy