5.3. Ïðåçàðåäèìè èìåíà íà ôóíêöèè
Çà äàäåíà
äóìà ñå êàçâà, ÷å å ïðåçàðåäèìà, àêî èìà äâå èëè ïîâå÷å ðàçëè÷íè çíà÷åíèÿ.
Ñìèñúëúò, â êîéòî å óïîòðåáåíà äóìàòà, ñå îïðåäåëÿ â çàâèñèìîñò îò êîíòåêñòà.
Àêî íàïèøåì
static int depth;
çíà÷åíèåòî íà static ñå îïðåäåëÿ îò
îáõâàòà íà ïîÿâàòà é. Òîâà å èëè ëîêàëíà ñòàòè÷íà ïðîìåíëèâà èëè å äåêëàðèðàíà ñ
ôàéëîâ îáõâàò. ( ñëåäâàùèÿ ðàçäåë, íèå ùå âúâåäåì åäíî òðåòî çíà÷åíèå íà
static, êîåòî ñå îòíàñÿ çà ñòàòè÷åí ÷ëåí íà êëàñ). Âúâ âñåêè ñëó÷àé çíà÷åíèåòî
íà static íàïúëíî ñå èçÿñíÿâà îò êîíòåêñòà, â êîéòî ñå èçïîëçâàò. Êîãàòî òàêúâ
êîíòåêñò ëèïñâà, êàçâàìå, ÷å äóìàòà å äâóñìèñëåíà. Òàêèâà äóìè ìîãàò äà èìàò äâå
èëè ïîâå÷å çíà÷åíèÿ, âñÿêî îò êîèòî äà áúäå åäíàêâî âúçìîæíî.
Â
åñòåñòâåíèòå åçèöè äâóñìèñëèåòî ÷åñòî å óìèøëåíî.  ëèòåðàòóðàòà, íàïðèìåð,
äâóñìèñëèåòî ìîæå äà îáîãàòè íàøåòî ðàçáèðàíåòî íà ãåðîèòå è òåìàòèêàòà íà
êíèãèòå. Åäíî ëèöå, ìîæå äà áúäå îïèñàíî êàòî îãðàíè÷åíî (çàäúëæåíî, îáâúðçàíî)
è ðåøèòåëíî (íåïîêîëåáèìî, òâúðäî). Åäèí îò ãåðîèòå ìîæå äà ñå îáúðíå êúì äðóã è
äà êàæå “Õîðàòà íèêîãà íå ñà ñïðàâåäëèâè (âåðíè, òî÷íè)”. ×èòàòåëÿò ìîæå äà
âúçïðèåìå ðàçëè÷íèòå çíà÷åíèÿ íà äóìàòà åäíîâðåìåííî.
Äâóñìèñëèåòî,
îáà÷å, å íåïîäõîäÿùî çà êîìïèëàòîðà. Àêî êîíòåêñòúò, â êîéòî ñå ïîÿâÿâà äàäåí
èäåíòèôèêàòîð èëè îïåðàòîð íå å äîñòàòú÷åí çà äà ñå èçÿñíè çíà÷åíèåòî ìó
êîìïèëàòîðúò èçäàâà ñúîáùåíèå çà ãðåøêà. Äâóñìèñëèåòî, îáà÷å, å îñîáåíî âàæíî
ïðè ïðåçàðåäèìèòå èìåíà íà ôóíêöèè, òåìàòà íà òîçè ðàçäåë, êàêòî è íà
íàñëåäñòâåíîñòòà ïðè êëàñîâåòå, êîåòî å ïðåäìåò íà îáñúæäàíå íà ãëàâè 7 è 8.Çàùî
äà ïðåçàðåæäàìå èìåíàòà íà ôóíêöèèòå?
 Ñ++ íà äâå èëè ïîâå÷å ôóíêöèè
ìîãàò äà áúäàò äàäåíè åäíè è ñúùè èìåíà, íî ñ óíèêàëíà ñèãíàòóðà, êàòî ñå
ðàçëè÷àâàò ïî áðîÿ èëè òèïà íà àðãóìåíòèòå ñè. Íàïðèìåð,
int max( int,
int);
double max(double, double );
Complex &( const Complex, const
Complex );
Íåîáõîäèìà å îòäåëíà ðåàëèçàöèÿ çà âñåêè óíèêàëåí íàáîð îò
àðãóìåíòè íà max(). Âñÿêà îò òÿõ, îáà÷å, èçïúëíÿâà åäíî è ñúùî îáùî äåéñòâèå -
âðúùà ïî-ãîëåìèÿ îò äâàòà àðãóìåíòà.
Îò ïîòðåáèòåëñêà ãëåäíà òî÷êà
ñúùåñòâóâà ñàìî åäíà îïåðàöèÿ, êîÿòî îïðåäåëÿ ìàêñèìàëíà ñòîéíîñò. Äåòàéëèòå ïî
ðåàëèçàöèÿòà îòíîñíî íà÷èíà, ïî êîéòî òîâà ñå èçâúðøâà, ñå îòíàñÿò äî åäèí
ïî-øèðîê êðúã èíòåðåñè. ×ðåç ïðåçàðåæäàíåòî íà ôóíêöèèòå ïîòðåáèòåëÿò ìîæå
ïðîñòî äà íàïèøå ñëåäíîòî:
int i = max( j, k );
Complex c = max( a, b
);
Íà àíãëèéñêè óïîòðåáåíèòå äóìè ñà bound and determined. Èçðå÷åíèåòî
èìà âèäà
"People are never just".
Åäèí àíàëîã íè ïðåäëàãà
àðèòìåòè÷íèÿò îïåðàòîð. Èçðàçúò 1 + 3 èçâèêâà îïåðàöèÿòà ñúáèðàíå çà öåëè
îïåðàíäè, äîêàòî èçðàçà 1.0 + 3.0 èçâèêâà ðàçëè÷íà îïåðàöèÿ çà ñúáèðàíå, êîÿòî
îáðàáîòâà îïåðàíäè ñ ïëàâàùà çàïåòàÿ.
Çà ïîòðåáèòåëÿ ðåàëèçàöèÿòà íà òîçè
ìåõàíèçúì å ïðîçðà÷íà ïîíåæå îïåðàöèÿòà ñúáèðàíå å ïðåçàðåäåíà òàêà, ÷å äà
ïîäàâà ðàçëè÷íè ñâîè ïðåäñòàâèòåëè. Êîìïèëàòîðúò, à íå ïðîãðàìèñòúò, ñå ãðèæè çà
ðàçãðàíè÷àâàíåòî íà òåçè ðàçëè÷íè ïðåäñòàâèòåëè. Ïðåçàðåæäàíåòî íà èìåíà íà
ôóíêöèè ïðåäëàãà ïîäîáíà ïðîçðà÷íîñò çà ïîòðåáèòåëñêè äåôèíèðàíè
ôóíêöèè.
Áåç ñïîñîáíîñòòà çà ïðåçàðåæäàíå íà èìå íà ôóíêöèÿ íà âñåêè íåéí
ïðåäñòàâèòåë òðÿáâà äà áúäå äàäåíî ñîáñòâåíî óíèêàëíî èìå. Íàïðèìåð, íàøåòî
ìíîæåñòâî îò max() ôóíêöèè ùå ïðèäîáèå âèäà
int max( int, int
);
double fmax( double, double );
Complex &Cmax( const Complex&,
const Complex& );
Òàçè ëåêñèêàëíà ñëîæíîñò íå å ïðèñúùà íà ïðîáëåìà
çà îïðåäåëÿíå íà ïî-ãîëåìèÿ îò äâà îáåêòà îò ðàçëè÷íè òèïîâå äàííè, à ïî-ñêîðî
îòðàçÿâà åäíî îãðàíè÷åíèå íà ïðîãðàìíàòà ñðåäà - âñåêè îïåðàòîð, êîéòî ñå ÿâÿâà
â îïðåäåëåí îáõâàò, òðÿáâà äà áúäå óíèêàëåí. Òàçè ñëîæíîñò èçïðàâÿ ïðîãðàìèñòà
ïðåä åäèí ïðàêòè÷åñêè ïðîáëåì - òîé òðÿáâà èëè äà ïîìíè èëè äà òúðñè âñÿêî
èìå.
Ïðåçàðåæäàíåòî íà èìåíàòà îñâîáîæäàâà ïðîãðàìèñòà îò òàçè ëåêñèêàëíà
ñëîæíîñò.
Êàê äà ïðåçàðåäèì èìå íà ôóíêöèÿ
Êîãàòî åäíî èìå íà
ôóíêöèÿ ñå äåêëàðèðà ïîâå÷å îò åäèí ïúò â åäíà ïðîãðàìà êîìïèëàòîðúò ùå
èíòåðïðåòèðà âòîðàòà äåêëàðàöèÿ ïî ñëåäíèÿ íà÷èí:
- àêî êàêòî òèïúò çà
âðúùàíå, òàêà è ñèãíàòóðàòà íà äâåòå ôóíêöèè ñúâïàäàò íàïúëíî, òî âòîðàòà ñå
ðàçãëåæäà êàòî ïîâòîðíà äåêëàðàöèÿ íà ïúðâàòà. Íàïðèìåð,
// declares the
same function
extern void print( int *ia, int sz );
void print( int
*array, int size );
Èìåíàòà íà àðãóìåíòèòå íå ñà ñúùåñòâåíè çà
ñðàâíåíèåòî íà ñèãíàòóðèòå.
- àêî ñèãíàòóðèòå íà äâå ôóíêöèè ñúâïàäàò
òî÷íî, íî òèïîâåòå çà âðúùàíå ñà ðàçëè÷íè, âòîðàòà äåêëàðàöèÿ ñå ðàçãëåæäà êàòî
íåïðàâèëíà ïîâòîðíà äåêëàðàöèÿ íà ïúðâàòà è ñå îòáåëÿçâà êàòî ãðåøêà ïî âðåìå íà
êîìïèëàöèÿ. Íàïðèìåð,
unsigned int max( int*, int sz );
extern int
max( int *ia, int ); // error
- àêî ñèãíàòóðèòå íà äâå ôóíêöèè ñå
ðàçëè÷àâàò ïî áðîÿ èëè òèïà íà àðãóìåíòèòå ñè, ñå ñ÷èòà, ÷å äâàòà ïðåäñòàâèòåëÿ
íà ôóíêöèÿòà ñà ïðåçàðåäèìè. Íàïðèìåð,
extern void print( int *, int
);
void print(double *da, int sz );
Åäíà äåêëàðàöèÿ typedef ïðåäëàãà
àëòåðíàòèâíî èìå çà ñúùåñòâóâàù òèï äàííè; òî íå ñúçäàâà íîâ òèï äàííè. Ñëåäíèòå
äâà ïðåäñòàâèòåëíà search() ñå òðåòèðàò êàòî ïðèòåæàâàùè åäíà è ñúùà ñèãíàòóðà.
Äåêëàðàöèÿòà íà âòîðèÿ ïðåäñòàâèòåë ùå ïðåäèçâèêà ãðåøêà ïî âðåìå íà êîìïèëàöèÿ
ïîíåæå âúïðåêè, ÷å ïðèòåæàâà ñúùàòà ñèãíàòóðà, òÿ èìà ðàçëè÷åí òèï çà
âðúùàíå.
// typedef does not introduce a new type
typedef char
*string;
extern int search( string );
extern char search( char ); //
error
Êîãà äà íå èçïîëçâàìå ïðåçàðåæäàíåòî íà ôóíêöèè
?
Ìåõàíèçìúò íà ïðåçàðåæäàíåòî ïîçâîëÿâà ìíîæåñòâî îò ôóíêöèè, êîèòî
èçïúëíÿâàò ñõîäíà îïåðàöèÿ, òàêàâà êàòî print(), äà áúäàò èçâèêâàíè ÷ðåç åäíî
îáùî ìíåìîíè÷íî èìå. Ñâúðçâàíåòî ñ ïîäõîäÿùèÿ ïðåäñòàâèòåë íà ôóíêöèÿòà å
ïðîçðà÷íî çà ïîòðåáèòåëÿ, êàòî ïðè òîâà îòñòðàíÿâà ëåêñèêàëíàòà ñëîæíîñò,
ïîðîäåíà îò íåîáõîäèìîñòòà íà âñÿêà ôóíêöèÿ äà ñå äàâà óíèêàëíî èìå, êàòî
iPrint() è iaPrint().
Ñëåä êàòî ðàçãëåäàõìå ïðåäèìñòâàòà íà òîçè
ìåõàíèçúì íåêà êàæåì êîãà íå ñå ïðåïîðú÷âà òîé äà áúäå èçïîëçâàí. Åäèí ñëó÷àé
èìàìå, êîãàòî ìíîæåñòâîòî îò ôóíêöèè íå èçïúëíÿâà ñõîäíà îïåðàöèÿ. Íàïðèìåð, åòî
åäèí íàáîð îò ôóíêöèè, êîèòî ðàáîòÿò ñ îáùà àáñòðàêòíà ñúâêóïíîñò îò äàííè.
Ïúðâîíà÷àëíî òå ìîãàò äà íè ñå ñòîðÿò êàòî åâåíòóàëíè êàíäèäàòè çà
ïðåçàðåæäàíå
void setDate( Date&, int, int, int );
Date&
convertDate( char* );
void printDate( const Date& );
Òåçè ôóíêöèè
ðàáîòÿò ñ åäíè è ñúùè òèïîâå äàííè, íî íå èçïúëíÿâàò åäíà è ñúùà îïåðàöèÿ. Â
òîçè ñëó÷àé ëåêñèêàëíàòà ñëîæíîñò å ïðîãðàìèñòêî ñïîðàçóìåíèå, êîåòî ñâúðçâà
íàáîðà îò ôóíêöèè ñ îáùèÿ äàííîâ òèï. Êëàñîâèÿò ìåõàíèçúì â Ñ++ ïðàâè òîçè òèï
ñúãëàøåíèÿ íåíóæíè. Òåçè ôóíêöèè òðÿáâà äà áúäàò íàïðàâåíè ÷ëåí ôóíêöèè íà êëàñà
Date. Íàïðèìåð,
class Date{
set( int, int, int );
Date
&convert( char* );
void print();
// ...};
Ñëåäíèÿò íàáîð îò ïåò
÷ëåí ôóíêöèè íà êëàñà Screen èçïúëíÿâàò ðàçëè÷íè îïåðàöèè çà äâèæåíèå. Îòíîâî òå
ìîãàò äà áúäàò ïðåçàðåæäàíè ÷ðåç åäíî îáùî èìå move().
Screen&
moveHome();
Screen& moveAbs( int, int );
Screen& moveRel( int,
int, char *direction );
Screen& moveX( int );
Screen& moveY( int
);
Ïîñëåäíèòå äâà ïðåäñòàâèòåëÿ íå ìîãàò äà áúäàò ïðåçàðåæäàíè; òåõíèòå
ñèãíàòóðè ñà åäíè è ñúùè. Çà äà îñèãóðèì óíèêàëíîñò íà ñèãíàòóðàòà òðÿáâà äà
îáåäèíèì äâåòå ôóíêöèè â åäíà
Screen& ( int, char xy );
Òàêà
ïîëó÷àâàìå óíèêàëíà ñèãíàòóðà. Îñâåí òîâà, àêî íÿêàêâî ïðîó÷âàíå ïîêàæå, ÷å ïî
îñòà x èëè y ïðîìåíèòå ñà ïî-÷åñòè, ìîæåì äà çàäàäåì ñòîéíîñò ïî
ïîäðàçáèðàíå
Screen& move( int, char xy = ‘x’);
Ïðîó÷âàíåòî
ìîæå äà ïîêàæå ñúùî, ÷å íàé-÷åñòîòî äâèæåíèå å ïðåìåñòâàíå íàïðåä ñ åäíà ïîçèöèÿ
ïî îñòà õ. Àêî ñå ïîääúðæà ñòîéíîñò ïî ïîäðàçáèðàíå çà ïúðâèÿò àðãóìåíò, îáà÷å
ñèãíàòóðàòà âå÷å íå å óíèêàëíà
Screen& move( int sz = 1, char xy =
‘x’ );
Ñåãà è äâåòå ôóíêöèè move() è moveHome() ìîãàò äà áúäàò âèêàíè áåç
àðãóìåíòè. Íå å íåîáõîäèìî àðãóìåíò ñ èíèöèàëèçàòîð ïî ïîäðàçáèðàíå äà áúäå
ðàçãëåæäàí, êîãàòî ñå îïèòâàìå äà ñúïîñòàâèì îïðåäåëåí ïðåäñòàâèòåë ïðè
èçâèêâàíå íà ïðåçàðåäèìà ôóíêöèÿ.
 òîçè ìîìåíò ïðîãðàìèñòúò ìîæå äà
îñïîðè ñìèñëåíîñòòà íà ïðåçàðåäèìîñòòà íà òåçè äâå ôóíêöèè.  òîçè ñëó÷àé
èçãëåæäà, ÷å ïðåçàðåæäàíåòî å ïðîöåñ íà îòõâúðëÿíå íà íåíóæíà èíôîðìàöèÿ.
Âúïðåêè, ÷å äâèæåíèåòî íà êóðñîðà å îáùà îïåðàöèÿ çà òåçè ôóíêöèè, ñïåöèôè÷íîòî
åñòåñòâî íà òîâà äâèæåíèå å óíèêàëíî ïðè âñÿêà îò òÿõ. moveHome(), êîÿòî å åäèí
ñïåöèàëåí ñëó÷àé íà äâèæåíèå íà êóðñîðà, íè äàâà äðóã ïîäîáåí ïðèìåð. Èìåòî
moveHome() ïðåäëàãà ïîâå÷å èíôîðìàöèÿ îòêîëêîòî move(). Ïðîãðàìàòà ìîæå äà ñå
ïîäîáðè ñ åäíî ñïåöèàëíî èìå íà ôóíêöèÿ
inline
Screen&Screen
home(){ return move( 0, 0 ); }
Òîâà îñâîáîæäàâà
âòîðàòà è òðåòàòà ôóíêöèÿ çà äâèæåíèå. Îòíîâî òå ìîãàò äà áúäàò ïðåçàðåæäàíè.
Êàêòî å ïî-ëåñíî, îáà÷å, òå ìîãàò äà áúäàò îáåäèíåíè â åäèí ïðåäñòàâèòåë ÷ðåç
èíèöèàëèçàòîð íà àðãóìåíòà ïî ïîäðàçáèðàíå
move( int, int, char* = 0
);
Íàé-äîáðå å ïðîãðàìèñòúò äà íå ìèñëè, ÷å âñÿêà åçèêîâà õàðàêòåðèñòèêà
å ñëåäâàùàòà ïëàíèíà, êîÿòî òðÿáâà äà èçêà÷è. Èçïîëçóâàíåòî íà äàäåíà
õàðàêòåðèñòèêà òðÿáâà äà áúäå ïðåäèçâèêàíî îò ëîãèêàòà íà ïðèëîæåíèåòî, à íå
ïðîñòî îò ôàêòà, ÷å òàêàâà ñúùåñòâóâà.
Ñâúðçâàíå íà îáðúùåíèå êúì
ïðåçàðåäèìà ôóíêöèÿ
Ñèãíàòóðàòà íà ôóíêöèÿòà ðàçãðàíè÷àâà åäèí
ïðåäñòàâèòåë îò äðóã ïðè íàáîð îò ïðåçàðåäèìè ôóíêöèè. Íàïðèìåð, åòî ÷åòèðè
ðàçëè÷íè ïðåäñòàâèòåëÿ íà print()
extern void print( unsigned int
);
extern void print( char* );
extern void print( char );
extern void
print( int );
Åäíî îáðúùåíèå êúì ïðåçàðåäèìà ôóíêöèÿ ñå ñâúðçâà ñ
ïîäõîäÿù ïðåäñòàâèòåë ïî âðåìå íà ïðîöåñà, íàðå÷åí ñúïîñòàâÿíå íà àðãóìåíòèòå,
çà êîéòî ìîæå äà ñå ìèñëè êàòî çà ïðîöåñ íà ðàçðåøàâàíå íà äâóñìèñëèåòî.
Ñúïîñòàâÿíåòî íà àðãóìåíòèòå ïðåäèçâèêâà ñðàâíÿâàíå íà ôàêòè÷åñêèòå àðãóìåíòè íà
ïîâèêâàíåòî ñ ôîðìàëíèòå àðãóìåíòè íà âñåêè äåêëàðèðàí
ïðåäñòàâèòåë.
Ñúùåñòâóâàò òðè âúçìîæíè ðåçóëòàòà îò îáðúùåíèåòî êúì
ïðåçàðåäèìà ôóíêöèÿ
1. Óñïåøíî ñúïîñòàâÿíå. Îáðúùåíèåòî ñå ñâúðçâà ñ
ïîäõîäÿù ïðåäñòàâèòåë. Íàïðèìåð, íàïðèìåð âñÿêî îò ñëåäíèòå òðè îáðúùåíèÿ êúì
print() èìà êàòî ðåçóëòàò ñúïîñòàâÿíå
unsigned a;
print( ‘a’ ); //
matches print(char);
print( "a" ); // matches print(char*);
print( a ); //
matches print(unsigned);
2. Íåóñïåøíî ñúïîñòàâÿíå. Ôàêòè÷åñêèòå àðãóìåíòè
íå ìîãàò äà áúäàò ïîñòàâåíè â ñúîòâåòñòâèå ñ àðãóìåíòèòå íà äåôèíèðàíèòå
ïðåäñòàâèòåëè. Âñÿêî îò ñëåäíèòå äâå îáðúùåíèÿ êúì print() èìà êàòî ðåçóëòàò
íåóñïåøíî ñúïîñòàâÿíå
int *ip;
SmallInt si; // error no
match
print( si )
print( ip ); // error no match
3. Äâóñìèñëåíî
ñúïîñòàâÿíå. Ôàêòè÷åñêèòå àðãóìåíòè ìîãàò äà áúäàò ñúïîñòàâåíè ñ ïîâå÷å îò åäèí
äåôèíèðàí ïðåäñòàâèòåë. Ñëåäíîòî îáðúùåíèå å åäèí ïðèìåð çà äâóñìèñëèå ïðè
ñúïîñòàâÿíåòî, ïîíåæå òàêîâà ìîæå äà áúäå îñúùåñòâåíî ñ âñåêè îò ïðåäñòàâèòåëèòå
íà print(), êàòî èçêëþ÷èì òîçè, êîéòî ïîëó÷àâà àðãóìåíò îò òèï
char*.
unsigned long u1;
print( u1 ); // error
ambiguous
Ñúïîñòàâÿíåòî ìîæå äà áúäå èçâúðøåíî ïî åäèí îò ñëåäíèòå òðè
íà÷èíà, â çàâèñèìîñò îò ïðèîðèòåòà:
1. Òî÷íî ñúïîñòàâÿíå. Òèïúò íà
ôàêòè÷åñêèòå àðãóìåíòè ñúîòâåòñòâà òî÷íî íà òèïà íà åäèí îò äåôèíèðàíèòå
ïðåäñòàâèòåëè. Íàïðèìåð,
extern ff( int );
extern ff( char* );
f( 0
); // matches
ff( int )0 å îò òèï int. Îáðúùåíèåòî òî÷íî ñúîòâåòñòâà íà
ff(int).
2. Ñúïîñòàâÿíå ÷ðåç ïðèëàãàíå íà ñòàíäàðòíè ïðåîáðàçóâàíèÿ. Àêî
íå áúäå íàìåðåíî òî÷íî ñúïîñòàâÿíå ñå ïðàâè îïèò äà ñå èçâúðøè ñúïîòàâÿíå ÷ðåç
ñòàíäàðòíî ïðåîáðàçóâàíå íà ôàêòè÷åñêèÿ àðãóìåíò. Íàïðèìåð,
class
X;
extern ff( X& );
extern ff( char* );
ff( 0 ); //
matches
ff(char*)
3. Ñúïîñòàâÿíå ÷ðåç ïðèëàãàíå íà äåôèíèðàíè îò
ïîòðåáèòåëÿ ïðåîáðàçóâàíèÿ. Àêî íå áúäå íàìåðåíî òî÷íî ñúïîñòàâÿíå èëè
ñòàíäàðòíî ïðåîáðàçóâàíå ñå èçïîëçâàò äåôèíèðàíîòî îò ïîòðåáèòåëÿ.
Íàïðèìåð,
class SmallInt
{ operator int();// ...
SmallInt
si;
extern ff( char* );
extern ff( int );
ff( si ); //
matches
ff(int);
operator int() ñå íàðè÷à îïåðàòîð çà ïðåîáðàçóâàíå.
Òîé ïîçâîëÿâà íà êëàñà äà äåôèíèðà ñîáñòâåí íàáîð îò “ñòàíäàðòíè”
ïðåîáðàçóâàíèÿ. Ðàçäåë 7.5 ðàçãëåæäà ïîäðîáíî òåçè äåôèíèðàíè îò ïîòðåáèòåëÿ
ïðåîáðàçóâàíèÿ.
Îñîáåíîñòè íà òî÷íîòî ñúïîñòàâÿíå
Ôàêòè÷åñêèòå
àðãóìåíòè îò òèï char, short è float ñå îáðàáîòâàò êàòî ñïåöèàëåí ñëó÷àé, êàòî
ñå ñïàçâà èçèñêâàíåòî çà òî÷íî ñúïîñòàâÿíå. Ïðàâÿò ñå äâà ïðåãëåäà íà íàáîðà îò
ïðåçàðåäèìè ôóíêöèè âèíàãè êîãàòî ñúùåñòâóâà ôàêòè÷åñêè àðãóìåíò çà åäíà îò
òÿõ.
Ïðè ïúðâèÿ ïðåãëåä ñå ïðàâè îïèò çà òî÷íî ñúïîñòàâÿíå íà
àðãóìåíòèòå. Íàïðèìåð,
ff( char );
ff( long );
ff( ‘a’ ); //
ff(char)
Ñèìâîëíàòà êîíñòàíòà òî÷íî ñúîòâåòñòâà íà ïðåçàðåäèìèÿ
ïðåäñòàâèòåë, êîéòî èìà ôîðìàëåí àðãóìåíò îò òèï char. Òúðñåíåòî íà ñúîòâåòñòâèå
ïðèêëþ÷âà.
Àêî ïðè ïúðâèÿ ïðåãëåä íå áúäå íàìåðåíî òî÷íî ñúîòâåòñòâèå ñå
èçâúðøâà ñëåäíîòî
- àðãóìåíòè îò òèï char, unsigned char èëè short ñå
ïðèâåæäàò êúì òèï int. Àðãóìåíòè îò òèï unsigned short ñå ïðèâåæäàò êúì òèï int
àêî ìàøèííèÿ ðàçìåð íà int å ïî-ãîëÿì îò òîçè íà short; èíà÷å ñå ïðâåæäàò êúì
òèï unsigned int.
- àðãóìåíòè îò òèï float ñå ïðâåæäàò êúì òèï
double.
Ïðè âòîðèÿ ïðåãëåä ñå ïðàâè îïèò çà íàìèðàíå íà òî÷íî
ñúîòâåòñòâèå çà àðãóìåíòèòå íà îñíîâàòà íà èçâúðøåíèòå ïðåîáðàçóâàíèÿ.
Íàïðèìåð,
ff( int );
ff( short );
ff( long );
ff( ‘a’ );
//
ff(int);
Ñèìâîëíàòà êîíñòàíòà òî÷íî ñúîòâåòñòâà íà ïðåçàðåäèìèÿ
ïðåäñòàâèòåë, êîéòî èìà ôîðìàëåí àðãóìåíò îò òèï int. Ñúïîñòàâÿíåòî íà íÿêîé îò
òèïîâåòå short èëè long èçèñêâà ïðèëàãàíå íà ñòàíäàðòíî ïðåîáðàçóâàíå. Òúðñåíåòî
íà ñúîòâåòñòâèå ïðèêëþ÷âà.
Åäèí ôàêòè÷åñêè àðãóìåíò îò òèï int íå ñå
ñúïîñòàâÿ òî÷íî íà ôîðìàëíè àðãóìåíòè îò òèï char èëè short. Ñúîòâåòíî double íå
ñúîòâåòñòâóâà òî÷íî íà àðãóìåíò îò òèï float. Íàïðèìåð, äàäåíà å ñëåäíàòà äâîéêà
îò ïðåçàðåäèìè ôóíêöèè,
ff( long );
ff( float );
ïðè êîèòî
ñëåäíîòî îáðúùåíèå ïðåäèçâèêâà äâóñìèñëèå
ff( 3.14 ); // error
ambiguous