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.
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));
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.
Ok, kiitos. Muistetaanpa ensikerralla nuo tagit, parempaa otsikkoa en pikkukaljoissani keksinyt. Sorry.
Lisäksi DOUBLE
on joko väärin nimetty tai väärin toteutettu. =)
Niin, tarkoitus on varmaan ollut SQUARE
Aihe on jo aika vanha, joten et voi enää vastata siihen.