Mi értelme van annak, hogy c# ban egy for-ciklusban deklarált, definiált változó lokális a ciklust tartalmazó blokkra?
Például:
using System;
public class Test
{
public static void Main()
{
for(int i = 0; i < 5; ++i) {}
int i; //Ez nem jó mert már i létezik.
}
}
Ez az ami érthetetlen számomra:
using System;
public class Test
{
public static void Main()
{
for(int i = 0; i < 5; ++i) {}
int j = i; /* The name `i' does not exist in the current context */
}
}
Miért tették lokálissá ha egyszer nem használhatom?
Miért ne használhatnád?
for(int i = 0; i < 5; ++i) {}
int i; //<-- szedd ki az 'int'-et! azért hoz hibát, mert már deklaráltad. szimplán lekérheted már az értékét. viszont vigyázz, mert ha módosítod, az kihatással van a ciklus futására.
}
ja már értem mi a valódi problémád. (kissé késő van már:))
elnéztem bocsi.. akkor javítva az előző:
for(int i = 0; i < 5; ++i) { // itt létezik csak az i}
int i; //Ez jó, mert itt már nem létezik!
szóval a for után lévő kapcsos zárójelben létezik még. utána viszont nem tudod használni. vagy töröld ki a kapcsoszárójelet, vagy rakd bele az int j = i; sort
(az első hozzászólásomat pedig hagyd figyelmen kívül mert hülyeség! :))
És miért lokális ha egyszer nem használhatom ott a példámban a mainben(a ciklust tartalmazó blokkban)?
"Vagy ha kitörlöd a kapcsos zárójeleket" Ez sem segít.
/* itt nem ismert az i */
for(int i = 0; i < 5; ++i) {
/* itt ismert az i */
}
/* itt nem ismert az i */
Ha azt akarod, hogy kívülről is látható legyen, akkor kívül kell deklarálnod:
public static void Main()
{
int i;
for(i = 0; i < 5; ++i) {}
int j = i; /* itt is ismert i */
}
#5
Ja igen, mert az csak arra vonatkozik hogy az alatta lévő sort ismétli. (de ez most lényegtelen)
Kapcsos zárójelbe teszed akkor létezik az i. Utána nem tudod használni... pont ez a jó benne, mert akkor később is használhatod az i változót.
Ha szükséged van az értékére akkor ne a for cikluson belül deklaráld hanem előtte (ahogy fölöttem írták). Így később is használhatod. Viszont minden esetben nullázd ki a for-ban, mert ha később is fel akarod használni akkor nehogy meglepetés érjen, hogy nem nullától hanem 4-től akar majd számolni.
Egyáltalán nem értem miről beszéltek!
A kérdésre válaszoljatok jó ne másról legyen szó. xD
A könyvben az van írva hogy:
Mivel a ciklusfeltétel után blokkot nyitunk, azt hinné az ember, hogy a ciklusváltozó lokális lesz a ciklus
blokkjára (a for után következő kapcsos zárójelekkel határolt részre) nézve, de ez nem fedi a valóságot. A
ciklusfeltételen belül deklarált ciklusváltozó lokális lesz a ciklust tartalmazó blokkra (vagyis ebben az esetben a
teljes Main függvényre) nézve. Épp ezért a következő forráskód nem fordulna le, hiszen i már létezik:
using System;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; ++i)
{
Console.WriteLine(i);
}
int i = 10; // itt a hiba, i már létezik
Console.ReadKey();
}
}
}
Ezt olvassátok el erős odafigyeléssel!
Azt értem,hogy ez a forráskód miért nem fordul le.Azért mert az i már létezik.Azért létezik mert a ciklusváltozó lokális a saját és az őt tartalmazó blokkra.A kérdésem pedig az,hogy miért van megtiltva az,hogy ez a ciklusváltozó(ami lokális a ciklust tartalmazó blokkra is) ne legyen használható abban a blokkban ami a ciklust tartalmazza?
Értitek ugye?Ha egyszer lokálissá tették a ciklusváltozót nem csak a ciklus blokkjára hanem arra a blokkra is amiben a ciklus benne van,akkor mi értelme volt megtiltani azt,hogy ne lehessen benne használni?Így csak feleslegesen foglalódni fog a veremben.
Az erősen odafigyeljetek részhez kimaradt ez:
using System;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; ++i)
{
Console.WriteLine(i);
}
int j = i; // Lássátok csak használni akarom de nem fordul így le!
Console.ReadKey();
}
}
}
Az első forráskódban int i; volt. Nem fordult le mert i már létezett mert létrehoztuk ezt ciklusváltozóként.
A második forráskód ami ebben a komment-ben van amit most olvasol ez van: int j = i; Ebben csak használni akarom de nem lehet pedig nem csak a ciklusblokkra lokális.
Ez milyen könyv? (Szerző, cím)
Nem vagyok C#ban semennyire jártas, de a legelső kódodnak le kéne fordulnia, hiszen i élettartama megszűnik a for ciklus végén...
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!