Betrachten Sie den folgenden Code ein:Übliche arithmetische Konvertierung - ein besseres Regelwerk?
void f(byte x) {print("byte");}
void f(short x) {print("short");}
void f(int x) {print("int");}
void main() {
byte b1, b2;
short s1, s2;
f(b1 + b2); // byte + byte = int
f(s1 + s2); // short + short = int
}
In C++, C#, D und Java, die beide Funktion resolve zu den "int" Überlastungen ruft ... ich realisieren bereits dies "in den Spezifikationen", Aber warum sind Sprachen so gestaltet? Ich suche nach einem tieferen Grund.
Für mich macht es Sinn, für das Ergebnis der kleinste Art der Lage sein, alle möglichen Werte der beiden Operanden zu repräsentieren, zum Beispiel:
byte + byte --> byte
sbyte + sbyte --> sbyte
byte + sbyte --> short
short + short --> short
ushort + ushort --> ushort
short + ushort --> int
// etc...
Dies würde unbequem Code beseitigen wie short s3 = (short)(s1 + s2)
, wie Auch IMO ist viel intuitiver und leichter zu verstehen.
Ist dies ein übriggebliebenes Vermächtnis aus den Tagen von C, oder gibt es bessere Gründe für das aktuelle Verhalten?
Ich werde feststellen, dass jedes Programm mit "void main()" ist durch die C-und C++ - Standards nicht definiert, und Sie haben keinen Grund, sich über irgendetwas zu beschweren. Verwenden Sie "int main()", wenn Sie standardisiertes Verhalten diskutieren wollen. –
Ich erwähnte andere Sprachen außer C und C++. Betrachten Sie das als nur Pseudo-Code und nichts mehr. Nach geringfügigen Änderungen (z. B. void nach int ändern, und Byte nach char und printf drucken usw.), kompiliert es in jeder C-ähnlichen Sprache und zeigt das beschriebene Verhalten. Sicher haben Sie nicht erwartet, dass dieselbe unmodifizierte Quelldatei in allen erwähnten Sprachen kompiliert wird, oder? – zildjohn01