Kezdőoldal » Számítástechnika » Programozás » Mi történik mikor két változót...

Mi történik mikor két változót egyenlővé teszek C-ben?

Figyelt kérdés

Írtam egy szám beolvasást ami mindaddig működik amíg nem dolgozok a c változóval, amibe beolvastam az inputot. Nem tudok rájönni miért van így. A választ előre is köszönöm


#include <stdio.h>

#include <stdlib.h>


int main()

{

int m;

int n,c;

m = getchar();

while (m != '\n') {

if ((m >= 48) && (m <= 57)) {

n = m - 48;

} else {return 0;}

c = c*10+n;

m = getchar();

}


printf("%d\n",c);

int i;

i = c;/*ha az értékadást kiveszem jó*/

printf("%d\n",i);

return 0;

}


2018. febr. 14. 09:09
1 2 3
 21/25 anonim ***** válasza:

F#sznak kell ennyit cukrozni a taknyot?!

C++-ban, ha egy lokális változónak nem adsz kézdőértéket, akkor memóriaszemét lesz az értéke.

Innnentől kezdve minden vele végzett számolás "undefined".

2018. febr. 16. 19:10
Hasznos számodra ez a válasz?
 22/25 tabaki ***** válasza:

„Nekem ez a kód ha hiszintek ha nem linux alatt gcc compilerrel tökéletesen lefut, igen azok ellenére, hogy a c-nek nem adtam értéket.”


Ha hiszed, ha nem, nálam is így tett (lásd fentebb), csak éppen az nem derül ki, hogy ugyanott és ugyanazzal lefordítva a sokat emlegetett i = c; értékadás hogyan változtatja meg c értékét, mert szerintem sehogy. Írd be azt a részt is, és futtasd le.


***

„a probléma ott kezdődig ha a c váltózót nem csak kiíratni akarom hanem vizsgálni az értékét vagy kiolvasni változóba. Miért kap a fejéhez hogy akkor mégis szükség volna a kezdőértékre (int c=0;)?”


Nem fér a fejembe, hogy miből vontad le ezt a következtetést. Ahol a hiba látható (nálam Windows alatt), ott édesmindegy, hogy kezdesz-e valamit c-vel, mert már a sima kiíratásnál is mutatja a „helytelen” értéket. Amikor nem jön elő, akkor megint csak közömbös, mert átmásolva sem történik vele semmi.


***

Az mindenesetre legyen egyértelmű: Ha linuxban esetleg tényleg 0 kezdőértéket ad neki a fordító, az legföljebb érdekesség, a C nyelv szabványában nincs benne, tehát mindenképpen tilos inicializálatlanul lógva hagyni.

Amúgy pedig (#15-re visszautalva) javaslom, hogy c értékét közvetlenül a létrehozás után is, még a beolvasás előtt írasd ki. Ne is írj hozzá másik programot, hanem ebbe szúrjál be egy sort:


int main()

{

int m;

int n, c;

printf("%d\n", c);

//stb.


Biztos vagyok benne, hogy amikor a beolvasás után a várt értéket kapod (pl. linuxos gcc), akkor ez az előzetes kiírás 0 lesz, egyébként pedig más -- értelemszerűen a „hibás” értéknek a beírt szám előtti számjegyeinek megfelelő.

2018. febr. 16. 20:39
Hasznos számodra ez a válasz?
 23/25 A kérdező kommentje:
Köszönöm szépen a részletes helybeigazítást ! Ment a zöld kéz
2018. febr. 17. 11:44
 24/25 anonim ***** válasza:

Azt is megteheted, hogy előtte meghívsz egy másik függvényt pár lokális változóval, nem nullával inicializálva, amik szemetet hagynak a stack-ben, és utána hívsz egy inicializálatlan lokális változójú másik függvényt. Elvileg fel fogja rántani a korábban ott hagyott értékeket. (Nem próbáltam ki.)


#include <stdio.h>

#include <stdlib.h>


int f1() {

int a=1;

int b=2;

int c=3;

printf("a:%d b:%d c:%d\n",a,b,c);

}


int f() {

int x;

printf("x: %d\n",x);

}



int main()

{

f1();

f2();

return 0;

}

2018. febr. 18. 17:18
Hasznos számodra ez a válasz?
 25/25 anonim ***** válasza:

elírás:

int f() {

helyett:

int f2() {

2018. febr. 18. 17:20
Hasznos számodra ez a válasz?
1 2 3

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

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!