716 Stimmen

Kann Code, der sowohl in C als auch in C++ gültig ist, ein unterschiedliches Verhalten zeigen, wenn er in jeder Sprache kompiliert wird?

C und C++ haben viele Unterschiede, und nicht jeder gültige C-Code ist auch ein gültiger C++-Code.
(Mit "gültig" meine ich Standardcode mit definiertem Verhalten, d. h. nicht implementierungsspezifisch/undefiniert/etc.)

Gibt es ein Szenario, in dem ein Stück Code, das sowohl in C als auch in C++ gültig ist, zu verschiedene Verhalten bei der Kompilierung mit einem Standardcompiler in jeder Sprache?

Um einen vernünftigen/brauchbaren Vergleich zu machen (ich versuche, etwas praktisch Nützliches zu lernen, und nicht, offensichtliche Schlupflöcher in der Frage zu finden), nehmen wir an:

  • Nichts, was mit dem Präprozessor zusammenhängt (d.h. keine Hacks mit #ifdef __cplusplus pragmas, etc.)
  • Alles, was die Implementierung betrifft, ist in beiden Sprachen gleich (z. B. numerische Grenzwerte usw.)
  • Wir vergleichen relativ neue Versionen der einzelnen Standards (z. B. C++98 und C90 oder später).
    Wenn die Versionen eine Rolle spielen, dann geben Sie bitte an, welche Versionen der einzelnen Programme ein unterschiedliches Verhalten zeigen.

115voto

Kirill Kobelev Punkte 9976

Gemäß C++11-Standard:

a. Der Komma-Operator führt in C, nicht aber in C++, eine l-Wert-zu-r-Wert-Umwandlung durch:

   char arr[100];
   int s = sizeof(0, arr);       // The comma operator is used.

In C++ ist der Wert dieses Ausdrucks 100 und in C ist er sizeof(char*) .

b. In C++ ist der Typ des Aufzählers seine Aufzählung. In C ist der Typ des Aufzählers int.

   enum E { a, b, c };
   sizeof(a) == sizeof(int);     // In C
   sizeof(a) == sizeof(E);       // In C++

Dies bedeutet, dass sizeof(int) darf nicht gleich sein mit sizeof(E) .

c. In C++ nimmt eine mit leerer Parameterliste deklarierte Funktion keine Argumente an. In C bedeutet eine leere Parameterliste, dass die Anzahl und der Typ der Funktionsparameter unbekannt sind.

   int f();           // int f(void) in C++
                      // int f(*unknown*) in C

63voto

Pavel Chikulaev Punkte 791

Dieses Programm druckt 1 in C++ und 0 in C:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int d = (int)(abs(0.6) + 0.5);
    printf("%d", d);
    return 0;
}

Dies geschieht, weil es eine double abs(double) Überladung in C++, also abs(0.6) retours 0.6 während er in C Folgendes zurückgibt 0 wegen der impliziten Double-to-Int-Umwandlung vor dem Aufruf von int abs(int) . In C müssen Sie Folgendes verwenden fabs zur Arbeit mit double .

42voto

Alex B Punkte 78810

Eine weitere sizeof trap: boolesche Ausdrücke.

#include <stdio.h>
int main() {
    printf("%d\n", (int)sizeof !0);
}

Es entspricht sizeof(int) in C, denn der Ausdruck ist vom Typ int , ist aber in C++ typischerweise 1 (obwohl dies nicht erforderlich ist). In der Praxis sind sie fast immer unterschiedlich.

41voto

Adam Rosenfield Punkte 373807
#include <stdio.h>

int main(void)
{
    printf("%d\n", (int)sizeof('a'));
    return 0;
}

In C wird damit der Wert von sizeof(int) ist auf dem aktuellen System, das in der Regel 4 in den meisten heute gebräuchlichen Systemen.

In C++ muss dies 1 ausgeben.

28voto

Ein alter Hut, der davon abhängt, dass der C-Compiler C++-Zeilenende-Kommentare nicht erkennt...

...
int a = 4 //* */ 2
        +2;
printf("%i\n",a);
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X