ßçûê Ñè - ðóêîâîäñòâî äëÿ íà÷èíàþùèõ.
11. Ïðåïðîöåññîð ÿçûêà Ñè.
ÄÈÐÅÊÒÈÂÛ ÏÐÅÏÐÎÖÅÑÑÎÐÀ ÑÈÌÂÎËÜÍÛÅ ÊÎÍÑÒÀÍÒÛ ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈß È "ÌÀÊÐÎÔÓÍÊÖÈÈ" ÏÎÁÎ×ÍÛÅ ÝÔÔÅÊÒÛ ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈÈ ÂÊËÞ×ÅÍÈÅ ÔÀÉËΠÓÑËÎÂÍÀß ÊÎÌÏÈËßÖÈß.
ÄÈÐÅÊÒÈÂÛ ÏÐÅÏÐÎÖÅÑÑÎÐÀ #define, #include, #undef, #if, #ifdef, #ifndef, #else, #endif.
ßçûê Ñè áûë ðàçðàáîòàí â ïîìîùü ðàáîòàþùèì ïðîãðàììèñòàì, à èì íðàâèòñÿ åãî ïðåïðîöåññîð. Ýòîò ïîëåçíûé ïîìîùíèê ïðîñìàòðèâàåò ïðîãðàììó äî êîìïèëÿòîðà (îòñþäà è òåðìèí "ïðåïðîöåññîð") è çàìåíÿåò ñèìâîëè÷åñêèå àááðåâèàòóðû â ïðîãðàììå íà ñîîòâåòñòâóþùèå äèðåêòèâû. Îí îòûñêèâàåò äðóãèå ôàéëû, íåîáõîäèìûå âàì, è ìîæåò òàêæå èçìåíèòü óñëîâèÿ êîìïèëÿöèè. Îäíàêî ýòè ñëîâà íå îòðàæàþò èñòèííóþ ïîëüçó è çíà÷åíèå ïðåïðîöåññîðà, ïîýòîìó îáðàòèìñÿ ê ïðèìåðàì. Êîíå÷íî, äî ñèõ ïîð ìû ñíàáæàëè âñå ïðèìåðû äèðåêòèâàìè #define è #include, íî òåïåðü ìû ìîæåì ïîäûòîæèòü âñå, ÷òî èçó÷èëè, è ðàçâèòü òåìó äàëüøå.
ÑÈÌÂÎËÈ×ÅÑÊÈÅ ÊÎÍÑÒÀÍÒÛ: #define.
Äèðåêòèâà #define, ïîäîáíî âñåì äèðåêòèâàì ïðåïðîöåññîðà, íà÷èíàåòñÿ ñ ñèìâîëà # â ñàìîé ëåâîé ïîçèöèè. Îíà ìîæåò ïîÿâèòüñÿ â ëþáîì ìåñòå èñõîäíîãî ôàéëà, à äàâàåìîå åþ îïðåäåëåíèå èìååò ñèëó îò ìåñòà ïîÿâëåíèÿ äî êîíöà ôàéëà. Ìû àêòèâíî èñïîëüçóåì ýòó äèðåêòèâó äëÿ îïðåäåëåíèÿ ñèìâîëè÷åñêèõ êîíñòàíò â íàøèõ ïðîãðàììàõ, îäíàêî îíà èìååò áîëåå øèðîêîå ïðèìåíåíèå; ÷òî ìû è ïîêàæåì äàëüøå. Âîò ïðèìåð, èëëþñòðèðóþùèé íåêîòîðûå âîçìîæíîñòè è ñâîéñòâà äèðåêòèâû #define:
/* ïðîñòûå ïðèìåðû äèðåêòèâû ïðåïðîöåññîðà */
#define TWO 2 /* ïî æåëàíèþ ìîæíî èñïîëüçîâàòü êîììåíòàðèè */
#define MSG "Ñòàðûé ñåðûé êîò ïîåò âåñåëóþ ïåñíþ.".
/* îáðàòíàÿ êîñàÿ ÷åðòà ïðîäîëæàåò îïðåäåëåíèå íà ñëåäóþùóþ ñòðîêó */
#define FOUR TWO *TWO.
#define PX printf("X ðàâåí %d.\n", x).
#define FMT "X ðàâåí %d.\n".
Main( ).
{
Int x = TWO;
PX;
X = FOUR;
Printf(FMT, x);
Printf( "%s\n", MSG);
Printf("FTWO: MSG\n");
}
Êàæäàÿ ñòðîêà ñîñòîèò èç òðåõ ÷àñòåé. Ïåðâîé ñòîèò äèðåêòèâà #define. Äàëåå èäåò âûáðàííàÿ íàìè àááðåâèàòóðà, èçâåñòíàÿ ó ïðîãðàììèñòîâ êàê "ìàêðîîïðåäåëåíèå". Ìàêðîîïðåäåëåíèå íå äîëæíî ñîäåðæàòü âíóòðè ñåáÿ ïðîáåëû. È íàêîíåö, èäåò ñòðîêà (íàçûâàåìàÿ "ñòðîêîé çàìåùåíèÿ"), êîòîðóþ ïðåäñòàâëÿåò ìàêðîîïðåäåëåíèå. Êîãäà ïðåïðîöåññîð íàõîäèò â ïðîãðàììå îäíî èç âàøèõ ìàêðîîïðåäåëåíèé, îí ïî÷òè âñåãäà çàìåíÿåò åãî ñòðîêîé çàìåùåíèÿ. (Åñòü îäíî èñêëþ÷åíèå, êîòîðîå ìû âàì ñåé÷àñ ïîêàæåì.) Ýòîò ïðîöåññ ïðîõîæäåíèÿ îò ìàêðîîïðåäåëåíèÿ äî çàêëþ÷èòåëüíîé ñòðîêè çàìåùåíèÿ íàçûâàåòñÿ "ìàêðîðàñøèðåíèåì". Çàìåòèì, ÷òî ïðè ñòàíäàðòíîé ôîðìå çàïèñè íà ÿçûêå Ñè ìîæíî âñòàâëÿòü êîììåíòàðèè; îíè áóäóò èãíîðèðîâàòüñÿ ïðåïðîöåññîðîì. Êðîìå òîãî, áîëüøèíñòâî ñèñòåì ðàçðåøàåò èñïîëüçîâàòü îáðàòíóþ êîñóþ ÷åðòó ('\') äëÿ ðàñøèðåíèÿ îïðåäåëåíèÿ áîëåå ÷åì íà îäíó ñòðîêó.
"Çàïóñòèì" íàø ïðèìåð, è ïîñìîòðèì çà åãî âûïîëíåíèåì.
Õ ðàâåí 2.
Õ ðàâåí 4.
Ñòàðûé ñåðûé êîò ïîåò âåñåëóþ ïåñíþ. TWO: MSG.
Âîò ÷òî ïðîèçîøëî. Îïåðàòîð int x = TWO; ïðåâðàùàåòñÿ â int x = 2;.

