ßçûê Ñè - ðóêîâîäñòâî äëÿ íà÷èíàþùèõ.

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. Ñîçäàéòå çàãîëîâî÷íûé ôàéë îïðåäåëåíèé ïðåïðîöåññîðà, êîòîðûå âû õîòèòå ïðèìåíÿòü.