Kezdőoldal » Számítástechnika » Hardverek » Mi értelme van annak, hogy c#...

Mi értelme van annak, hogy c# ban egy for-ciklusban deklarált, definiált változó lokális a ciklust tartalmazó blokkra?

Figyelt kérdés

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?


2014. okt. 21. 00:51
1 2 3
 1/21 A kérdező kommentje:
Fenébe tegye valaki át a programozás kategóriába!
2014. okt. 21. 00:52
 2/21 anonim ***** válasza:

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.

}

2014. okt. 21. 00:58
Hasznos számodra ez a válasz?
 3/21 anonim ***** válasza:

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!

2014. okt. 21. 01:02
Hasznos számodra ez a válasz?
 4/21 anonim ***** válasza:

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! :))

2014. okt. 21. 01:04
Hasznos számodra ez a válasz?
 5/21 A kérdező kommentje:

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

2014. okt. 21. 01:10
 6/21 anonim ***** válasza:

/* 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 */

}

2014. okt. 21. 01:35
Hasznos számodra ez a válasz?
 7/21 anonim ***** válasza:

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

2014. okt. 21. 01:47
Hasznos számodra ez a válasz?
 8/21 A kérdező kommentje:

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.

2014. okt. 21. 03:00
 9/21 A kérdező kommentje:

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.

2014. okt. 21. 03:06
 10/21 anonim ***** válasza:

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

2014. okt. 21. 07:09
Hasznos számodra ez a válasz?
1 2 3

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!