METABYTE
Inapoi la articole

Enigma pentru programatorii C: cât face a după a = a++ + ++a?

Analizăm un exemplu clasic de comportament nedefinit în C, care îl face pe compilator să se uite cruciș.

14 mai 20262 min de citit
Enigma pentru programatorii C: cât face a după a = a++ + ++a?

Vă aduceți aminte de acele momente la interviuri când vi se cere să calculați valoarea unei variabile după câțiva incrementări? Dacă da, fie ați trecut cu zâmbetul pe buze, fie încă vă întrebați ce a calculat compilatorul.

În 2011, cercetătorul polonez Gynvael Coldwind a publicat un post cu un exemplu aparent banal: int a = 5; a = a++ + ++a;. Și a rugat să se ghicească rezultatul. Spoiler: standardul limbajului C consideră această expresie ca fiind comportament nedefinit (undefined behavior). Adică compilatorul poate face orice cu această linie — de la formatarea hard diskului până la trimiterea codului într-o gaură neagră.

De ce? Pentru că într-un singur sequence point, variabila a este modificată de mai multe ori fără un sequence point intermediar. a++ și ++a ambele modifică a, iar ordinea evaluării nu este definită. Compilatoare diferite, flaguri de optimizare diferite — răspunsuri diferite. De exemplu, GCC cu -O2 poate da 12, iar Clang — 11. Și dacă ai noroc, poate chiar 42.

Morala: nu scrieți așa ceva în producție dacă nu vreți să fiți blestemați la standup-urile zilnice. Folosiți expresii separate și nu vă bazați pe ordinea evaluării. Și da, activați întotdeauna flagurile de avertizare — -Wall -Wextra vă salvează reputația.

Comentariul studioului METABYTE: Și la noi sunt zile când codul se comportă ca acest exemplu — imprevizibil. Dar preferăm să nu ghicim pe compilator, ci să scriem cod curat și clar. Deși uneori ne vine să lăsăm câteva astfel de enigme pentru viitorii stagiari...

URMATORUL PAS

Ti-a placut abordarea?

Aplicam aceleasi principii in proiectele clientilor: AI, automatizari, produse care nu se sting dupa lansare.