Miért kellenek a zárójelek a #define-okhoz?
Figyelt kérdés
A c kódom ami nem megy:
#define width 64
#define height 64
#define new_width width - 2
#define new_height height - 2
#define size_new_width * new_height
int Arr[size_new_width];
Azt írja ki, hogy az Arr arraynak negatív a mérete. Azonban ha a definiált dolgokat zárójelbe teszem ( pl. #define new_width (width - 2) ) minden működik.
2018. jún. 30. 23:06
1/4 anonim válasza:
Mert a szorzas erosebb mint a kivonas:
int Arr[new_width width - 2 * new_height];
2/4 anonim válasza:
Azt kell megérteni, hogy ezek a preprocessor makrók semmi mást nem csinálnak, mint a kódban kicserélik a megadott azonosítót a megadott kóddal, betűre pontosan. Tehát a new_width helyére nem 62 cserélődik be, hanem 64 - 2. És így pl a new_width * 2 az nem 62 * 2 lesz, hanem 64 - 2 * 2. Műveleti sorrend pedig innentől adja magát. Ezért NAGYON fontos megfelelően zárójelezni ezeket a makrókat.
3/4 anonim válasza:
Előzők leírták a lényeget, csak annyit még, hogy a #define sorokat nem látja a fordító, azokat az előfordító (preprocessor) cseréli le sztringként. Tehát ő nem fogja kiszámolni a kifejezéseket, nem is érdekli, hogy az egy szám-e, ő sima szöveges fájlnak tekinti a forráskódot, és szövegként cseréli mindenütt a megadott sztringre a szimbólumot. A kiértékelést csak ezután végzi a fordító.
4/4 anonim válasza:
Ez nincs elírva? Mi a szimbólum és mi a helyettesítő sztring?
#define size_new_width * new_height
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!
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!