C-Programmierung: der Unterschied zwischen ++i und i=i+1 aus einer assembler-Sicht?
War dieses eine interview-Frage. Ich sagte, Sie waren die gleichen, aber dies wurde als eine falsche Antwort. Aus assembler Sicht, gibt es keine denkbare Unterschied? Ich kompiliert habe zwei kurze C-Programme mit Standard-gcc-Optimierung und -S finden Sie in der assembler-Ausgabe, und Sie sind die gleichen.
- Was hat der interviewer sagen, war die richtige Antwort?
- Vielleicht ist er verwirrt ++i und i++?
- Aber auch ++i und i++ ohne Zuordnung sollte (mit einem guten Optimierer) kompilieren, um die gleiche, nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die interviewer wollten eine Antwort, so etwas wie dieses:
FWIW, die Tatsache, dass Sie wissen, wie man die Montage macht Sie ein besserer Programmierer als 90% der Leute ich habe ein interview über die Jahre. Nehmen Sie Trost in der Tatsache, dass Sie nicht haben, um die Arbeit mit der ratlose Verlierer, wer interviewte Sie.
Sieht aus wie Sie Recht hatten, und Sie waren falsch. Ich hatte ein ähnliches Problem in einem Vorstellungsgespräch, wo ich gab die richtige Antwort wurde als falsch.
Ich selbstbewusst argumentierte der Punkt mit meinem interviewer, der offenbar nahmen Anstoß zu meiner Frechheit. Ich den job nicht bekommen, aber dann wieder, arbeiten unter jemand, der "alles weiß" wäre gar nicht so wünschenswert.
Hast du wahrscheinlich Recht. Ein naiver compiler tun könnte:
und
aber jede halbwegs vernünftige compiler wird nur optimieren hinzufügen 1, um die erste version.
Diese übernimmt alle relevanten Architektur hat inc und fügen Sie Anweisungen (wie x86 ist).
inc
Unterricht. Wenn ich ein Zeiger auf ein int, dann ++i wird die gleiche sein, wie add i, 4, weil ich muss auf den nächsten int ist 4 Byte breit. Wenn ich Punkte auf einer langen, die ++ich das gleiche wie add i,8, aus dem gleichen Grund.Zur Verteidigung der interviewer, Kontext ist alles. Was ist der Typ ich? Reden wir hier von C oder C++ (oder eine andere C-ähnliche Sprache)? Wurden Ihnen gegeben:
oder war es mehr Kontext?
Wenn ich war gebeten worden, diese, meine erste Reaktion gewesen wäre, habe "ich flüchtig?" Wenn die Antwort ja ist, dann ist der Unterschied riesig. Wenn nicht, der Unterschied ist klein, und semantisch, sondern pragmatisch keiner. Der Beweis dafür ist der Unterschied in der parse-Baum, und letztlich die Teilbäume erzeugt.
So dass es klingt wie Sie haben die pragmatische Seite Recht, aber der semantische/kritisch gedacht-Seite falsch.
Angriff auf den interviewer (ohne Rahmen), würde ich Fragen, was der Zweck der Frage war. Wenn ich die Frage gestellt habe, ich möchte es verwenden, um herauszufinden, ob der Kandidat wusste, feine semantische Unterschiede, so erzeugen Sie ein parse-Baum, wie, kritisch zu denken und so weiter und so Fort. Ich in der Regel Fragen, eine C-Frage, meinen die Befragten, dass fast jeder Kandidat bekommt falsch - und das ist auch so gewollt. Ich wirklich kümmern sich nicht über die Antwort auf die Frage, Ich Sorge mich über die Reise, werde ich mit den Kandidaten um das Verständnis zu erreichen, das sagt mir viel mehr über als richtig/falsch auf eine Quiz-Frage.
In C++, es hängt davon ab, ob
i
ist ein int oder ein Objekt. Wenn es ein Objekt wäre, wäre es wahrscheinlich erzeugen eine temporäre Instanz.Kontext ist die Hauptsache hier, weil auf eine optimierte release-Version der compiler optimieren wird, entfernt die i++, wenn vorhanden, eine einfache [inc eax]. in der Erwägung, dass so etwas wie int some_int = i++ brauchen würde, um zu speichern die ich im some_int ERSTEN und nur dann erhöht ich.