ÐÈÑ. 11.1. ×àñòè ìàêðîîïðåäåëåíèÿ.
Ò. å. ñëîâî TWO çàìåíèëîñü öèôðîé 2. Çàòåì îïåðàòîð ÐÕ; ïðåâðàùàåòñÿ â printf("X ðàâíî %d. \n", õ); ïîñêîëüêó ñäåëàíà ïîëíàÿ çàìåíà. Ýòî íîâøåñòâî, òàê êàê äî ñèõ ïîð ìû èñïîëüçîâàëè ìàêðîîïðåäåëåíèÿ òîëüêî äëÿ ïðåäñòàâëåíèÿ êîíñòàíò. Òåïåðü æå ìû âèäèì, ÷òî ìàêðîîïðåäåëåíèå ìîæåò ïðåäñòàâëÿòü ëþáóþ ñòðîêó, äàæå öåëîå âûðàæåíèå íà ÿçûêå Ñè. Çàìåòèì, îäíàêî, ÷òî ýòî êîíñòàíòíàÿ ñòðîêà; ÐÕ íàïå÷àòàåò òîëüêî ïåðåìåííóþ, íàçâàííóþ x.
Ñëåäóþùàÿ ñòðîêà òàêæå ïðåäñòàâëÿåò ÷òî-òî íîâîå. Âû ìîæåòå ïîäóìàòü, ÷òî FOUR çàìåíÿåòñÿ íà 4, íî íà ñàìîì äåëå âûïîëíÿåòñÿ ñëåäóþùåå:
Õ = FOUR;
Ïðåâðàùàåòñÿ â õ = TWO *TWO; ïðåâðàùàåòñÿ â õ = 2*2; è íà ýòîì âñå çàêàí÷èâàåòñÿ. Ôàêòè÷åñêîå óìíîæåíèå èìååò ìåñòî íå âî âðåìÿ ðàáîòû ïðåïðîöåññîðà è íå ïðè êîìïèëÿöèè, à âñåãäà áåç èñêëþ÷åíèÿ ïðè ðàáîòå ïðîãðàììû. Ïðåïðîöåññîð íå âûïîëíÿåò âû÷èñëåíèé; îí òîëüêî î÷åíü òî÷íî äåëàåò ïðåäëîæåííûå ïîäñòàíîâêè.
Çàìåòèì, ÷òî ìàêðîîïðåäåëåíèå ìîæåò âêëþ÷àòü äðóãèå îïðåäåëåíèÿ. (Íåêîòîðûå êîìïèëÿòîðû íå ïîääåðæèâàþò ýòî ñâîéñòâî "âëîæåíèÿ".).
 ñëåäóþùåé ñòðîêå printf(FMT, õ); ïðåâðàùàåòñÿ â printf(" Õ ðàâíî %d.\n", õ) êîãäà FMT çàìåíÿåòñÿ ñîîòâåòñòâóþùåé ñòðîêîé. Ýòîò ïîäõîä ìîæåò îêàçàòüñÿ î÷åíü óäîáíûì, åñëè ó âàñ åñòü äëèííàÿ ñòðîêà, êîòîðóþ âû èñïîëüçóåòå íåñêîëüêî ðàç.
 ñëåäóþùåé ñòðîêå ïðîãðàììû MSG çàìåíÿåòñÿ ñîîòâåòñòâóþùåé ñòðîêîé. Êàâû÷êè äåëàþò çàìåùàþùóþ ñòðîêó êîíñòàíòîé ñèìâîëüíîé ñòðîêè; ïîñêîëüêó ïðîãðàììà ïîëó÷àåò åå ñîäåðæèìîå, ýòà ñòðîêà áóäåò çàïîìèíàòüñÿ â ìàññèâå, çàêàí÷èâàþùåìñÿ íóëü-ñèìâîëîì. Òàê, #define HAL 'Z' îïðåäåëÿåò ñèìâîëüíóþ êîíñòàíòó, à #define ÍÀÐ "Z" îïðåäåëÿåò ñèìâîëüíóþ ñòðîêó: Z\0.
Îáû÷íî ïðåïðîöåññîð, âñòðå÷àÿ îäíî èç âàøèõ ìàêðîîïðåäåëåíèé â ïðîãðàììå, î÷åíü òî÷íî çàìåíÿåò èõ ýêâèâàëåíòíîé ñòðîêîé çàìåùåíèÿ. Åñëè ýòà ñòðîêà òàêæå ñîäåðæèò ìàêðîîïðåäåëåíèÿ, îíè òîæå çàìåøàþòñÿ. Åäèíñòâåííûì èñêëþ÷åíèåì ïðè çàìåíå ÿâëÿåòñÿ ìàêðîîïðåäåëåíèå, íàõîäÿùååñÿ âíóòðè äâîéíûõ êàâû÷åê. Ïîýòîìó printf("TWO: MSG"); ïå÷àòàåò áóêâàëüíî TWO: MSG âìåñòî ïå÷àòè ñëåäóþùåé ñòðîêè:
2: "Ñòàðûé ñåðûé êîò ïîåò âåñåëóþ ïåñíþ.".
Åñëè âàì íóæíî íàïå÷àòàòü ýòó ñòðîêó, ìîæíî èñïîëüçîâàòü îïåðàòîð.
Printf("%d: %s\n", TWO, MSG);
Ïîòîìó ÷òî çäåñü ìàêðîîïðåäåëåíèÿ íàõîäÿòñÿ âíå êàâû÷åê.
Êîãäà ñëåäóåò èñïîëüçîâàòü ñèìâîëè÷åñêèå êîíñòàíòû? Âåðîÿòíî, âû äîëæíû ïðèìåíÿòü èõ äëÿ áîëüøèíñòâà ÷èñåë. Åñëè ÷èñëî ÿâëÿåòñÿ êîíñòàíòîé, èñïîëüçóåìîé â âû÷èñëåíèÿõ, òî ñèìâîëè÷åñêîå èìÿ äåëàåò ÿñíåå åå ñìûñë. Åñëè ÷èñëî - ðàçìåð ìàññèâà, òî ñèìâîëè÷åñêîå èìÿ óïðîùàåò èçìåíåíèå âàøåé ïðîãðàììû ïðè ðàáîòå ñ áîëüøèì ìàññèâîì. Åñëè ÷èñëî ÿâëÿåòñÿ ñèñòåìíûì êîäîì, ñêàæåì äëÿ ñèìâîëà EOF, òî ñèìâîëè÷åñêîå ïðåäñòàâëåíèå äåëàåò âàøó ïðîãðàììó áîëåå ïåðåíîñèìîé; èçìåíÿåòñÿ òîëüêî îïðåäåëåíèå EOF. Ìíåìîíè÷åñêîå çíà÷åíèå, ëåãêîñòü èçìåíåíèÿ, ïåðåíîñèìîñòü: âñå ýòî äåëàåò ñèìâîëè÷åñêèå êîíñòàíòû çàñëóæèâàþùèìè âíèìàíèÿ. Ëåãêî ëè ýòîãî äîñòè÷ü? Ðèñêíåì è ðàññìîòðèì ïðîñòóþ ôóíêöèþ, ò. å. ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÀÐÃÓÌÅÍÒÎÂ Ñ #define.
Ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè î÷åíü ïîõîæå íà ôóíêöèþ, ïîñêîëüêó àðãóìåíòû åãî çàêëþ÷åíû â ñêîáêè. Íèæå ïðèâåäåíî íåñêîëüêî ïðèìåðîâ, èëëþñòðèðóþùèõ, êàê îïðåäåëÿåòñÿ è èñïîëüçóåòñÿ òàêàÿ "ìàêðîôóíêöèÿ".  íåêîòîðûõ ïðèìåðàõ ê òîìó æå óêàçàíû âîçìîæíûå ëîâóøêè, ïîýòîìó ÷èòàéòå èõ âíèìàòåëüíî.

/* ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè */
#define SQUARE (õ) õ*õ.
#define PR(x) printf("x ðàâåí %d.\n" ,x).
Main( ).
{
Int x = 4;
Int z;
Z = SQUARE(x);
PR(z);
Z = SQUARE(2);
PR(z);
PR(SQUARE(x));
PR(SQUARE(x + 2));
PR(100/SQUARE(2));
PR(SQUAREC(++x));
}
Âñþäó, ãäå â âàøåé ïðîãðàììå ïîÿâëÿåòñÿ ìàêðîîïðåäåëåíèå SQUARE(x), îíî çàìåíÿåòñÿ íà õ*õ.  îòëè÷èå îò íàøèõ ïðåæíèõ ïðèìåðîâ ïðè èñïîëüçîâàíèè ýòîãî ìàêðîîïðåäåëåíèÿ ìû ìîæåì ñîâåðøåííî ñâîáîäíî ïðèìåíÿòü ñèìâîëû, îòëè÷íûå îò x.  ìàêðîîïðåäåëåíèè 'x' çàìåùàåòñÿ ñèìâîëîì, èñïîëüçîâàííûì â ìàêðîâûçîâå ïðîãðàììû. Ïîýòîìó ìàêðîîïðåäåëåíèå SQUARE(2) çàìåùàåòñÿ íà 2*2. Òàêèì îáðàçîì, x íà ñàìîì äåëå äåéñòâóåò êàê àðãóìåíò. Îäíàêî, êàê âû âñêîðå óâèäèòå, àðãóìåíò ìàêðîîïðåäåëåíèÿ íå "ðàáîòàåò" òî÷íî òàê æå, êàê àðãóìåíò ôóíêöèè. Âîò ðåçóëüòàòû âûïîëíåíèÿ ïðîãðàììû. Îáðàòèòå âíèìàíèå, ÷òî íåêîòîðûå îòâåòû îòëè÷àþòñÿ îò òåõ, êîòîðûå âû ìîãëè áû îæèäàòü.
Z ðàâíî 16.
Z ðàâíî 4.
SQUARE(x) ðàâíî 16.
SQUARE(x + 2) ðàâíî 14.
100/SQUARE(2) ðàâíî 100.
SQUAREC(++ x) ðàâíî 30.
Ïåðâûå äâå ñòðîêè ïðåäñêàçóåìû. Çàìåòèì, îäíàêî, ÷òî äàæå âíóòðè äâîéíûõ êàâû÷åê â îïðåäåëåíèè PR ïåðåìåííàÿ çàìåùàåòñÿ ñîîòâåòñòâóþùèì àðãóìåíòîì. Âñå àðãóìåíòû â ýòîì îïðåäåëåíèè çàìåùàþòñÿ.
Òðåòüÿ ñòðîêà ïðåäñòàâëÿåò èíòåðåñ:
PR(SQUARE(x));
Îíà ñòàíîâèòñÿ ñëåäóþùåé ñòðîêîé:
Printf("SQUARE(x) ðàâíî %d.\n", SQUARE(x));
Ïîñëå ïåðâîãî ýòàïà ìàêðîðàñøèðåíèÿ. Âòîðîå SQUARE(x) ðàñøèðÿåòñÿ, ïðåâðàùàÿñü â õ*õ, à ïåðâîå îñòàåòñÿ áåç èçìåíåíèÿ, ïîòîìó ÷òî òåïåðü îíî íàõîäèòñÿ âíóòðè äâîéíûõ êàâû÷åê â îïåðàòîðå ïðîãðàììû, è òàêèì îáðàçîì çàùèùåíî îò äàëüíåéøåãî ðàñøèðåíèÿ. Îêîí÷àòåëüíî ñòðîêà ïðîãðàììû ñîäåðæèò.
Printf(" SQUARE(x) ðàâíî %d.\n", x*x);
È âûâîäèò íà ïå÷àòü.
SQUARE(x) ðàâíî 16.
Ïðè ðàáîòå ïðîãðàììû.
Äàâàéòå åùå ðàç ïðîâåðèì òî, ÷òî çàêëþ÷åíî â äâîéíûå êàâû÷êè. Åñëè âàøå ìàêðîîïðåäåëåíèå âêëþ÷àåò àðãóìåíò ñ äâîéíûìè êàâû÷êàìè, òî àðãóìåíò áóäåò çàìåùàòüñÿ ñòðîêîé èç ìàêðîâûçîâà. Íî ïîñëå ýòîãî îí â äàëüíåéøåì íå ðàñøèðÿåòñÿ, äàæå åñëè ñòðîêà ÿâëÿåòñÿ åùå îäíèì ìàêðîîïðåäåëåíèåì.  íàøåì ïðèìåðå ïåðåìåííàÿ õ ñòàëà ìàêðîîïðåäåëåíèåì SQUARE(x) è îñòàëàñü èì.
Òåïåðü ìû äîáðàëèñü äî íåñêîëüêî ñïåöèôè÷åñêèõ ðåçóëüòàòîâ. Âñïîìíèì, ÷òî õ èìååò çíà÷åíèå b. Ýòî ïîçâîëÿåò ïðåäïîëîæèòü, ÷òî SQUARE(x + 2) áóäåò ðàâíî 6*6 èëè 36. Íî íàïå÷àòàííûé ðåçóëüòàò ãîâîðèò, ÷òî ïîëó÷àåòñÿ ÷èñëî 14, êîòîðîå, íåñîìíåííî, íèêàê íå ïîõîæå íà êâàäðàò öåëîãî ÷èñëà! Ïðè÷èíà òàêîãî ââîäÿùåãî â çàáëóæäåíèå ðåçóëüòàòà ïðîñòà, è ìû óæå îá ýòîì ãîâîðèëè: ïðåïðîöåññîð íå äåëàåò âû÷èñëåíèé, îí òîëüêî çàìåùàåò ñòðîêó. Âñþäó, ãäå íàøå îïðåäåëåíèå óêàçûâàåò íà õ, ïðåïðîöåññîð ïîäñòàâèò ñòðîêó õ + 2. Òàêèì îáðàçîì, õ*õ ñòàíîâèòñÿ õ + 2*õ + 2.
Åäèíñòâåííîå óìíîæåíèå çäåñü 2*x. Åñëè x ðàâíî 4, òî ïîëó÷àåòñÿ ñëåäóþùåå çíà÷åíèå ýòîãî âûðàæåíèÿ:
4+2*4+2=4+8+2= 14.
Ýòîò ïðèìåð òî÷íî ïîêàçûâàåò î÷åíü âàæíîå îòëè÷èå ìåæäó âûçîâîì ôóíêöèè è ìàêðîâûçîâîì. Âûçîâ ôóíêöèè ïåðåäàåò çíà÷åíèå àðãóìåíòà â ôóíêöèþ âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû. Ìàêðîâûçîâ ïåðåäàåò ñòðîêó àðãóìåíòîâ â ïðîãðàììó äî åå êîìïèëÿöèè; ýòî äðóãîé ïðîöåññ, ïðîèñõîäÿùèé â äðóãîå âðåìÿ.
Ìîæíî ëè âàøå îïðåäåëåíèå ïåðåäåëàòü òàê, ÷òîáû SQUARE(x + 2) áûëî ðàâíî 36? Êîíå÷íî. Íàì ïðîñòî íóæíî áîëüøå ñêîáîê:
#define SQUARE(x) (x)*(x).
Òîãäà SQUARE(x + 2) ñòàíîâèòñÿ (õ + 2)*(õ + 2), è ìû ïîëó÷àåì íàøå æåëàííîå óìíîæåíèå, òàê êàê ïåðåíåñëè ñêîáêè â ñòðîêó çàìåùåíèÿ.
Îäíàêî ýòî íå ðåøàåò âñåõ íàøèõ ïðîáëåì. Ðàññìîòðèì ñëó÷àè, êîòîðûå ïðèâîäÿò ê ñëåäóþùåé ñòðîêå íà âûõîäå: 100/SQUARE(2) ïðåâðàùàåòñÿ â 100/2*2 .
Âû÷èñëåíèÿ ñëåäóåò âåñòè ñëåâà íàïðàâî, ò. å. (100/2)*2 èëè 50*2 èëè 100.
Ýòó ïóòàíèöó ìîæíî èñïðàâèòü, îïðåäåëèâ SQUARE(x) ñëåäóþùèì îáðàçîì:
#define SQUARE(x) (x*x).
Ýòî äàñò 100/(2 *2), ÷òî â êîíå÷íîì ñ÷åòå ýêâèâàëåíòíî 100/4 èëè 25.
×òîáû âûïîëíèòü äâà ïîñëåäíèõ ïðèìåðà, íàì íåîáõîäèìî îïðåäåëåíèå.
#define SQUARE(x) ((x)*(x)).
Ýòî óðîê èñïîëüçîâàíèÿ íåîáõîäèìîãî êîëè÷åñòâà ñêîáîê äëÿ ãàðàíòèè, ÷òî îïåðàöèè è ñîåäèíåíèÿ âûïîëíÿþòñÿ â ïðàâèëüíîì ïîðÿäêå.
Äàæå ýòè ïðåäîñòîðîæíîñòè íå ñïàñàþò ïîñëåäíèé ïðèìåð îò áåäû: SQUARE(++ õ) ïðåâðàùàåòñÿ â ++õ * ++õ è x óâåëè÷èâàåòñÿ äâàæäû - îäèí ðàç äî óìíîæåíèÿ è îäèí ðàç ïîñëå: ++õ * ++õ = 5*6 = 30.
(Òàê êàê ïîðÿäîê âûïîëíåíèÿ îïåðàöèé íå óñòàíîâëåí, òî íåêîòîðûå êîìïèëÿòîðû ïðåâðàòÿò ýòî â 6*5, íî êîíå÷íûé ðåçóëüòàò áóäåò òåì æå ñàìûì.).
Åäèíñòâåííîå ëåêàðñòâî â ýòîì ñëó÷àå - íå èñïîëüçîâàòü ++õ â êà÷åñòâå àðãóìåíòà äëÿ ìàêðîîïðåäåëåíèÿ. Çàìåòèì, ÷òî ++õ îáû÷íî ðàáîòàåò êàê àðãóìåíò ôóíêöèè, òàê êàê åìó ïðèñâàèâàåòñÿ çíà÷åíèå 5, è çàòåì ýòî çíà÷åíèå 5 ïåðåäàåòñÿ ôóíêöèè.
ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈÅ ÈËÈ ÔÓÍÊÖÈß?
Ìíîãèå çàäà÷è ìîæíî ðåøàòü, èñïîëüçóÿ ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè èëè ôóíêöèþ. ×òî èç íèõ ñëåäóåò ïðèìåíÿòü íàì? Íà ýòîò ñ÷åò íåò ñòðîãèõ ïðàâèë, íî åñòü íåêîòîðûå ñîîáðàæåíèÿ.
Ìàêðîîïðåäåëåíèÿ äîëæíû èñïîëüçîâàòüñÿ ñêîðåå êàê õèòðîñòè, à íå êàê îáû÷íûå ôóíêöèè: îíè ìîãóò èìåòü íåæåëàòåëüíûå ïîáî÷íûå ýôôåêòû, åñëè âû áóäåòå íåîñòîðîæíû. Íåêîòîðûå êîìïèëÿòîðû îãðàíè÷èâàþò ìàêðîîïðåäåëåíèÿ îäíîé ñòðîêîé, è, ïî-âèäèìîìó, ëó÷øå ñîáëþäàòü òàêîå îãðàíè÷åíèå, äàæå åñëè âàø êîìïèëÿòîð ýòîãî íå äåëàåò.
Âûáîð ìàêðîîïðåäåëåíèÿ ïðèâîäèò ê óâåëè÷åíèþ îáúåìà ïàìÿòè, à âûáîð ôóíêöèè - ê óâåëè÷åíèþ âðåìåíè ðàáîòû ïðîãðàììû. Òàê ÷òî äóìàéòå, ÷òî âûáðàòü! Ìàêðîîïðåäåëåíèå ñîçäàåò "ñòðî÷íûé" êîä, ò. å. âû ïîëó÷àåòå îïåðàòîð â ïðîãðàììå. Åñëè ìàêðîîïðåäåëåíèå ïðèìåíèòü 20 ðàç, òî â âàøó ïðîãðàììó âñòàâèòñÿ 20 ñòðîê êîäà. Åñëè âû èñïîëüçóåòå ôóíêöèþ 20 ðàç, ó âàñ áóäåò òîëüêî îäíà êîïèÿ îïåðàòîðîâ ôóíêöèè, ïîýòîìó ïîëó÷àåòñÿ ìåíüøèé îáúåì ïàìÿòè. Îäíàêî óïðàâëåíèå ïðîãðàììîé ñëåäóåò ïåðåäàòü òóäà, ãäå íàõîäèòñÿ ôóíêöèÿ, à çàòåì âåðíóòüñÿ â âûçûâàþùóþ ïðîãðàììó, à íà ýòî ïîòðåáóåòñÿ áîëüøå âðåìåíè, ÷åì ïðè ðàáîòå ñî "ñòðî÷íûìè" êîäàìè.
Ïðåèìóùåñòâî ìàêðîîïðåäåëåíèé çàêëþ÷àåòñÿ â òîì, ÷òî ïðè èõ èñïîëüçîâàíèè âàì íå íóæíî áåñïîêîèòüñÿ î òèïàõ ïåðåìåííûõ (ìàêðîîïðåäåëåíèÿ èìåþò äåëî ñ ñèìâîëüíûìè ñòðîêàìè, à íå ñ ôàêòè÷åñêèìè çíà÷åíèÿìè). Òàê íàøå ìàêðîîïðåäåëåíèå SQUARE(x) ìîæíî èñïîëüçîâàòü îäèíàêîâî õîðîøî ñ ïåðåìåííûìè òèïà int èëè float.
Îáû÷íî ïðîãðàììèñòû èñïîëüçóþò ìàêðîîïðåäåëåíèÿ äëÿ ïðîñòûõ äåéñòâèè, ïîäîáíûõ ñëåäóþùèì:
#define MAX(X,Y) ( (X) > (Y) ? (X) : (Y)).
#define ABS(X) ( (X) < 0 ? -(X) : (X)).
#define ISSIGN(X) ( (X) == '+' || (X) == '-' ? 1 : 0).
(Ïîñëåäíåå ìàêðîîïðåäåëåíèå èìååò çíà÷åíèå 1 (èñòèííî), åñëè X ÿâëÿåòñÿ ñèìâîëîì àëãåáðàè÷åñêîãî çíàêà.) Îòìåòèì ñëåäóþùèå ìîìåíòû:
1.  ìàêðîîïðåäåëåíèè íåò ïðîáåëîâ, íî îíè ìîãóò ïîÿâèòüñÿ â çàìåùàþùåé ñòðîêå. Ïðåïðîöåññîð "ïîëàãàåò", ÷òî ìàêðîîïðåäåëåíèå çàêàí÷èâàåòñÿ íà ïåðâîì ïðîáåëå, ïîýòîìó âñå, ÷òî ñòîèò ïîñëå ïðîáåëà, îñòàåòñÿ â çàìåùàþùåé ñòðîêå.
ÐÈÑ. 11.2. Îøèáî÷íûé ïðîáåë è ìàêðîîïðåäåëåíèè.
2. Èñïîëüçóéòå êðóãëûå ñêîáêè äëÿ êàæäîãî àðãóìåíòà è âñåãî îïðåäåëåíèÿ. Ýòî ÿâëÿåòñÿ ãàðàíòèåé òîãî, ÷òî ýëåìåíòû áóäóò ñãðóïïèðîâàíû íàäëåæàùèì îáðàçîì â âûðàæåíèè, ïîäîáíîì forks = 2*MAX(guests + 3, last);
3. Äëÿ èìåí ìàêðîôóíêöèé ñëåäóåò èñïîëüçîâàòü ïðîïèñíûå áóêâû. Ýòî ñîãëàøåíèå íå ðàñïðîñòðàíÿåòñÿ òàê øèðîêî, êàê ñîãëàøåíèå îá èñïîëüçîâàíèè ïðîïèñíûõ áóêâ äëÿ ìàêðîêîíñòàíò. Ïðèìåíåíèå èõ ïðåäîñòåðåæåò âàñ îò âîçìîæíûõ ïîáî÷íûõ ýôôåêòîâ ìàêðîîïðåäåëåíèé.
Ïðåäïîëîæèì, ÷òî âû ðàçðàáîòàëè íåñêîëüêî ìàêðîôóíêöèé ïî ñâîåìó óñìîòðåíèþ. Äîëæíû ëè âû èõ ïåðåîïðåäåëÿòü êàæäûé ðàç, êîãäà ïèøåòå íîâóþ ïðîãðàììó? Íåò, åñëè âû âñïîìíèòå î äèðåêòèâå #include. Òåïåðü ðàññìîòðèì åå.
ÂÊËÞ×ÅÍÈÅ ÔÀÉËÀ: #include.
Êîãäà ïðåïðîöåññîð "ðàñïîçíàåò" äèðåêòèâó #include, îí èùåò ñëåäóþùåå çà íåé èìÿ ôàéëà è âêëþ÷àåò åãî â òåêóùèé ôàéë. Äèðåêòèâà âûäàåòñÿ â äâóõ âèäàõ:
#include <stdio.h> èìÿ ôàéëà â óãëîâûõ ñêîáêàõ.
#include "mystuff.h" èìÿ ôàéëà â äâîéíûõ êàâû÷êàõ.
 îïåðàöèîííîé ñèñòåìå UNIX óãëîâûå ñêîáêè ñîîáùàþò ïðåïðîöåññîðó, ÷òî ôàéë ñëåäóåò èñêàòü â îäíîì èëè íåñêîëüêèõ ñòàíäàðòíûõ ñèñòåìíûõ êàòàëîãàõ. Êàâû÷êè ãîâîðÿò åìó, ÷òî ñíà÷àëà íóæíî ñìîòðåòü â âàøåì êàòàëîãå (èëè â êàêîì-òî äðóãîì, åñëè âû îïðåäåëÿåòå åãî èìåíåì ôàéëà), à çàòåì èñêàòü â "ñòàíäàðòíûõ" ìåñòàõ.
