Äåôèíèöèè
íà ïðîìåíëèâè
Åäíà ïðîñòà äåôèíèöèÿ ñå ñúñòîè îò ñïåöèôèêàòîð íà òèï
ñëåäâàí îò èìå. Äåôèíèöèÿòà ñå îãðàíè÷àâà îò òî÷êà è çàïåòàÿ. Åòî íÿêîè ïðèìåðè
íà ïðîñòè äåôèíèöèè:
double salary;
double wage;
int month;
int
day;
int year;
unsigned long distance;
Êîãàòî ñå äåôèíèðà ïîâå÷å îò
åäèí èäåíòèôèêàòîð çà äàäåí òèï, ñïèñúêúò îò èäåíòèôèêàòîðè, çàïèñàí ñëåä
ñïåöèôèêàòîðà íà òèï, ñå ðàçäåëÿ ÷ðåç çàïåòàè. Òîçè ñïèñúê ìîæå äà áúäå
ðàçïîëîæåí íà íÿêîë-êî ðåäà. Îãðàíè÷àâà ñå îò òî÷êà è çàïåòàÿ. Íàïðèìåð,
ïðåäõîäíèòå äåôèíèöèè ìîãàò äà áúäàò çàïèñàíè ïî ñëåäíèÿ íà÷èí:
double
salary, wage;
int month,
day, year;
unsigned long
distance;
Âñÿêà ïðîñòà äåôèíèöèÿ îïðåäåëÿ òèïà è èäåíòèôèêàòîðà íà
ïðîìåíëèâàòà. Òÿ íå äàâà íà÷àëíà ñòîéíîñò. Çà ïðîìåíëèâà, êîÿòî íÿìà íà÷àëíà
ñòîéíîñò, ñå êàçâà ÷å å íåèíèöèàëèçèðàíà. Âñÿêà íåèíèöèàëèçèðàíà ïðîìåíëèâà
ôàêòè÷åñêè èìà ñòîéíîñò; íî ïî-ñêîðî ìîæå äà ñå êàæå, ÷å ñòîéíîñòòà é å
íåäåôèíèðàíà. Òîâà å òàêà, ïîíåæå ïàìåòòà, îòäåëåíà çà ñúõðàíÿâàíå íà
ïðîìåíëèâàòà íå å èçòðèòà. Ïðîñòî å îñòàíàëî òîâà, êîåòî å áèëî çàïèñàíî â
ïàìåòòà ïðè ïðåäõîäíîòî èçïîëçóâàíå íà òàçè ïàìåò. Êîãàòî ñå ÷åòå åäíà
íåèíèöèàëèçèðàíà ïðîìåíëèâà ñëó÷àéíàòà áèòîâà ïîñëå-äîâàòåëíîñò ñå èíòåðïðåòèðà
êàòî íåéíà ñòîéíîñò. Òàçè ñòîéíîñò ùå ñå ïðîìåíÿ çà ðàçëè÷íèòå èçïúëíåíèÿ íà
ïðîãðàìàòà. Ñëåäíàòà ïðèìåðíà ïðîãðàìà èëþñòðèðà ñëó÷àéíèÿ õàðàêòåð íà
íåèíèöèàëèçèðàíèòå äàííè.
#include <stream.h>
const
iterations = 2;
void func() {
// illustrate danger of uninitialized
variables
int value1, value2; // uninitialized
static int depth
= 0;
if ( depth < iterations ) {
++depth;
func();
}
else depth = 0;
cout << "nvalue1:t" <<
value1;
cout << "nvalue2:t" << value2;
cout <<
"tsum:t" << value1 + value2;
}
main() {
for ( int i = 0; i
< iterations; ++i )
func();
}
Êîãàòî òàçè ïðîãðàìà áúäå
êîìïèëèðàíà è èçïúëíåíà, ñå ïîëó÷àâà ñëåäíèÿ ïî-ñêîðî èçíåíàäâàù èçõîä (îñâåí
òîâà, òåçè ðåçóëòàòè ùå ñå ïðîìåíÿò ïðè âñÿêî êîìïèëèðàíå è èçïúëíåíèå íà
ïðîãðàìàòà):
value1: 0 value2: 74924 sum: 74924
value1: 0 value2:
68748 sum: 68748
value1: 0 value2: 68756 sum: 68756
value1: 148620 value2:
2350 sum: 150970
value1: 2147479844 value2: 671088640 sum:
-1476398812
value1: 0 value2: 68756 sum: 68756
 òàçè ïðîãðàìà
