Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C:n makrossa outo laskuvirhe

lepakkomies [15.01.2011 22:11:15]

#

Aloittelijan kysymys:
Seuraavassa ohjelmassa luodaan vakiomakrot CUBE ja DOUBLE.
Tällaisenaan ohjelma tulostaa y:n arvoksi kymmenen, koska y = CUBE( x + 1 ); -rivilla x+1 tarvitsisi vielä yhdet sulut. Kysymys kuuluu: miksi x*x*x muuttuu ilmeisesti x+x+x muotoon?

#include <stdio.h>
#define CUBE(x) x*x*x
#define DOUBLE(x) x*x

int main(){
int x=3, y, z;
y = CUBE( x + 1 );
z = 5 * DOUBLE( x );
printf("x=%d, y=%d, z=%d\n", x, y, z);


return 0;
}

Mod. lisäsi kooditagit ja vaihtoi järkevän otsikon.

Metabolix [15.01.2011 22:20:02]

#

Mikä ihme siinä on, ettei noita keskustelun ohjeita voi lukea, että koodista saisi jotain selvää? Sitä paitsi opassivulta löytyy niinkin yllättävä asia kuin opas C:n esikääntäjästä, ja kyseisessä oppaassa on suora vastaus kysymykseesi.

#define VAARIN(x) x * x * x
VAARIN(x + 1) == x + 1 * x + 1 * x + 1;

#define OIKEIN(x) ((x) * (x) * (x))
OIKEIN(x + 1) == ((x + 1) * (x + 1) * (x + 1));

tgunner [15.01.2011 22:21:52]

#

CUBE(x + 1) muuttuu muotoon x + 1 * x + 1 * x + 1 eli tässä tapauksessa 3 + 1 * 3 + 1 * 3 + 1 = 3 + 3 + 3 + 1 = 10. Kääntäjä ei ymmärrä välittää sulkuja valmiiksi, joten se korvaa x:n x + 1:llä suoraan, mistä seuraa virheellinen tulos.

lepakkomies [15.01.2011 22:31:14]

#

Ok, kiitos. Muistetaanpa ensikerralla nuo tagit, parempaa otsikkoa en pikkukaljoissani keksinyt. Sorry.

jlaire [16.01.2011 13:36:13]

#

Lisäksi DOUBLE on joko väärin nimetty tai väärin toteutettu. =)

Grez [17.01.2011 00:29:11]

#

Niin, tarkoitus on varmaan ollut SQUARE

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta