Inkrement Operator



  • Das ist übrigens sogar undefiniert (nicht nur unspezifiziert), d.h. es kann überhaupt alles passieren, weil i zwischen zwei Sequenzpunkten zweimal verändert wird.



  • volkard schrieb:

    es ist üblich, daß zuerst der zweite parameter ausgewertet wird und dann erst der erste.

    Ist es das? Welche Idee steckt dahinter?



  • Nexus schrieb:

    volkard schrieb:

    es ist üblich, daß zuerst der zweite parameter ausgewertet wird und dann erst der erste.

    Ist es das? Welche Idee steckt dahinter?

    Die c-calling convention (cdecl).
    man will variadic functions erlauben - also funktionen mit unendlich viel parametern. nun ist es so, dass wie bei printf der 1. param aber dennoch fix sein muss (um die restlichen sinnvoll auswerten zu koennen).

    hardware maessig hat man zur parameter uebergabe aber nur einen stack (LIFO). dh wir pushen die Elemente in umgekehrter reihenfolge auf den stack:

    print(1,2,3);
    

    wird zu:

    push 3
    push 2
    push 1
    call print
    

    dadurch kannst du in print ein pop machen und hast den 1. parameter.



  • Ah okay, danke für die Erklärung.

    Bei MSDN steht dazu noch einiges Interessantes, das schau ich mir mal an...



  • Shade Of Mine schrieb:

    Die c-calling convention (cdecl).[...]

    push 3
    push 2
    push 1
    call print
    

    dadurch kannst du in print ein pop machen und hast den 1. parameter.

    Nö, dann hast du die Rücksprungadresse. Die Argumente auf dem Stack werden nicht gepoppt, sondern von der Funktion aus relativ zum Stackpointer (zum Zeitpunkt des Funktionseintritts) adressiert. Einfach mal ein simples C-Programm mit gcc -O0 -S übersetzen und den Assembler-Code angucken.
    Was die variadischen Funktionen angeht, sollte man bedenken, dass es ursprünglich zu K&R-Zeiten keine Prototypen gab, also quasi alle Funktionen "variadisch" waren.



  • Bashar schrieb:

    Was die variadischen Funktionen angeht, sollte man bedenken, dass es ursprünglich zu K&R-Zeiten keine Prototypen gab, also quasi alle Funktionen "variadisch" waren.

    Früher war halt alles besser... 😞



  • Bashar schrieb:

    Nö, dann hast du die Rücksprungadresse. Die Argumente auf dem Stack werden nicht gepoppt, sondern von der Funktion aus relativ zum Stackpointer (zum Zeitpunkt des Funktionseintritts) adressiert.

    du kennst "A little inaccuracy sometimes saves tons of explanation"?

    dass man nicht popt hat einen effizienz grund...



  • Shade Of Mine schrieb:

    du kennst "A little inaccuracy sometimes saves tons of explanation"?

    Was schert es dich, solange ich die "ton of explanation" übernehme.



  • Shade Of Mine schrieb:

    "A little inaccuracy sometimes saves tons of explanation"?

    warum sind in diesem forum eigentlich alle sinnsprüche auf englisch?



  • Shade Of Mine schrieb:

    Bashar schrieb:

    Nö, dann hast du die Rücksprungadresse. Die Argumente auf dem Stack werden nicht gepoppt, sondern von der Funktion aus relativ zum Stackpointer (zum Zeitpunkt des Funktionseintritts) adressiert.

    du kennst "A little inaccuracy sometimes saves tons of explanation"?
    dass man nicht popt hat einen effizienz grund...

    du würdest wirklich erst die rücksprungadresse popen und in einem register ablegen, dann den ersten patameter pushen, dann die rücksprungadresse pushen, dann den parameter verwarbeiten? oder eins der raren register binden nur um die rücksprungadresse zu halten? oder die rücksprungadresse in einer static-variablen lagern (oops, geht ja gar nicht bei rekursion!). irgendwie halte ich "Nö, dann hast du die Rücksprungadresse" für einen nachweis, daß deine "vereinfachung" nicht nur geschummelt hat, sondern nichts erklärt hat. wie klapperstorch. die komische reihenfolge hat bestimmt nen anderen grund als daß man pop nehmen kann.



  • volkard schrieb:

    du würdest wirklich erst die rücksprungadresse popen und in einem register ablegen, dann den ersten patameter pushen, dann die rücksprungadresse pushen, dann den parameter verwarbeiten?

    nein, aber es erklärt sich sehr leicht so.
    weil ich einfach rücksprung adresse und stack aufräumen ignorieren kann



  • volkard schrieb:

    warum sind in diesem forum eigentlich alle sinnsprüche auf englisch?

    1. Weil hier nur coole Typen sind die perfect auswärts speaken können 🤡
    2. Weil jemand diese Sinnsprüche auf Englisch aufgeschnappt hat und sich nicht die Blöße geben will sie in einer grauenhaften 1 zu 1- Übersetzung ins Deutsche zu übernehmen.
    3. Weils halt echte "geflügelte Worte" oder Redewendungen sind, die man nicht so einfach übersetzen kann. "I have nothing at the hat with English." 😉


  • da sag ich mal nur:
    Wenn alles andere fehlschlägt, dann lies das Handbuch.



  • O.K. dann gilt ab jetzt weaponquietstand 😉



  • volkard schrieb:

    da sag ich mal nur:
    Wenn alles andere fehlschlägt, dann lies das Handbuch.

    Genau. Everyone the His! *weglauf*

    Schönes WE


Anmelden zum Antworten