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$5Ohessa 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.