iterations ñå èçïîëçóâà êàòî êîíñòàíòà. Òîâà ñå îòáåëÿçâà ñ êëþ÷îâàòà äóìà
const. Êîíñòàíòèòå ñå ðàçãëåæäàò â ðàçäåë 1.5 íà òàçè ãëàâà. depth ïðåäñòàâëÿâà
ëîêàëíà ñòàòè÷íà ïðîìåíëèâà.
Çíà÷åíèåòî íà äóìàòà static ñå ðàçÿñíÿâà â
ðàçäåë 3.10 ïðè îáñúæäàíåòî íà îáõâàòà. func() å îïèñàíà êàòî ðåêóðñèâíà
ôóíêöèÿ. Ðàçäåë 4.1 ðàçãëåæäà ðåêóðñèâíèòå ôóíêöèè.
 äåôèíèöèÿòà íà åäíà
ïðîìåíëèâà ìîæå äà é ñå äàäå ïúðâîíà÷àëíà ñòîéíîñò. Çà ïðîìåíëèâà, íà êîÿòî å
äàäåíà ïúðâîíà÷àëíà ñòîéíîñò â äåêëàðàöèÿòà ñå êàçâà, ÷å å èíèöèàëèçèðàíà. Åòî
íÿêîëêî ïðèìåðà çà èíèöèàëèçèðàíå íà ïðîìåíëèâè:
#include
<math.h>
double price = 109.99, discount = 0.16,
salePrice = price *
discount;
int val = getValue();
unsigned absVal = abs ( val
);
Ïðåäâàðèòåëíî äåôèíèðàíàòà ôóíêöèÿ abs(), íàìèðàùà ñå â áèáëèîòåêàòà
math, âðúùà àáñîëþòíàòà ñòîéíîñò íà àðãóìåíòà ñè. getValue() å ôóíêöèÿ,
äåôèíèðàíà îò ïîòðåáèòåëÿ, êîÿòî âðúùà ñëó÷àéíî öÿëî ÷èñëî. Ïðîìåíëèâèòå ìîãàò
äà áúäàò èíèöèàëèçèðàíè ñúñ ïðîèçâîëíè ñëîæíè èçðàçè.
2.3. Óêàçàòåëíè
òèïîâå
Ïðîìåíëèâàòà óêàçàòåë ñúäúðæà ñòîéíîñò, êîÿòî ïðåäñòàâëÿâà
àäðåñ íà îáåêò â ïàìåòòà. ×ðåç óêàçàòåëÿ ìîæåì äà ñå îáúðíåì êúì îáåêòà íåïðÿêî.
Åäíî òèïè÷íî èçïîëçóâàíå íà óêàçàòåëè å çà ñúçäàâàíå íà ñâúðçàíè ñïèñúöè è
óïðàâëåíèå íà îáåêòè, àäðåñèðàíè ïî âðåìå íà èçïúëíåíèå íà
ïðîãðàìàòà.
Âñåêè óêàçàòåë ñå ñâúðçâà ñ îïðåäåëåí òèï. Òèïúò íà äàííèòå
îïðåäåëÿ òèïà íà îáåêòà, êîéòî ùå áúäå àäðåñèðàí ÷ðåç óêàçàòåëÿ. Íàïðèìåð,
óêàçàòåë îò òèï int ùå ñî÷å îáåêò îò òèï int. Ñúîòâåòíî, çà äà ñî÷è îáåêò îò òèï
double óêàçàòåëÿò òðÿáâà äà ñå äåôèíèðà îò òèï double.
Ïàìåòòà, îòäåëåíà
çà åäèí óêàçàòåë, èìà ðàçìåð, íåîáõîäèì çà çàïèñâàíå íà àäðåñ â ïàìåòòà. Òîâà
îçíà÷àâà, ÷å óêàçàòåëè îò òèï int è óêàçàòåëè îò òèï double èìàò îáèêíîâåíî
åäíàêúâ ðàçìåð. Òèïà, àñîöèèðàí ñ óêàçàòåëÿ, îïðåäåëÿ êàê äà áúäå èíòåðïðåòèðàíî
ñúäúðæàíèåòî è êàêâà äà å äúëæèíàòà íà áèòîâàòà ïîñëåäîâàòåëíîñò íà òîçè àäðåñ
îò ïàìåòòà. Åòî íÿêîëêî ïðèìåðà íà äåôèíèöèè íà ïðîìåíëèâè óêàçàòåëè:
int
*ip1, *ip2;
unsigned char *ucp;
double *dp;
Äåôèíèöèÿòà íà óêàçàòåë
ñå ñúñòîè îò èäåíòèôèêàòîð, ïðåäõîæäàí îò îïåðàòîðà (“*”). Â ðàçäåëåíèÿ ñúñ
çàïåòàè ñïèñúê íà äåôèíèöèèòå îïåðàòîðúò * òðÿáâà äà ïðåäõîæäà âñåêè
èäåíòèôèêàòîð, êîéòî èñêàìå äà íè ñëóæè êàòî óêàçàòåë. Â ñëåäâàùèÿ ïðèìåð lp ñå
èíòåðïðåòèðà êàòî óêàçàòåë êúì ïðîìåíëèâà îò òèï long, à lp2 - êàòî äàííîâ îáåêò
îò òèï long, à íå êàòî óêàçàòåë.
long *lp, lp2;
 ïðèìåðà, êîéòî
