Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Interessanter Unterschied zwischen C und C++

14 views
Skip to first unread message

Thomas Koenig

unread,
Aug 12, 2019, 11:30:40 AM8/12/19
to
[F'up]

Ich bin gerade über einen interessanten Unterschied zwischen C und
C++ gestolpert. Die gemeinsame Schnittmenge beider Sprachen, in der
man programmieren kann, wird "interessanter".

In C++ gibt es seit C++17 einen interessanten Unterschied zwischen
(p sei ein Pointer-Ausdruck und i ein Integer-Ausdruck) zwischen
*(p + i) und p[i]. Im ersten Fall ist nämlich nicht definiert,
was zuerst ausgeführt wird, im zweiten Fall kann man sich
drauf verlassen, dass p (einschließlich Seiteneffekten) zuerst
ausgeführt wird, anschließend erst i.

Für a << b kann man sich da auch drauf verlassen, für a + b hingegen
nicht.

Details (u.a. auch warum) finden sich in
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf .

Bonita Montero

unread,
Aug 12, 2019, 3:10:40 PM8/12/19
to
Naja, is sowieso idiotisch, sich auf solche Eigenschaften zu verlsassen.
Ich mein theoretisch kann es ja sein, dass Code für neuere Compiler der
ansonsten kompatibel zu älteren ist in diesem Punkt eben nicht kompati-
bel ist. Außerdem kann das dazu führen, dass der der fremden Code liest
solche Feinheiten wissen muss um den Code korrekt zu verstehen. Daher
sollte man das einfach umgehen und Code schreiben als könnte man sich
auf keine Ausführungs-Reihenfolge verlassen.

Stefan Reuther

unread,
Aug 13, 2019, 1:10:39 PM8/13/19
to
Am 12.08.2019 um 10:29 schrieb Thomas Koenig:
> In C++ gibt es seit C++17 einen interessanten Unterschied zwischen
> (p sei ein Pointer-Ausdruck und i ein Integer-Ausdruck) zwischen
> *(p + i) und p[i]. Im ersten Fall ist nämlich nicht definiert,
> was zuerst ausgeführt wird, im zweiten Fall kann man sich
> drauf verlassen, dass p (einschließlich Seiteneffekten) zuerst
> ausgeführt wird, anschließend erst i.

Ich wusse das bisher nicht, danke.

Am Ende vergrößert das aber wieder nur die Menge von wohldefinierten
C++-Programmen, die keine wohldefinierten C-Programme sind.

Andererseits ist es schwer zu erkennen, ob ein Programm sich darauf
verlässt, was die Auswahl der Toolchain erschwert. Ich kaue ja immer
noch daran, meine alte historisch gewachsene Build-Infrastruktur auf
eine gescheite CI-Pipeline mit C++14 umzustellen (neuer Compiler = neue
Dependencies), solange hängt mein Privatgerümpel auf C++03 fest. Mal
sehen, wann ich soweit bin, da einfach einen C++17-Compiler drauf werfen
zu können, und problemlos Binaries für alle Plattformen rauszubekommen...


Stefan

Thomas Koenig

unread,
Aug 17, 2019, 2:40:40 PM8/17/19
to
Stefan Reuther <stefa...@arcor.de> schrieb:
> Am 12.08.2019 um 10:29 schrieb Thomas Koenig:
>> (p sei ein Pointer-Ausdruck und i ein Integer-Ausdruck) zwischen
>> *(p + i) und p[i]. Im ersten Fall ist nämlich nicht definiert,
>> was zuerst ausgeführt wird, im zweiten Fall kann man sich
>> drauf verlassen, dass p (einschließlich Seiteneffekten) zuerst
>> ausgeführt wird, anschließend erst i.
>

> Andererseits ist es schwer zu erkennen, ob ein Programm sich darauf
> verlässt, was die Auswahl der Toolchain erschwert.

Das Problem war wohl, dass jede Menge Compiler das schon vorher
so gemacht und Programme sich auch drauf verlassen haben.

Beispiel ist:

void f()
{
std::string s = “but I have heard it works even if you don’t believe in it”;
s.replace(0, 4, “”).replace(s.find(“even”), 4, “only”).replace(s.find(“don’t”), 6, “”);
assert(s == “I have heard it works only if you believe in it”); // OK.
}

Vor C++17 kann man sich da nicht drauf verlassen, was da rauskommt...
0 new messages