Dilema [re-editat]

Astazi faceam testele “orientative” pe care le pune la dispozitie Facultatea de Informatica Manageriala, si m-am apucat de intrebarile de C++. Nu va spun rezultatul, dar am ajuns la o intrebare interesanta, care m-a pus in incurcatura vreo 10-15 minute. Ea suna asa:

#define f(x) x*x

void main()
{

cout<<f(3+5);

}

Care este output-u’ acestei secvente? 23. Logic (nu glumesc, chiar asa este…). Cine isi da seama care-i faza in mai putin de 2 minute, are o bonboana…

Later edit [1:17 AM]:

Citind prin acea cartulie raspunsurile la problemele “rezolvate” de mine (ma verificam :P), am observat ca unele erau gresite. Ma rog, cel putin la compilarea lor in VC++2008 sau in timpul rularii fie dadeau eroare de compilare, fie o bagau pe faimoasa “Run-Time Check Failure #3”. Asa ca m-am gandit: io daca o sa scriu raspunsu’ care se considera in anul 2008 a fi corect, o sa mi-o iau in freza, pentru caaaa (a se citi cu voce de Gigi Becali) dupa standardele impuse de C++ din preistorie este eronat. Acum se pune evidenta problema: cine are dreptate? Visual C++ 1986 sau Visual C++ 2008. Not funny (ca in videoclipu’ ala cu pustiu’). Sa vedem ce spune Prof. Conf. Univ. Dr. Daniela Crisan maine, asta daca imi raspunde :)). Sper sa imi pice o problema d-asta gresita la simulare ca sa il santajez pe Iacob sa ma treaca daca ii dovedesc ca e gresita, haha.

[polldaddy poll=”691790″]

10 thoughts on “Dilema [re-editat]”

  1. E banal. Orice programator care stie C la un nivel decent stie care este explicatia. Nici macar nu e ceva la fel de exotic precum atributul volatile.

    De curiozitate, ai putea te rog sa faci copy&paste la macar una din acele probleme dubioase?

  2. de-acord cu tine ca e banal (acum, atunci eram mult mai habarnist). din pacate, cartea nu mai este pe meleaguri lizibile. a fost utila maximum 1 luna. dar, problemele uneori aveau probleme care tineau de compilatorul folosit. ce era doar “warning” in VC6.0 s-ar putea sa se fi considerat eroare in VC9.0..

  3. Neavand codul cu pricina va trebui sa-mi dau cu presupusul, dar sper sa nu fiu prea departe de adevar.

    > Acum se pune evidenta problema: cine are dreptate? Visual C++ 1986 sau Visual C++ 2008.

    Unu la mana, in 1986 nu exista Visual C++, ci Microsoft C sau QuickC (tot de la MS) :-P Doi la mana, atunci cand se da o problema, enuntul trebuie sa fie cat mai complet si sa nu lase loc de ambiguitati. In cazul de fata, ar trebui precizat care standard C este folosit sau pe ce platforma este rulat codul (procesor, sistem de operare, compilator). Cele mai cunoscute standarde sunt K&R (o antichitate), ANSI (C90) si C99. Cel mai popular la ora actuala este ANSI, eventual combinat cu niste extensii. De exemplu Linux-ul abuzeaza din plin de facilitatile oferite de GCC. Apropo de “standardele impuse de C++ din preistorie”, sa stii ca pana acum cativa ani NetBSD folosea exclusiv K&R si nu trecuse la ANSI. In concluzie daca profesoara lucreaza cu VC++ 1986, tu esti cel care greseste si merita sa si-o ia in freza :-) Sau ai putea sa ceri sa lucrati si voi conform C99 :-)

    Ce-i drept nu m-ar surprinde ca profesoara sa fie paralela cu realitatile practice ale programarii si sa n-aiba habar de standarde si portabilitate. Cred ca mai bine de 90% dintre profesori considera ca int-ul este mereu pe 16 de biti, cand de fapt acest lucru nu este precizat nicaieri. Singura cerinta a C-ului este: char < int < long, iar char trebuie reprezentat pe minim 8 biti.

    Ce e trist, e faptul ca asta nu e singura lacuna a unor profesori. Multi habar n-au de GIGO (Garbage In Garbage Out) si nu verifica datele de intrare sau faptul ca malloc a fost executat cu succes. Bineinteles ca excludem cazurile in care se exemplifica altceva. In anul I am avut un profesor obsedat de aceste detalii si pot spune ca mi-a prins tare bine. Legat de portabilitate, ma distram de fiecare data cand vedeam vreun coleg chinuindu-se sa compileze o bucata de cod doar pentru ca in mintea lui C era egal cu Borland C sau mai stiu eu ce. Oricum un lucru e cert: C nu e pentru toti si necesita nervi de otel uneori :-D

  4. :))) la ultima afirmatie sunt deplin de acord. evident, m-ai facut la capitolul asta si recunosc ca multe din cate mi-ai spus – legat de standarde – le aflu pentru prima oara. eh, asta e, cat traieste omul invata. imi asum responsabilitatea habarnismului de atunci, de azi si de maine. :D

  5. Deh, nimeni nu s-a nascut invatat :-) Eu am avut norocul sa iau contact cu Linux si alte proiecte open source la o varsta la care eram predispus spre explorare, altfel nu cred ca as fi stiut lucrurile astea. Pana la urma, important e sa profiti de ocaziile de a invata ceva nou si de a-ti cunoaste limitele. Ce-i drept ultima parte e mai dificila :-)

Leave a Reply

Your email address will not be published. Required fields are marked *