ñëåäâà, fp ñå èíòåðïðåòèðà êàòî äàííîâ îáåêò îò òèï float, à fp2 ñå èíòåðïðåòèðà
êàòî óêàçàòåë êúì ïðîìåíëèâà îò òèï float:
float fpf, *fp2;
Çà
ïî-ãîëÿìà ÿñíîòà ñå ïðåïîðú÷âà äà ñå çàïèñâà
char *cp;
à
íå
char* cp;
Ìíîãî ÷åñòî, ïðîãðàìèñòúò, æåëàåù äà äåôèíèðà
ïî-êúñíî âòîðè óêàçàòåë êúì òèï char, ùå ïðîìåíè íåïðàâèëíî òàçè äåôèíèöèÿ
òàêà:
char* cp, cp2;
Äàäåí óêàçàòåë ìîæå äà áúäå èíèöèàëèçèðàí ñúñ
ñòîéíîñòòà çà çàïèñ (lvalue) íà äàííîâ îáåêò îò ñúùèÿ òèï. Ïðèïîìíÿìå, ÷å
îáåêòà, íàìèðàù ñå îò äÿñíî íà îïåðàòîðà çà ïðèñâîÿâàíå äàâà ñòîéíîñòòà çà
÷åòåíå (rvalue). Çà äà ñå èçâëå÷å ñòîéíîñòòà çà çàïèñ íà îáåêò à òðÿáâà äà ñå
ïðèëîæè ñïåöèàëåí îïåðàòîð. Òîé ñå íàðè÷à àäðåñåí îïåðàòîð è ñå çàïèñâà ñúñ
ñúìâîëà &. Íàïðèìåð,
int i = 1024;
int *ip = &i; // assign ip
the addres of i
Óêàçàòåë ìîæå äà áúäå èíèöèàëèçèðàí êàòî ñå èçïîëçóâà
äðóã óêàçàòåë îò ñúùèÿ òèï.  òîçè ñëó÷àé àäðåñíèÿò îïåðàòîð íå å
íåîáõîäèì:
int *ip2 = ip;
Âèíàãè ñå ñ÷èòà çà ãðåøêà àêî óêàçàòåë
ñå èíèöèàëèçèðà êàòî ñå èçïîëçóâà äàííîâ îáåêò îò òèï rvalue. Ñëåäíèòå
äåêëàðàöèè íÿìà äà áúäàò ïðèåòè çà ïðàâèëíè ïî âðåìå íà êîìïèëàöèÿ:
int i
= 1024;
int *ip = i; //error
Ãðåøíî å ñúùî óêàçàòåë äà ñå èíèöèàëèçèðà
÷ðåç ñòîéíîñòòà çà çàïèñ lvalue íà îáåêò îò ðàçëè÷åí òèï. Äåôèíèöèèòå íà uip è
uip2 ùå áúäàò îòáåëÿçàíè êàòî íåïðàâèëíè ïî âðåìå íà êîìïèëàöèÿ:
int i =
1024, *ip = &i; // ok
unsigned int *uip = &i; // illegal
*uip2 =
ip; // illegal
Ñ++ å ñòðîãî òèïèçèðàí åçèê. Âñè÷êè èíèöèàëèçàöèè è
ïðèñâîÿâàíèÿ íà ñòîéíîñòè ñå ïðîâåðÿâàò çà äà ñìå ñèãóðíè, ÷å òåçè ñòîéíîñòè ñà
êîðåêòíî ñúïîñòàâèìè. Àêî òå íå ñà è ñúùåñòâóâà ïðàâèëî çà ñúïîñòàâÿíåòî èì,
êîìïèëàòîðúò ùå ãî ïðèëîæè. Òîâà ïðàâèëî ñå íàðè÷à ïðàâèëî çà ïðåîáðàçóâàíå íà
òèïîâåòå. (âæ. ðàçäåë 2.10 çà ïîäðîáíîñòè). Àêî ïðàâèëî íÿìà, îïåðàòîðúò ñå
îòáåëÿçâà êàòî ãðåøåí. Æåëàòåëíî å òîâà äà áúäå èçâúðøâàíî, ïîíåæå íå å
áåçîïàñíî äà ñå ïðàâè èíèöèàëèçàöèÿ èëè ïðèñâîÿâàíå áåç ïðåîáðàçóâàùî ïðàâèëî è
âåðîÿòíî ùå áúäå ïîñëåäâàíî îò ïðîãðàìíà ãðåøêà ïî âðåìå íà
èçïúëíåíèå.
Áè ñëåäâàëî äà áúäå î÷åâèäíî çàùî å îïàñíî ïðèñâîÿâàíåòî íà
îáåêò îò òèï rvalue íà óêàçàòåë. Ïî äåôèíèöèÿ ñòîéíîñòòà íà óêàçàòåëÿ ïðåäñòàâÿ
àäðåñ â ïàìåòòà. Âñåêè îïèò çà ÷åòåíå èëè çàïèñ íà òîçè “àäðåñ” å
îïàñåí.
Ïî-íåÿñíî å çàùî ñúùåñòâóâà îïàñíîñò ïðè èíèöèàëèçèðàíå íà
óêàçàòåë ñúñ ñòîéíîñòòà çà çàïèñ íà îáåêò îò äðóã òèï. Íåêà ñå âúðíåì íàçàä è ñè
ïðèïîìíèì èäåÿòà, ÷å òèïúò íà óêàçàòåëÿ îïðåäåëÿ êàê äà áúäå èíòåðïðåòèðàíà
àäðåñèðàíàòà ïàìåò.
Íàïðèìåð, âúïðåêè ÷å, óêàçàòåë êúì ïðîìåíëèâà îò òèï
int è óêàçàòåë êúì ïðîìåíëèâà îò òèï double ìîãàò äà ñúäúðæàò åäèí è ñúù àäðåñ â
ïàìåòòà, ðàçìåðúò íà ïàìåòòà, îò êîÿòî ùå áúäå ÷åòåíî è çàïèñâàíî êàòî ñå
èçïîëçóâàò óêàçàòåëèòå ùå áúäå ðàçëè÷åí ïîðàäè ðàçëè÷íèÿ ðàçìåð íà int è double.
Îñâåí òîâà, îðãàíèçàöèÿòà è çíà÷åíèåòî íà áèòîâèòå ïîñëåäîâàòåëíîñòè ùå áúäå
ðàçëè÷íà çà ðàçëè÷íèòå òèïîâå.
Êàçàíîòî äî òóê íå îçíà÷àâà, ÷å
ïðîãðàìèñòúò íå áè ìîãúë äà ïðåâúðíå óêàçàòåë îò åäèí òèï êúì óêàçàòåë îò äðóã
òèï. Íåçàâèñèìî îò ôàêòà, ÷å òîâà å ïîòåíöèàëíî îïàñíî, òî áè ìîãëî äà áúäå
íàïðàâåíî, íî ñàìî àêî å îïèñàíî ÿâíî. (Ðàçäåë 3.10 ðàçãëåæäà ÿâíîòî
ïðåîáðàçóâàíå íà òèïîâåòå).
Óêàçàòåë îò ïðîèçâîëåí òèï ìîæå äà ïîëó÷è
ñòîéíîñò 0, êàòî òîâà ùå ïîêàçâà, ÷å â ìîìåíòà óêàçàòåëÿò íå àäðåñèðà äàííîâ
îáåêò. Ñòîéíîñòòà 0, êîãàòî ñå èçïîëçóâà êàòî ñòîéíîñò íà óêàçàòåë, ïîíÿêîãà ñå
íàðè÷à NULL. Ñúùåñòâóâà ñúùî ñïåöèàëåí òèï íà óêàçàòåë, void*, ñ êîéòî ìîæå äà
áúäå ïðèñâîåí àäðåñ íà îáåêò îò ïðîèçâîëåí äàííîâ òèï. (Ðàçäåë 3.10 ðàçãëåæäà
óêàçàòåëíèÿ òèï void*).
Çà äà èìàòå äîñòúï äî îáåêò ïî àäðåñ â óêàçàòåë
òðÿáâà äà ïðèëîæèòå îïåðàòîðà *. Íàïðèìåð,
int i = 1024;
int *ip =
&i; // ip now points to i
int k = *ip; // k now contains
1024
Êîãàòî íå å ïðèëîæåí îïåðàòîðà *, k ùå áúäå èíèöèàëèçèðàíà êàòî
àäðåñ íà i, à íå ÷ðåç íåéíàòà ñòîéíîñò, êîåòî ùå ïðåäèçâèêà ãðåøêà ïðè
êîìïèëàöèÿ.
int *ip = &i; // ip now points to i
int k = ip; //
error
Çà äà ïðèñâîèòå ñòîéíîñò íà îáåêò, ñî÷åí îò óêàçàòåë, òðÿáâà äà
ïðèëîæèòå îïåðàòîðà * êúì óêàçàòåëÿ. Íàïðèìåð,
int *ip = &i; // ip
now points to i
*ip = k; // i = k;
*ip = abs( *ip ); // i = abs(i);
*ip
= *ip + 1; // i = i + 1;
Ñëåäíèòå äâà îïåðàòîðà çà ïðèñâîÿâàíå äàâàò
ñúâñåì ðàçëè÷íè ðåçóëòàòè, âúïðåêè ÷å è äâàòà ñà êîðåêòíè. Ïúðâèÿò îïåðàòîð
óâåëè÷àâà àäðåñà êîéòî óêàçàòåëÿ ip ñúäúðæà; âòîðèÿò óâåëè÷àâà ñòîéíîñòòà íà
äàííîâèÿ îáåêò, êîéòî ip àäðåñèðà.
int i, j, k;
int *ip =
&i;
ip = ip + 2; // add to the address ip contains
*ip = *ip + 2; // i
= i + 2;
Êúì àäðåñíàòà ñòîéíîñò íà óêàçàòåëÿ ìîæå äà áúäå äîáàâÿíà èëè
èçâàæäàíà öÿëà ñòîéíîñò. Òîçè òèï îáðàáîòêà íà óêàçàòåëè, íàðè÷àí óêàçàòåëíà èëè
àäðåñíà àðèòìåòèêà, â íà÷àëîòî èçãëåæäà ìàëêî íååñòåñòâåí, äîêàòî íå îñúçíàåì,
÷å ñå îñúùåñòâÿâà ñúáèðàíå ñ äàííîâ îáåêò, à íå ñ îòäåëíà äåñåòè÷íà ñòîéíîñò.
Ò.å., äîáàâÿíåòî íà 2 êúì åäèí óêàçàòåë óâåëè÷àâà ñòîéíîñòòà íà àäðåñà, êîéòî
òîé ñúäúðæà, ñ ðàçìåðà íà äâà îáåêòà îò íåãîâèÿ òèïà. Íàïðèìåð, êàòî äîïóñíåì,
÷å òèïúò char çàåìà 1 áàéò, int - 4 áàéòà, à double - 8, äîáàâÿíåòî íà 2 êúì
äàäåí óêàçàòåë óâåëè÷àâà àäðåñíàòà ìó ñòîéíîñò ñúîòâåòíî ñ 2, 8 èëè 16 â
çàâèñèìîñò îò òèïà ìó char, int èëè double.
Óïðàæíåíèå 1-3. Äàäåíè ñà
ñëåäíèòå äåôèíèöèè:
int ival = 1024;
int *iptr;
double
*dptr;
ó÷àñòâóâàùè â ñëåäíèòå îïåðàòîðè çà ïðèñâîÿâàíå. Êîè îò òÿõ ñà
ïðàâèëíè? Îáÿñíåòå çàùî.
(a) ival = *iptr; (b) ival = iptr;
(c) *iptr
= ival; (d) iptr = ival;
(e) *iptr = &ival; (f) iptr = &ival;
(g)
dptr = iptr; (h) dptr = *iptr;
Óïðàæíåíèå 1-4. Íà äàäåíà ïðîìåíëèâà ñå
ïðèñâîÿâà åäíà îò ñëåäíèòå òðè ñòîéíîñòè:
0, 128 è
255.
Ðàçãëåäàéòå ïðåäèìñòâàòà è íåäîñòàòúöèòå íà äåêëàðèðàíåòî íà
ïðîìåíëèâàòà êàòî ïðèíàäëåæàùà íà íÿêîè îò ñëåäíèòå äàííîâè òèïîâå:
(a)
double (c) unsigned char
(b) int (d) char
Óêàçàòåëè êúì
íèçîâå
Íàé-÷åñòî óêàçàòåëè ñå äåôèíèðàò êúì ïðåäâàðèòåëíî äåôèíèðàíèÿ
äàííîâ òèï char*. Òîâà å òàêà, ïîíåæå öÿëàòà îáðàáîòêà íà íèçîâå â Ñ++ ñå
îñúùåñòâÿâà ÷ðåç ñèìâîëíè óêàçàòåëè. Òîçè ïîäðàçäåë ïîÿñíÿâà ïîäðîáíî
èçïîëçóâàíåòî íà char*. Â ãëàâà 6 ùå äåôèíèðàìå êëàñîâèÿ òèï
String.
Òèïúò íà ëèòåðàëíà íèçîâà êîíñòàíòà ïðåäñòàâëÿâà óêàçàòåë êúì
ïúðâèÿ ñèìâîë íà íèçà. Òîâà îçíà÷àâà, ÷å âñÿêà íèçîâà êîíñòàíòà å îò òèï char* è
ìîæå äà áúäå èíèöèàëèçàðàíà êàòî íèç ïî ñëåäíèÿ íà÷èí:
char *st = "The
expense of spiritn";
Ñëåäíàòà ïðîãðàìà, ïðîåêòèðàíà äà èç÷èñëÿâà
äúëæèíàòà íà st, èçïîëçóâà àäðåñíàòà àðèòìåòèêà çà ïðåãëåæäàíåòî íà íèçà. Èäåÿòà
å äà ñå çàâúðøè èçïúëíåíèåòî íà öèêúëà, êîãàòî áúäå ñðåùíàò íóëåâèÿ ñèìâîë,
ïîñòàâÿí îò êîìïèëàòîðà â êðàÿ íà âñÿêà ëèòåðàëíà íèçîâà êîíñòàíòà. Çà íåùàñòèå
ïðîãðàìàòà, êîÿòî ñìå íàïèñàëè å íåïðàâèëíà. Áèõòå ëè ìîãëè äà óñòàíîâèòå êàêâà
å ãðåøêàòà?
#include <stream.h>
char *st = "The expense of
spiritn";
main() {
int len = 0;
while ( st++ != ‘�’ ) ++len;
cout
<< len << ": " << st;
return 0;
}
Ãðåøêàòà â òàçè
ïðîãðàìà ïðîèçòè÷à îò ôàêòà, ÷å st íå å óêàçàíà. Ò.å.,
st++ !=
‘�’
ïðîâåðÿâà äàëè àäðåñà, ñî÷åí îò st å íóëåâèÿ ñèìâîë, à íå äàëè
àäðåñèðàíèÿò ñèìâîë å íóëåâèÿ. Óñëîâèåòî âèíàãè ùå ïîëó÷àâà ñòîéíîñò èñòèíà,
çàùîòî ïðè âñÿêà èòåðàöèÿ íà öèêúëà ñå äîáàâÿ åäèíèöà êúì àäðåñà íà
st.
Íàøàòà âòîðà âåðñèÿ íà ïðîãðàìàòà ïîïðàâÿ òàçè ãðåøêà. Òÿ ñå
èçïúëíÿâà äî êðàé. Çà íeùàñòèå, îáà÷å, èìà ãðåøêà â èçõîäà é. Íèçúò, àäðåñèðàí
îò st íå ñå îòïå÷àòâà. Áèõòå ëè ìîãëè äà îòêðèåòå ãðåøêàòà?
#include
<stream.h>
char *st = "The expense of spiritn";
main() {
int
len = 0;
while ( *st++ != ‘�’ ) ++len;
cout << len << ": "
<< st;
return 0;
}
Ãðåøêàòà ïðîèçòè÷à îò ôàêòà, ÷å st âå÷å íå
ñúäúðæà àäðåñà íà íèçîâàòà ëèòåðàëíà êîíñòàíòà. Òÿ å áèëà óâåëè÷àâàíà äî òîãàâà,
äî êàòî å îãðàíè÷åíà îò íóëåâèÿ ñèìâîë. Òîâà å ñèìâîëà, êîéòî ïðîãðàìàòà íàñî÷âà
êúì ñòàíäàðòíèÿ èçõîä. Íåîáõîäèìî å íÿêàê äà ñå âúðíåì íà àäðåñà íà íèçà. Åòî
åäíî ðåøåíèå íà òîçè ïðîáëåì:
st -= len;
cout << len << ":
" << st;
Ïðîãðàìàòà ìîæå äà áúäå êîìïèëèðàíà è èçïúëíåíà. Íî
èçõîäúò é âñå îùå å íåêîðåêòåí. Òîé èìà âèäà:
22: he expense of
spirit
Òîâà å ñâúðçàíî ñúñ ñàìîòî åñòåñòâî íà ïðîãðàìèðàíåòî. Ìîæåòå ëè
äà îòêðèåòå ãðåøêàòà, êîÿòî å äîïóñíàòà òîçè ïúò?
Íå å âçåò ïîä âíèìàíèå
îãðàíè÷èòåëíèÿ íóëåâ ñèìâîë íà íèçà. st òðÿáâà äà áúäå îòìåñòåíà ñ åäèíèöà â
ïîâå÷å îò äúëæèíàòà íà íèçà. Ïðàâèëåí å ñëåäíèÿ çàïèñ:
st -= len +
1;
Êîãàòî òàçè ïðîãðàìà áúäå êîìïèëèðàíà è èçïúëíåíà ùå ïîëó÷èì ñëåäíèÿ
ïðàâèëåí ðåçóëòàò: