Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: C - ongelma

Omsos [07.10.2011 19:33:31]

#

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!

Teuro [07.10.2011 19:47:40]

#

Ehkä muotoiltu versio auttaa ongelmakohdan löytymisessä? (Mod. korjasi.) Vinkiksi voisi antaa muuttujan 'b' esittely- ja määrittelykohdan.

User137 [07.10.2011 20:14:10]

#

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;

jalski [07.10.2011 20:43:18]

#

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ä? ;-)

Metabolix [07.10.2011 20:47:20]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta