Tein joitain C pähkinöitä täältä http://www.gowrikumar.com/c/
Olen vielä täysi aloittelija, joten tämän kanssa tuntuu lähtevän järki.
Miksi ohjelma antaa tulokseksi 74?
#include<stdio.h> int main() { int a=1; switch(a) { int b=20; case 1: printf("b is %d\n",b); break; default:printf("b is %d\n",b); break; } return 0; }
Mod. lisäsi kooditagit!
Ehkä muotoiltu versio auttaa ongelmakohdan löytymisessä? (Mod. korjasi.) Vinkiksi voisi antaa muuttujan 'b' esittely- ja määrittelykohdan.
Niin tuo on aika epätavallinen paikka koodille, mutta se menee kääntäjästä läpi. Muuttuja b on määritelty mutta miksi arvon 20 sijoitus ei toimi? Voiko olla että kääntäjä ajattelee asian näin?
int b; case 1: printf("b is %d\n",b); break; default:printf("b is %d\n",b); break; b = 20;
Kun taas tämä antaa runtime errorin heti:
int b; switch(a) { b=20;
Mitä sitä arvuuttelemaan, kun syy selviää nopeasti vilkaisemalla disassemblyä:
{ int a=1; 0018 L$1: 0018 C7 45 F8 01 00 00 00 mov dword ptr -0x8[ebp],0x00000001 switch(a) 001F 83 7D F8 01 cmp dword ptr -0x8[ebp],0x00000001 0023 74 09 je L$3 0025 EB 1B jmp L$4 { int b=20; 0027 L$2: 0027 C7 45 FC 14 00 00 00 mov dword ptr -0x4[ebp],0x00000014 case 1: printf("b is %d\n",b); 002E L$3: 002E 8B 45 FC mov eax,dword ptr -0x4[ebp] 0031 50 push eax 0032 B8 00 00 00 00 mov eax,offset L$8 0037 50 push eax 0038 E8 00 00 00 00 call printf_ 003D 83 C4 08 add esp,0x00000008 break; 0040 EB 12 jmp L$5
Ohessa siis oleellinen pätkä... Vihje: mieti suoritetaanko labeli L$2: ikinä? ;-)
Ei tarvitse arvailla eikä tutkia empiirisesti, kun asia lukee speksissä aivan selvällä englannin kielellä. Switch-rakenteessa ei pitäisi olla mitään ihmeellistä: jos löytyy case, joka vastaa annettua arvoa, hypätään siihen, ja jos ei löydy, hypätään default-kohtaan tai koko switchin ohi. Joka tapauksessa siis rivi int b=20
yllä jää kokonaan suorittamatta. C:ssä muuttuja on silti olemassa mutta vain arvon asetus ohitetaan. C++:n mukaan tilanne on "ill-formed" eli toiminnasta ei sanota mitään; käytännössä tulos lienee yleensä sama kuin C:ssä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.