Was ist der Grund für den existierenden Unterschied zwischen C und C ++ relativ zum unären arithmetischen Operator +?

8

In C wird der unäre Plus-Operator unärer arithmetischer Operator genannt und darf nicht auf Zeiger angewendet werden (C-Standard, 6.5.3.3 Unäre arithmetische Operatoren).

  

1 Der Operand des unären + oder - Operators soll arithmetisch sein   Geben Sie ein. des ~ Operators, Integer-Typ; des ! Operator, Skalar   Geben Sie ein.

Somit wird dieses Programm nicht kompiliert

%Vor%

In C ++ kann der unäre Plus-Operator jedoch auch auf Zeiger angewendet werden (der C ++ - Standard, 5.3.1 Unäre Operatoren)

  

7 Der Operand des unären + Operators soll arithmetisch, nicht gekop pelt sein   Aufzählung, oder Zeigertyp und das Ergebnis ist der Wert von   Streit. Integrale Werbung wird auf Integral oder Enumeration durchgeführt   Operanden. Der Typ des Ergebnisses ist der Typ des beworbenen Operanden.

Und dieses Programm kompiliert erfolgreich.

%Vor%

Was ist der Grund für die Beibehaltung dieses Unterschieds zwischen C und C ++?

Die Frage entstand, als ich die Frage Warum ist die Größe des int-Zeigers von der Größe des int-Arrays verschieden? . Ich wollte zeigen, wie man ein Array im Operator sizeof in einen Zeiger umwandelt.

Zuerst wollte ich schreiben

%Vor%

Allerdings ist dieser Ausdruck in C ungültig. Also musste ich

schreiben %Vor%

und ich fand, dass es einen solchen Unterschied zwischen C und C ++ gibt:)

    
Vlad from Moscow 18.01.2017, 09:52
quelle

3 Antworten

1

Verschiedene Sprachen können unterschiedliche Semantiken mit derselben Syntax verknüpfen.

C und C ++ sind verschiedene Sprachen mit einem gemeinsamen Vorfahren. C ++ - Semantiken sehen täuschend ähnlich aus, unterscheiden sich jedoch für einige Teile der allgemeinen Syntax subtil. Ein anderer merkwürdiger Fall ist dieser:

%Vor%

Der Grund für C ++, die C-Syntax im Fall von unary + erweitert zu haben, könnte sein, dass einige erweiterte numerische Typen als Zeiger oder einfach aus Gründen der Symmetrie implementiert werden können.

Wie Jaa-c in einem Kommentar erwähnt, ist +p ein berechneter Ausdruck, während p eine Referenz auf p ist. Sie haben ein anderes Beispiel angegeben, in dem + verwendet werden kann, um den Ausdruckskontext zu erzwingen. Die Frage ist, warum haben die ursprünglichen Autoren der C-Sprache unäre + auf nicht-numerischen Typen verboten? Vielleicht ein Nebeneffekt der ursprünglichen Implementierung von pcc .

Beachten Sie, dass der unäre + -Operator in Javascript auf Nicht-Zahl-Typen angewendet werden kann und als eine Umwandlung in eine Zahl funktioniert.

    
chqrlie 18.01.2017 10:12
quelle
-1

Nicht, dass dies Ihre Frage beantwortet, aber für die Frage, für die Sie eine Conversion anzeigen möchten, würde ich Folgendes verwenden:

%Vor%

ist praktisch dasselbe wie (array + 0), zeigt aber deutlicher "Zeiger auf das erste Element" an. Und zeigen Sie, dass (wenn das Array nicht die Größe 1 auf einem 64-Bit-Rechner hat) es die gleiche wie sizeof (int) ist, während

%Vor%

wäre nicht das Gleiche.

    
Gary H 26.04.2017 03:15
quelle
-2

In meinen Überlegungen:

C ++ ist eine Art objektorientierter Sprache. Jeder Datentyp kann also als "Klasse" behandelt werden.

In C int ist einer der "grundlegenden Datentypen von C". Aber in C ++ können wir int als eine Klasse betrachten. In C ++ gehören daher der int-Zeiger und das int-Array zu den verschiedenen Klassen. In C speicherte eine int-Zeigervariable die Adresse einer anderen int-Variablen. Der Name des int-Arrays anstelle der Adresse des ersten Elements dieses int-Arrays. In C haben sie eine ähnliche Bedeutung.

Was den unären Operator "+" betrifft, verstehe ich die C ++ - Sprache als: Jede Klasse in C ++ repräsentiert eine Menge von Dingen. Jedes Zeug im Set hat die gleichen Eigenschaften. Und es gibt einige Operationen, die auf jedes Material angewendet werden können. Natürlich sind diese Operationen Memberfunktionen einer Klasse. Ein anderes Zeichen in C ++ ist, dass Benutzer einen Operator überlasten können. Überladung bedeutet, dass wir die gleiche Operation für die verschiedenen Klassen durchführen können. Zum Beispiel: Ein Mann isst einen Burger. wir können die Aktion "Eat" zwischen Katzen und Ratte überladen: Eine Katze isst eine Ratte.

So wie der C ++ - Standard sagt: " Der Operand des unären + Operators muss eine arithmetische, nicht gekapselte Aufzählung oder einen Zeigertyp haben und das Ergebnis ist der Wert des Arguments. " Das ist nur eine Überladung für den unären Operator + in der uncloped enumeration und Zeigertyp . " Und das Ergebnis ist der Wert des Arguments " - & gt; Ich denke, das ist der Punkt.

    
0x2333 22.03.2017 03:58
quelle

Tags und Links