webForumDet fria alternativet

C fråga, varför { }...

8 svar · 300 visningar · startad av Viktor

ViktorMedlem sedan aug. 20021 752 inlägg
#1

Har sett 2 program nu där man har typ

void kalle()
{
   printf("Hej hopp!");

   {
      printf("Hej hopp igen!");
      printf("Kalle!");
   }
   printf("Anka");
}

Varför har man hakar runt en kod section som inte måste ha hakar runt sig??

/Viktor

Marcus EMedlem sedan maj 20021 466 inlägg
#2

För att dela in koden i oberoende sektioner. Båda sektionerna utnyttjar kanske varaibler med samma namn fast av olika typ.

Namnen måste i så fall ändras för att det ska gå att ta bort klamrarna. I ditt exmpel är klamrarna meningslösa.

ViktorMedlem sedan aug. 20021 752 inlägg
#3

Altså om man vill göra något sånthär,

void kalle()
{
   {
      int tmp=5;
      printf("%d",tmp);
   }
    char tmp='k';
    printf("%c",tmp);

/Viktor

developerMedlem sedan aug. 2001458 inlägg
#4

Nu rörde ju din fråga C och inte C++. Men det kan vara värt att nämna en vanlig anledning för scope i C++, nämligen att objekt lever inom ett scope, och att destructorer körs när man går ur scopet

void kalle()
{
	CMyFirstClass c1;
	{
		CMySecondClass c2;
		// ...
	} // när man går ur detta scope körs c2:s destructor
 	// ...
} // när man går ur detta scope körs c1:s destructor
PeWMedlem sedan juni 200010 432 inlägg
#5

... vilket samtidigt påpekades i de kurser jag gått, som klart olämpligt pga att det genererar ful och oläslig kod.

developerMedlem sedan aug. 2001458 inlägg
#6

PeW skrev:

... vilket samtidigt påpekades i de kurser jag gått, som klart olämpligt pga att det genererar ful och oläslig kod.

Håller inte riktigt med om det ;). Men fortfarande gäller ju att man håller funktioner korta. Att dela in i flera scope gör man inte för att logiskt gruppera långa kodavsnitt, utan för att se till bestämma livstid på objekt (att köra destruktorer vid rätt tillfällen), och min erfarenhet är att det leder till färre fel.

Vilka alternativ har ni diskuterat?

ViktorMedlem sedan aug. 20021 752 inlägg
#7

developer skrev:

Vilka alternativ har ni diskuterat?

delete/free måste väll vara ett alternativ? Då får man väll samma effekt?
Att det ser fult ut måste jag hålla med om, det skulle vara snyggare om man kunde sätta en lable på klamrarna.

/Viktor

developerMedlem sedan aug. 2001458 inlägg
#8

Ja, men new/delete har flera nackdelar. Dels allokerar man på heapen istället för stacken, vilket ger sämre prestanda (eftersom man med new ägnar tid åt att leta i lista över lediga minnesblock och med delete sätter in i ledig-listan) och ofta sämre CPU-skalbarhet (dvs om man stoppar i fler processorer i datorn går det ändå inte fortare). Dessutom måste man själv se till att hantera eventulla exceptions, eftersom man annars inte kommer köra delete. Med ett scope är man garanterad att destructorn körs även om man kastar exception.

> ...sätta en lable på klamrarna

Det finns IDE:er som gör att man kan expandera kod-block, vilket underlättar något.

rymdknarkMedlem sedan maj 2000175 inlägg
#9

developer:

Du måste inte nödvändigtvis använda dig av standart new/delete.
Det går ju faktiskt att skriva dina egna allokerings/deallokerings funkrioner för new och delete.

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)