Close
Duke shfaqur rezultatin -9 deri 0 prej 10
  1. #1
    i/e regjistruar Maska e Gepardi
    Anëtarësuar
    30-10-2002
    Vendndodhja
    Tiranë
    Postime
    169

    C || C++ ... Një shembull i çuditshëm në C

    Pershendetje

    Kodi:
    #include 
    int main()
    {
         int c;
         c || c++;
         printf("c equals %d \n", c);
         system("pause");
         return 0;
    }
    Rezultati i ekzekutimit te ketij kodi eshte

    "c equals 2"

    Duket sikur c inicalizohet me 1..
    Shume e cuditcshme..
    Perdora Dev-C++ per ta kompiluar.

  2. #2
    i/e regjistruar Maska e PantherTouch
    Anëtarësuar
    12-02-2004
    Postime
    31
    Sipas "operator precedence" operatori rrites ++ ka perparesi ndaj ||
    MIREPO definicioni i ++ eshte qe (rritja ndodh pasi c'do veprim ne te majte ka mbaruar, prandaj dhe ndryshimi midis x++ dhe ++x)

    Pra cfare ndodh eshte:
    c || c => 1
    1++ => 2

  3. #3
    i/e regjistruar Maska e Gepardi
    Anëtarësuar
    30-10-2002
    Vendndodhja
    Tiranë
    Postime
    169
    Hmm

    Nuk eshte shume bindese...
    Pse c || c = 1 kur c eshte e painicializuar .. ?

  4. #4
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Atehere, edhe une perdor Dev-C++,
    e testova kete programin, duke perdorur edhe 3 ndryshore te tjera d,e,f.

    E para punes, shprehja c || c++ injorohet totalisht, c || c++ jep nje vlere boolean qe nuk i jepet asnje ndryshore, do ndryshonte puna sikur
    c = c || c++. ose te kishte vetem c++ e cila eshte forme e shkurtuar e c=c+1.

    duke patur parasysh kete fakt perpiluesi injoron shprehjen.(komentojeni dhe shikoni se nuk ndryshon asgje)

    Tani per sa i perket vlerave te inicializimit te ndryshoreve,
    mund ta provoni vete duke deklaruar
    int c,d,e,f;
    dhe duke shfaqur vlerat ne ekran.
    ne çdo ekzekutim te ri te programit vlerat nuk kane per te ndryshuar. Nuk e di se me çfare kriteri i inicializon ndryshoret Dev-C++, por me sa vura re nuk i ndryshon vlera.

    nese nderrojme rradhen e deklarimit
    int d,e,f,c;
    d do te marri vleren qe kishte c, pra 2
    e do te marri vleren qe kishte d, f ate qe kishte e.

    perfundimi me i vlefshem eshte se nje shprehje vlera e se ciles nuk i jepet (assign) asnje ndryshoreje injorohet sepse nuk ka asnje vlere praktike, me te drejte, kompjuterit i duhet te llogarisi nje vlere qe brenda programit nuk perdoret...

    sikur te ishte c = c || c++;
    meqe || eshte nje OR llogjike dhe jo binare si |
    atehere perfundimi do dali gjithmone 1, vlera qe interpretohet si TRUE.
    Nuk mund te dali 0 sepse edhe po te jete vlera fillestare c=0,
    c = c || c++ = 0 || (0+1) = 0 || 1 = 1

  5. #5
    i/e regjistruar Maska e Timianonimi
    Anëtarësuar
    29-07-2008
    Vendndodhja
    Percaktohet me vullnetin tim duke i ndryshuar tri dimenzionet hapsirore dhe duke ju pershtatur rrjedhjes se dimenzionit kohor te cilin nuk mund ta kontrolloj
    Postime
    146
    Ka me se 6 vite qe nuk kam shkruar edhe as nje rresht te programimit por para kesaj kohe kam punuar per nja 6 vite si programer i sistemeve real (real-time embedded systems ) ne perendim dhe kam programuar ne gjuhen C.

    Rastesisht e verejta postimin tuaj dhe prej nostaligjise i lexova ato. Sa me kujtohet mua kur ta deklarosh nje variabel kompalieri do ta rezervoj nje memorje per ate variabel vlera e te ciles eshte e paparapare derisa nuk inicializohet me vleren fillestare (nese nuk inicializohet ajo memorje mund ta permbaj cfardo vlere - varet a e ka inicializuar ndonje program tjeter, a ka shkruar dicka ne te- gjasa me e madhe eshte me qene 0), ne rastin tuaj duket te jete zero, por nuk do te thote qe gjithmone do te jete e tille(varet prej komapailerit besoj). Sqarimi i Panther Touch me duket ne rregull me supozimin qe vlera e memorjes se variables "c" ka qene 0?
    Ndryshuar për herë të fundit nga Timianonimi : 22-10-2008 më 10:07
    I'll not commit the fashionable stupidity of regarding everything I can't explain as fraud-C.G. Jung

  6. #6
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    vlera iniciale e ndryshores se pare te pakten tek dev-c++ eshte 2.
    vlera iniciale e ndryshores se dyte eshte 51.

  7. #7
    i/e regjistruar Maska e PantherTouch
    Anëtarësuar
    12-02-2004
    Postime
    31
    Citim Postuar më parë nga Gepardi Lexo Postimin
    Hmm

    Nuk eshte shume bindese...
    Pse c || c = 1 kur c eshte e painicializuar .. ?

    Me poshte variabla c eshte e ndryshuar me v qe mos te ngaterrohet me gjuhen C

    Sepse :

    v nese eshte e painicializuar atehere ka ndodhur procesi i alokimit (allocation) dhe v ne vetvete eshte nje pointer i bllokut te memorjes te alokuar.
    Ky bllok memorje mjafton qe nje nga bitet ta kete 1 dhe atehere:
    v || v = 1 sipas definicionit te boolean OR

    Deri ketu eshte njesoj si te behej kodi ne C si te behej ne assembly (pra s'ka lidhje me compiler)

    I vetmi perjashtim eshte nese te tera bitet jane 0
    Nese ky eshte rezultat i perhershem qe ndodh edhe kur bitet para se te alokohen jane te garantuara qe jane 0 atehere ka mundesi qe Dev-C++ te ndryshoj nje bit ne 1 kur ben alokimin (per nje arsye ose nje tjeter)

    Menyra me kollajte per ta verifikuar eshte me Olly ...

    ps. C'fare ndodh me && (nuk kam Dev-C++ ketu ne pune)
    Ndryshuar për herë të fundit nga PantherTouch : 22-10-2008 më 13:41

  8. #8
    i/e regjistruar Maska e Gepardi
    Anëtarësuar
    30-10-2002
    Vendndodhja
    Tiranë
    Postime
    169
    Per mendimin tim nje gje e tille nuk duhet te ndodhte .
    Nuk mund tu percaktosh vlera arbitrare variablave te painicializuara sepse kjo e kthen programin ne totalisht te papercaktueshem. Nje situate e tille mund te lindi gjate algoritmeve me komplekse dhe nje ngjarje e tille do ta bente dyshuese saktesine e rezultateve te programit.

    Une e provova kete shembull duke u nisur nga gjuhet PHP dhe Ruby kur instruksione te tipit "a || a = 2 apo $a || $a = 2" perdoren per te inicializuar variablat qe nuk kane nje vlere te caktuar. (shprehja a=2 do "evaluohet" vetem nqs a eshte null sepse null ne keto gjuhe eshte FALSE). Biles ne Ruby ka nje menyre te shkurter per ta shkruar instruksionin e mesiperm "a ||= 2".

    Per tju kthyer kodit me siper ne C me te vertete qe instruksioni c || c++ nuk ka ndonje efekt mbi variablen c. Gjithsesi per mua pyetjet qe lindin nga ky shembull ne C jane:

    1. Cfare efekti ka operatori ++ mbi nje variabel te painicializuar ?
    2. Cfare efekti ka operatori || mbi variabla te painicializuara ?

    Ja dhe nje shembull i ndryshuar i kodit te mesiperm. Rezultati i ekzekutimit mbetet i njejte.. Pra c || c++ rezulton TRUE. Nuk e kam provuar ne kompilatore te tjere .. Nqs ndonjeri e ka provuar le te na jape rezultatet.

    Kodi:
    #include 
    int main()
    {
         int c;
        if (c || c++) {
             printf("c equals %d \n", c);
        }
         system("pause");
         return 0;
    }
    Ndryshuar për herë të fundit nga Gepardi : 22-10-2008 më 13:55

  9. #9
    i/e regjistruar Maska e Gepardi
    Anëtarësuar
    30-10-2002
    Vendndodhja
    Tiranë
    Postime
    169
    ps. C'fare ndodh me && (nuk kam Dev-C++ ketu ne pune)
    Sapo e provova kodin me siper me && pra

    Kodi:
    #include 
    int main()
    {
         int v;
         v && v++;
         printf("v equals %d \n", v);
         system("pause");
         return 0;
    }
    Rezultati eshte "v equals 3"
    Kjo pre shkak se v && v++ lind nevojen e ekzekutimit te krahut te djathte te instruksionit (v++) . Vlera e v ka qene 2. Pas ekzekutimit te v++ eshte bere 3.
    Kurse ne rastin me siper (v || v++) krahu i djathte i instruksionit (v++) nuk eshte ekzekutuar sepse ka ndodhur nje "short circuit" (v eshte 2 pra true, nuk ka rendesi si jane anet e tjera te ||). Si rrjedhoje vlera e v ka mbetur e pandryshuar, pra 2.

    Sic duket kompilatori me te vertete qe e inicializon variablen me vleren 2.
    Ndryshuar për herë të fundit nga Gepardi : 22-10-2008 më 14:32

  10. #10
    i/e regjistruar
    Anëtarësuar
    12-11-2006
    Postime
    103
    Me sa mbaj mend variablat duhet inicializuar patjeter ne C, perndryshe gjate ekzekutimit, kur memoria t'i rezervohet (allocate) variablit v, v-ja do te marre vleren e cfaredo qe gjendet aty. Ne kete rast te ka qelluar vlera 2 dhe ajo eshte perdorur.

Tema të Ngjashme

  1. Kur’ani i Mrekullueshem edhe për jo-muslimanet...
    Nga altruisti_ek84 në forumin Komuniteti musliman
    Përgjigje: 0
    Postimi i Fundit: 19-04-2009, 03:38
  2. Rama të marrë shembull nga Kukësi
    Nga white-knight në forumin Tema e shtypit të ditës
    Përgjigje: 2
    Postimi i Fundit: 12-01-2009, 12:33
  3. Bursa Shqipëtare
    Nga Gerrard në forumin Ekonomi & biznes
    Përgjigje: 17
    Postimi i Fundit: 08-05-2007, 00:55
  4. Shembull konfigurimi te nje filtruesi
    Nga qoska në forumin Rrjeti kompjuterik
    Përgjigje: 4
    Postimi i Fundit: 30-06-2006, 09:29
  5. Kur dhe kush e ka shkruajtur Kuranin?
    Nga Albo në forumin Toleranca fetare
    Përgjigje: 17
    Postimi i Fundit: 05-02-2004, 16:47

Regullat e Postimit

  • Ju nuk mund të hapni tema të reja.
  • Ju nuk mund të postoni në tema.
  • Ju nuk mund të bashkëngjitni skedarë.
  • Ju nuk mund të ndryshoni postimet tuaja.
  •