{"id":1429,"date":"2012-07-07T10:00:42","date_gmt":"2012-07-07T08:00:42","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1429"},"modified":"2012-07-15T09:50:04","modified_gmt":"2012-07-15T07:50:04","slug":"java-und-sequenzpunkte-in-c","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/07\/java-und-sequenzpunkte-in-c\/","title":{"rendered":"Java und Sequenzpunkte in C(++)"},"content":{"rendered":"<p>Je mehr Freiheiten ein Compiler hat, desto ungenierter kann er optimieren. Besonders Schreibzugriffe interessieren Compiler, denn kann er diese einsparen kann, l\u00e4uft das Programm sp\u00e4ter ein bisschen schneller. Damit das Resultat eines Compilers jedoch beherrschbar bleibt, definiert der C(++)-Standard Sequenzpunkte\u00a0(eng. sequence point), an dem alle Schreibzugriffe klar zugewiesen wurden. (Dass der Compiler sp\u00e4ter Optimierungen macht ist eine andere Geschichte; die Sequenzpunkte geh\u00f6ren zum semantischen Modell, Optimierungen ver\u00e4ndern das nicht). Das Semikolon als Abschluss von Anweisungen bildet zum Beispiel einen Sequenzpunkt. Im Ausdruck wie i = i + 1; j = i; muss der Schreizugriff auf i aufgel\u00f6st sein, bevor ein Lesezugriff f\u00fcr die Zuweisung zu j erfolgt. Problematisch ist, dass es gar nicht so viele Sequenzpunkte gibt, und es passieren kann, dass zwischen zwei Sequenzpunkten zwei mehrdeutige Schreibzugriffe auf die gleiche Variable stattfinden. Da das jedoch in C(++) undefiniert ist, kann sich der Compiler so verhalten wie er will \u2013 er muss sich ja nun an den Sequenzpunkten so verhalten wie gefordert. Problemf\u00e4lle sind: (i=j) + i oder, weil ein Inkrement\/Dekrement ein Lese-\/Schreibzugriff ist, auch i = i++, was ja nichts anderes als i = (i = i + 1) ist. Bedauerlicherweise bildet die Zuweisung keinen Sequenzpunkt. Bei Zuweisungen der Art i = ++i + &#8211;i kann alles M\u00f6gliche sp\u00e4ter in i stehen, je nachdem, was der Compiler zu welchem Zeitpunkt ausf\u00fchrt. In Java sind diese Dinge von der Spezifikation klar geregelt, in C(++) ist nur geregelt, dass das Verhalten zwischen den Sequenzpunkten klar sein muss. Doch moderne Compiler erkennen konkurrierende Schreibzugriffe zwischen zwei Sequenzpunkten und mahnen sie (bei entsprechender Warnstufe) an.<a title=\"\" href=\"#_ftn1\">[1]<\/a><\/p>\n<p>&nbsp;<\/p>\n<div><br clear=\"all\" \/><\/p>\n<hr align=\"left\" size=\"1\" width=\"33%\" \/>\n<div>\n<p><a title=\"\" href=\"#_ftnref1\">[1]<\/a> \u00a0\u00a0\u00a0\u00a0\u00a0 Beim GCC ist der Schalter -Wsequence-point (der auch bei -Wall mitgenommen wird), siehe dazu http:\/\/gcc.gnu.org\/onlinedocs\/gcc\/Warning-Options.html.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Je mehr Freiheiten ein Compiler hat, desto ungenierter kann er optimieren. Besonders Schreibzugriffe interessieren Compiler, denn kann er diese einsparen kann, l\u00e4uft das Programm sp\u00e4ter ein bisschen schneller. Damit das Resultat eines Compilers jedoch beherrschbar bleibt, definiert der C(++)-Standard Sequenzpunkte\u00a0(eng. sequence point), an dem alle Schreibzugriffe klar zugewiesen wurden. (Dass der Compiler sp\u00e4ter Optimierungen macht [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-1429","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1429"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1429\/revisions"}],"predecessor-version":[{"id":1442,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1429\/revisions\/1442"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}