#include <stdio.h> èùåò â ñèñòåìíîì êàòàëîãå.
#include "hot.h" èùåò â âàøåì òåêóùåì ðàáî÷åì êàòàëîãå.
#include "/usr/biif/p.h" èùåò â êàòàëîãå /usr/biff.
 òèïè÷íîé ìèêðîïðîöåññîðíîé ñèñòåìå ýòè äâå ôîðìû ÿâëÿþòñÿ ñèíîíèìàìè, è ïðåïðîöåññîð âåäåò ïîèñê íà óêàçàííîì äèñêå.
#include "stdio.h" èùåò íà ñòàíäàðòíîì äèñêå.
#include <stdio.h> èùåò íà ñòàíäàðòíîì äèñêå.
#include "a : stdio.h" èùåò íà äèñêå à.
Çà÷åì âêëþ÷àþò ôàéëû? Ïîòîìó ÷òî îíè íåñóò íóæíóþ âàì èíôîðìàöèþ. Ôàéë stdio.h, íàïðèìåð, îáû÷íî ñîäåðæèò îïðåäåëåíèÿ EOF, getchar( ) è putchar( ). Äâå ïîñëåäíèå Ôóíêöèè îïðåäåëåíû êàê ìàêðîôóíêöèè.
Ïî ñîãëàøåíèþ ñóôôèêñ .h èñïîëüçóåòñÿ äëÿ "çàãîëîâî÷íûõ" ôàéëîâ, ò. å. ôàéëîâ ñ èíôîðìàöèåé, êîòîðàÿ ðàñïîëàãàåòñÿ â íà÷àëå âàøåé ïðîãðàììû. Çàãîëîâî÷íûå ôàéëû îáû÷íî ñîñòîÿò èç îïåðàòîðîâ ïðåïðîöåññîðà. Íåêîòîðûå ôàéëû, ïîäîáíî stdio.h, âêëþ÷åíû â ñèñòåìó, íî âû ìîæåòå ñîçäàòü è ñâîé ñîáñòâåííûé.
Çàãîëîâî÷íûå ôàéëû:
Ïðèìåð:
Ïðåäïîëîæèì, íàïðèìåð, ÷òî âàì ïðàâèòñÿ èñïîëüçîâàòü áóëåâû ïåðåìåííûå, ò. ñ. âìåñòî òîãî ÷òîáû èìåòü 1 êàê "èñòèíó" è 0 êàê "ëîæü", õîòåëè áû èñïîëüçîâàòü ñëîâà TRUE è FALSE. Ìîæíî ñîçäàòü ôàéë, íàçâàííûé, ñêàæåì, bool.h, êîòîðûé ñîäåðæàë áû ýòè îïðåäåëåíèÿ:
/* ôàéë bool.h */
#define BOOL int;
#define TRUE 1.
#define FALSE 0.
Âîò ïðèìåð ïðîãðàììû, èñïîëüçóþùåé ýòîò çàãîëîâîê:
/* ñ÷èòàåò ïóñòûå ñèìâîëû */
#include <stdio.h>
#include "bool.h".
Main( ).
{
Int ch;
Int count = 0;
BOOL whitesp( );
While((ch = getchar( )) != EOF).
if(whitesp(ch)) count++;
Printf(" Èìååòñÿ %d ïóñòûõ ñèìâîëîâ. \n", count);
}
BOOL whitesp(c).
Char c;
If(c == ' ' || ñ == '\n' || ñ == '\t').
Return(TRUE);
Else.
Return(FALSE);
}
Çàìå÷àíèÿ ïî ïðîãðàììå.
1. Åñëè äâå ôóíêöèè â ýòîé ïðîãðàììå ('main( )' è 'whitesp( )') ñëåäîâàëî ñêîìïèëèðîâàòü ðàçäåëüíî, òî íóæíî áûëî áû èñïîëüçîâàòü äèðåêòèâó #include "bool.h" ñ êàæäîé èç íèõ.
2. Âûðàæåíèå if(whitesp(ch)) àíàëîãè÷íî if(whitesp(ch)) == TRUE, òàê êàê ñàìà ôóíêöèÿ whitesp(ch) èìååò çíà÷åíèå TRUE èëè FALSE.
3. Ìû íå ñîçäàëè íîâûé òèï BOOL, òàê êàê BOOL óæå èìååò òèï int. Öåëü íàèìåíîâàíèÿ ôóíêöèè BOOL - íàïîìíèòü ïîëüçîâàòåëþ, ÷òî ôóíêöèÿ èñïîëüçóåòñÿ äëÿ ëîãè÷åñêèõ âû÷èñëåíèé (â ïðîòèâîïîëîæíîñòü àðèôìåòè÷åñêèì).
4. Èñïîëüçîâàíèå ôóíêöèè â ïðåäóñìàòðèâàåìûõ ëîãè÷åñêèõ ñðàâíåíèÿõ ìîæåò ñäåëàòü ïðîãðàììó ÿñíåå. Îíà ìîæåò òàêæå ñýêîíîìèòü íàø òðóä, åñëè ñðàâíåíèå âñòðå÷àåòñÿ â ïðîãðàììå áîëåå îäíîãî ðàçà.
5. Ìû ìîãëè áû èñïîëüçîâàòü ìàêðîîïðåäåëåíèå âìåñòî ôóíêöèè äëÿ çàäàíèÿ whitesp( ).
Ìíîãèå ïðîãðàììèñòû ðàçðàáàòûâàþò ñâîè ñòàíäàðòíûå çàãîëîâî÷íûå ôàéëû, ÷òîáû èñïîëüçîâàòü èõ â ïðîãðàììàõ. Íåêîòîðûå ôàéëû ìîãóò ñîçäàâàòüñÿ äëÿ ñïåöèàëüíûõ öåëåé, äðóãèå ìîæíî èñïîëüçîâàòü ïî÷òè â êàæäîé ïðîãðàììå. Òàê êàê âêëþ÷åííûå ôàéëû ìîãóò ñîäåðæàòü äèðåêòèâû #include, ìîæíî, åñëè õîòèòå, ñîçäàòü ñæàòûé, õîðîøî îãðàíèçîâàííûé çàãîëîâî÷íûé ôàéë. Ðàññìîòðèì ýòîò ïðèìåð:
/*çàãîëîâî÷íûé ôàéë mystuff.h*/
#include.
#include "bool.h".
#include "funct.h".
#define YES 1.
#define NO 0.
Âî-ïåðâûõ, ìû õîòèì íàïîìíèòü âàì, ÷òî ïðåïðîöåññîð ÿçûêà Ñè ðàñïîçíàåò êîììåíòàðèè, ïîìå÷åííûå /* è */, ïîýòîìó ìû ìîæåì âêëþ÷àòü êîììåíòàðèè â ýòè ôàéëû.
Âî-âòîðûõ, ìû âêëþ÷èëè òðè ôàéëà. Ïî-âèäèìîìó, òðåòèé ñîäåðæèò íåêîòîðûå ìàêðîôóíêöèè, êîòîðûå èñïîëüçóþòñÿ ÷àñòî.
Â-òðåòüèõ, ìû îïðåäåëèëè YES êàê 1, òîãäà êàê â ôàéëå bool.h ìû îïðåäåëèëè TRUE êàê 1. Íî çäåñü íåò êîíôëèêòà, è ìû ìîæåì èñïîëüçîâàòü ñëîâà YES è TRUE â îäíîé è òîé æå ïðîãðàììå. Êàæäîå èç íèõ áóäåò çàìåíÿòüñÿ íà 1. Ìîæåò âîçíèêíóòü êîíôëèêò, åñëè ìû äîáàâèì â ôàéë ñòðîêó.
#define TRUE 2.
Âòîðîå îïðåäåëåíèå âûòåñíèëî áû ïåðâîå, è íåêîòîðûå ïðåïðîöåññîðû ïðåäóïðåæäàëè áû âàñ, ÷òî TRUE ïåðåîïðåäåëåíî.
Äèðåêòèâà #include íå îãðàíè÷èâàåòñÿ çàãîëîâî÷íûìè ôàéëàìè. Åñëè âû çàïèñàëè íóæíóþ ôóíêöèþ â ôàéë sort.ñ, òî ìîæíî èñïîëüçîâàòü.
#include "sort.ñ".
×òîáû ñêîìïèëèðîâàòü åãî ñîâìåñòíî ñ âàøåé òåêóùåé ïðîãðàììîé.
Äèðåêòèâû #include è #define ÿâëÿþòñÿ íàèáîëåå àêòèâíî èñïîëüçóåìûìè ñðåäñòâàìè ïðåïðîöåññîðà ÿçûêà Ñè. Ðàññìîòðèì áîëåå ñæàòî äðóãèå åãî äèðåêòèâû.
ÄÐÓÃÈÅ ÄÈÐÅÊÒÈÂÛ: #undef, #if, #ifdef, #ifndef, #else È #endif.
Ýòè äèðåêòèâû îáû÷íî èñïîëüçóþòñÿ ïðè ïðîãðàììèðîâàíèè áîëüøèõ ìîäóëåé. Îíè ïîçâîëÿþò ïðèîñòàíîâèòü äåéñòâèå áîëåå ðàííèõ îïðåäåëåíèé è ñîçäàòü ôàéëû, êàæäûé èç êîòîðûõ ìîæíî êîìïèëèðîâàòü ïî-ðàçíîìó.
Äèðåêòèâà #undef îòìåíÿåò ñàìîå ïîñëåäíåå îïðåäåëåíèå ïîèìåíîâàííîãî ìàêðîîïðåäåëåíèÿ.
#define BIG 3.
#define HUGE 5.
#undef BIG /* BIG òåïåðü íå îïðåäåëåí */
#define HUGE 10 /* HUGE ïåðåîïðåäåëåí êàê 10 */
#undef HUGE /* HUGE ñíîâà ðàâåí 5*/
#undef HUGE /* HUGE òåïåðü íå îïðåäåëåí */
Î÷åâèäíî (ìû íàäååìñÿ), âû íå áóäåòå êîìïèëèðîâàòü ôàéë, êàê â ýòîì ïðèìåðå. Ïðåäïîëîæèì, ÷òî ó âàñ åñòü áîëüøîé ñòàíäàðòíûé ôàéë, îïðåäåëåííûé äèðåêòèâîé #include, êîòîðûé âû õîòåëè áû èñïîëüçîâàòü, íî äëÿ ýòîãî íåêîòîðûå èç åãî îïðåäåëåíèé äëÿ îäíîé èç ôóíêöèé ïðîãðàììû íóæíî áóäåò âðåìåííî èçìåíèòü, Âìåñòî òîãî ÷òîáû èìåòü äåëî ñ ýòèì ôàéëîì, âû ìîæåòå ïðîñòî âêëþ÷èòü åãî, à çàòåì îêðóæèòü òàêóþ âûäåëÿþùóþñÿ ôóíêöèþ ñîîòâåòñòâóþùèìè äèðåêòèâàìè #define è #undef.
Èëè, ïðåäïîëîæèì, ÷òî âû ðàáîòàåòå ñ áîëüøîé ñèñòåìîé ïðîãðàìì. Âû õîòèòå çàäàòü ìàêðîîïðåäåëåíèå, íî íå óâåðåíû, èñïîëüçóåò ëè âàøå îïðåäåëåíèå äðóãèå îïðåäåëåíèÿ îòêóäà-íèáóäü èç äðóãîãî ìåñòà ñèñòåìû.  ýòîì ñëó÷àå ïðîñòî îòìåíèòå âàøå ìàêðîîïðåäåëåíèå â òîì ìåñòå, ãäå îíî âàì áîëüøå íå íóæíî, à îðèãèíàë ýòîãî ìàêðîîïðåäåëåíèÿ, åñëè îí åñòü, áóäåò ïî-ïðåæíåìó îñòàâàòüñÿ â ñèëå äëÿ îñòàëüíîé ÷àñòè ñèñòåìû.
Äðóãèå óïîìÿíóòûå íàìè äèðåêòèâû ïîçâîëÿþò âûïîëíÿòü óñëîâíóþ êîìïèëÿöèþ. Âîò ïðèìåð:
#ifdef MAVIS
#include " horse.h" /* âûïîëíèòñÿ, åñëè MAVIS îïðåäåëåí */
#define STABLES 5.
#else.
#include "cow.h" /*âûïîëíèòñÿ, åñëè MAVIS íå îïðåäåëåí */
#define STABLES 15.
#endif.
Äèðåêòèâà #ifdef ñîîáùàåò, ÷òî åñëè ïîñëåäóþùèé èäåíòèôèêàòîð (MAVIS) îïðåäåëÿåòñÿ ïðåïðîöåññîðîì, òî âûïîëíÿþòñÿ âñå ïîñëåäóþùèå äèðåêòèâû âïëîòü äî ïåðâîãî ïîÿâëåíèÿ #else èëè #endif. Êîãäà â ïðîãðàììå åñòü #else, òî ïðîãðàììà îò #else äî #endif áóäåò âûïîëíÿòüñÿ, åñëè èäåíòèôèêàòîð íå îïðåäåëåí.
Òàêàÿ ñòðóêòóðà î÷åíü íàïîìèíàåò êîíñòðóêöèþ if-else ÿçûêà Ñè. Îñíîâíàÿ ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî ïðåïðîöåññîð íå ðàñïîçíàåò ôèãóðíûå ñêîáêè {}, îòìå÷àþùèå áëîê, ïîòîìó ÷òî îí èñïîëüçóåò äèðåêòèâû #else (åñëè åñòü) è #endif (êîòîðàÿ äîëæíà áûòü) äëÿ ïîìåòêè áëîêîâ äèðåêòèâ.
Ýòè óñëîâíûå êîíñòðóêöèè ìîãóò áûòü âëîæåííûìè.
Äèðåêòèâû #ifdef è #if ìîæíî èñïîëüçîâàòü ñ #else è #endif òàêèì æå îáðàçîì. Äèðåêòèâà #ifndef îïðàøèâàåò, ÿâëÿåòñÿ ëè ïîñëåäóþùèé èäåíòèôèêàòîð íåîïðåäåëåííûì; ýòà äèðåêòèâà ïðîòèâîïîëîæíà #ifdef. Äèðåêòèâà #if áîëüøå ïîõîæà íà îáû÷íûé îïåðàòîð if ÿçûêà Ñè. Çà íåé ñëåäóåò êîíñòàíòíîå âûðàæåíèå, êîòîðîå ñ÷èòàåòñÿ èñòèííûì, åñëè îíî íå ðàâíî íóëþ:
#if SYS == "IBM".
#include "ibm.h".
#endif.
Îäíà èç öåëåé èñïîëüçîâàíèÿ "óñëîâíîé êîìïèëÿöèè" - ñäåëàòü ïðîãðàììó áîëåå ìîáèëüíîé. Èçìåíÿÿ íåñêîëüêî êëþ÷åâûõ îïðåäåëåíèé â íà÷àëå ôàéëà, âû ìîæåòå óñòàíàâëèâàòü ðàçëè÷íûå çíà÷åíèÿ è âêëþ÷àòü ðàçëè÷íûå ôàéëû äëÿ ðàçíûõ ñèñòåì.
Ýòè êðàòêèå ïðèìåðû èëëþñòðèðóþò óäèâèòåëüíóþ ñïîñîáíîñòü ÿçûêà Ñè èçîùðåííî è ñòðîãî óïðàâëÿòü ïðîãðàììàìè.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê îïðåäåëÿòü ñèìâîëüíûå êîíñòàíòû äèðåêòèâîé #define: #define FINGERS 10.
Êàê âêëþ÷àòü äðóãèå ôàéëû: #include "albanian.h".
Êàê îïðåäåëèòü ìàêðîôóíêöèþ: #define NEG(X) (-(X)).
Êîãäà èñïîëüçîâàòü ñèìâîëè÷åñêèå êîíñòàíòû: ÷àñòî.
Êîãäà èñïîëüçîâàòü ìàêðîôóíêöèè: èíîãäà.
Îïàñíîñòü ïðèìåíåíèÿ ìàêðîôóíêöèé: ïîáî÷íûå ýôôåêòû.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ
Âîïðîñû.
1. Íèæå ïðèâåäåíû ãðóïïû îïåðàòîðîâ, ñîäåðæàùèõ ïî îäíîìó è áîëåå ìàêðîîïðå äåëåíèé, çà êîòîðûìè ñëåäóþò ñòðîêè èñõîäíûõ êîäîâ, èñïîëüçóþùèõ ýòè ìàêðî îïðåäåëåíèÿ. Êàêîé ðåçóëüòàò ïîëó÷àåòñÿ â êàæäîì ñëó÷àå? Ïðàâèëåí ëè îí?
A. #define FPM 5280 /* ôóòîâ â ìèëå */
Dist = FPM * miles;
Á. #define FEET 4.
#define POD FEET + FEET.
Plort = FEET * POD;
Â. #define SIX = 6;
Nex = SIX;
Ã. #define NEW(X) X + 5.
Ó = NEW(y);
Berg = NEW(berg) * lob;
Est = NEW(berg) / NEW(y);
Nilp = lob * NEW(-berg);
2. Ïîäïðàâüòå îïðåäåëåíèå â âîïðîñå 1.ã, ÷òîáû ñäåëàòü åãî áîëåå íàäåæíûì.
3. Îïðåäåëèòå ìàêðîôóíêöèþ, êîòîðàÿ âîçâðàùàåò ìèíèìàëüíîå èç äâóõ çíà÷åíèé.
4. Çàäàéòå ìàêðîîïðåäåëåíèå, â êîòîðîì åñòü ôóíêöèÿ whitesp(ñ) ñ÷èòàþùàÿ â ïðîãðàììå ïóñòûå ñèìâîëû.
5. Îïðåäåëèòå ìàêðîôóíêöèþ, êîòîðàÿ ïå÷àòàåò ïðåäñòàâëåíèÿ çíà÷åíèÿ äâóõ öåëûõ âûðàæåíèé.
Îòâåòû.
1.
À. dist = 5280 * miles; ïðàâèëüíî.
Á. plot = 4 * 4 + 4; ïðàâèëüíî, íî åñëè ïîëüçîâàòåëü íà ñàìîì äåëå õîòåë èìåòü 4 * (4 + 4), òî ñëåäîâàëî ïðèìåíÿòü äèðåêòèâó #define POD (FEET + FEET).
Â. nex = = 6; íåïðàâèëüíî; î÷åâèäíî, ïîëüçîâàòåëü çàáûë, ÷òî îí ïèøåò äëÿ ïðåïðîöåññîðà, à íå íà ÿçûêå Ñè.
Ã. ó - ó + 5; ïðàâèëüíî.
Berg = berg + 5 * lob; ïðàâèëüíî, íî, âåðîÿòíî, ýòî íåæåëàòåëüíûé ðåçóëüòàò.
Est = berg + 5/ó + 5; òî æå ñàìîå.
Nilp = lob * -berg + 5; òî æå ñàìîå.
2. #define NEW(X) ((X) + 5).
3. #deline MIN(X,Y) ((X) < (Y) ? (X) : (Y)).
4. #define WHITESP(C) ((Ñ) == ' ' || (Ñ) == '\n' || (Ñ)) == '\t').
5. #define PR2(X,Y) printf(" X ðàâíî %d è Y ðàâíî %d.\n", X, Y).
Òàê êàê â ýòîì ìàêðîîïðåäåëåíèè Õ è Y íèêîãäà íå èñïîëüçóþòñÿ íèêàêèìè äðóãèìè îïåðàöèÿìè (òàêèìè, êàê óìíîæåíèå), ìû íå äîëæíû íè÷åãî çàêëþ÷àòü â ñêîáêè.
ÓÏÐÀÆÍÅÍÈÅ.
1. Ñîçäàéòå çàãîëîâî÷íûé ôàéë îïðåäåëåíèé ïðåïðîöåññîðà, êîòîðûå âû õîòèòå ïðèìåíÿòü.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
- 263.
- 264.
- 265.
- 266.
- 267.
- 268.
- 269.
- 270.
- 271.
- 272.
- 273.
- 274.
- 275.
- 276.
- 277.
- 278.
- 279.
- 280.
- 281.
- 282.
- 283.
- 284.
- 285.
- 286.
- 287.
- 288.
- 289.
- 290.
- 291.
- 292.
- 293.
- 294.
- 295.
- 296.
- 297.
- 298.
- 299.
- 300.
- 301.
- 302.
- 303.
- 304.
- 305.
- 306.
- 307.
- 308.
- 309.
- 310.
- 311.
- 312.
- 313.
- 314.
- 315.
- 316.
- 317.
- 318.
- 319.
- 320.
- 321.
- 322.
- 323.
- 324.
- 325.
- 326.
- 327.
- 328.
- 329.
- 330.
- 331.
- 332.
- 333.
- 334.
- 335.
- 336.
- 337.
- 338.
- 339.
- 340.
- 341.
- 342.
- 343.
- 344.
- 345.
- 346.
- 347.
- 348.
- 349.
- 350.
- 351.
- 352.
- 353.
- 354.
- 355.
- 356.
- 357.
- 358.
- 359.
- 360.
- 361.
- 362.
- 363.
- 364.
- 365.
- 366.
- 367.
- 368.
- 369.
- 370.
- 371.
- 372.
- 373.
- 374.
- 375.
- 376.
- 377.
- 378.
- 379.
- 380.
- 381.
- 382.
- 383.
- 384.
- 385.
- 386.
- 387.
- 388.
- 389.
- 390.
- 391.
- 392.
- 393.
- 394.
- 395.
- 396.
- 397.
- 398.
- 399.
- 400.
- 401.
- 402.
- 403.
- 404.
- 405.
- 406.
- 407.
- 408.
- 409.
- 410.
- 411.
- 412.
- 413.
- 414.
- 415.
- 416.
- 417.
- 418.
- 419.
- 420.