მთავარი  |    ფორუმი  |    FAQ  |    წესები  |    რეკლამა ჩვენთან  |    კონტაქტი  |    რუქა






ადგილმდებარეობა  მთავარი » სტატიები » პროგრამირება
რამეში ვერ უგებენ C და C++ ერთმანეთს? თუ . . . 1

    ერთ-ერთ ცნობილ პროგრამისტს - შილდტს თავის ერთ-ერთ პოპულარულ ბესთსელერში მოყვანილი აქვს რამოდენიმე მნიშვნელოვანი განსხვავება C და C++-ს შორის. ეს განსხვავებები ეხება ამ ორ ენაში არსებულ სანდარტებს, მაგრამ როგორც ცნობილია კონკრეტული ფირმის კონკრეტულ კომპილატორებში არის ერთდროულად, როგორც მხარდაჭერა სტანდარტისადმი, ასევე საკმაო გადახრა მისგან. როგორც წესი განსაკუთრებულ ორიგინალობას ყოველთვის Microsoft-ი იჩენს ხოლმე; ვნახოთ როგორ არის რეალიზებული მის პროდუქციაში ამ პროგრამირების ენის პროგრესის ფენომენი.

    ვიყენებ შემდეგ კომპილატორებს: MS Visual C++ 7.0  და  MS Quick C 2.0.

    “თუ C++-ში ფუნქცია აბრუნებს void-ისაგან განსახვავებულ ტიპს, მაშინ return ინსტრუქციაში უნდა იყოს ასეთივე ტიპის მნიშვნელობა”. ვნახოთ რა ხდება პრაქტიკაში;

    ჯერ დავადგეთ C-ს:

#include "stdio.h"

int F(void);
int F(void)
{
    return 2;
}
void main(void)
{
    printf("%d",F());
}

    აი რას დაგვიწერს პროგრამა შესრულების შემდეგ:

 

Image at http://g3b.ge

    ესე იგი შედეგი ნორმალურია. პასუხია 2.

    ახლა შევცვალოთ მნიშვნელობა - ვთქვათ, 2-ის მაგიერ 2.3423: პროგრამა დაწერს ისევ 2-ს;

    ზუსტად ასევე იქცევა C++-იც.

    სხვათაშორის ეს, ამ ორივე ენის საერთო სენია; მაგალითად, პასკალისგან განსხვავებით, რომელიც ტიპების შეუსაბამობის დროს მაშინვე გამოიჩენს ჯელნტმენობას და გამოიტენს შეტყობინებას შეცდომის შესახებ, C++-ს გამოაქვს ერთი გაფრთხილება, რომ შეიძლება მოხდეს მონაცემთა დაკარგვაო, მე გაგაფრთხილე და შენ თავში ქვაც გიხლიაო და მერე წყნარად შეასრულებს exe ფაილს. რაც შეეხება C-ს, ჩემი დიდი მოლოდინისდა მიუხედავად მან ამ კოდის კომპილირებისას ის ერთი გაფრთხილებაც კი არ გამოიტანა.

    ქვემოთ მოცემულია შესაბამისი კოდი C++-თვის და ცომპილაციის შემდეგ გამოტანილი გაფრთხილება:

#include "iostream"
using namespace
std;

int F();
int F()
{

     return 2.3423;
}
void main()
{

     cout << F() << endl;
}

    გაფრთხილება: warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data.

    ბევრს ვერაფერს მოვთხოვთ C-ს მას შემდეგ რაც წავიკითხავთ შილდტის შემდეგ ფრაზას; აი რას გვეუბნევა:

1. თუ C-ში ფუნქციის დასაბრუნებელი ტიპი void-ისგან განსვავდება მაშინ ფაქტიურად მას არც მოეთხოვება რაიმეს დაბრუნება.

2. თუ მნიშვნელობა არ არის return-ში, მაშინ იგი აბრუნებს განუსაზღვრელ მნიშვნელობას.

3. C-ში თუ ფუნქციის მიერ დასაბრუნებელი ტიპი ცხადად არ არის მოცემული მაშინ იგი აბრუნებს მთელ ტიპს. C++-ში ასეთი წესი არ არის, ესე იგი დასაბრუნებელი ტიპი უნდა მიეთითოს ცხადად- ო.

    ვნახოთ პირველი:

#include "stdio.h"

int F(void);
int F(void)
{

}
void main(void)
{
     printf("%d",F());
     printf("%s","\nFree Text");
}

ფუნქცია არაფერს არ აბრუნებს. მივაკომპილოთ და გავუშვათ:

 

Image at http://www.g3b.ge

    დაგვიწერა 0; ვნახოთ ახლა C++-ში:

#include"iostream"
using namespace std;

int F();
int F()
{

}

void main()
{

     cout << F() << endl;
}

    აი შედეგიც: error C4716: 'F' : must return a value. როგორც სჩანს C++ ევოლუციის უფრო მაღალ სტადიაზეა J.

    განვიხილოთ მეორე ფრაზა. “თუ მნიშვნელობა არ არის return-ში, მაშინ იგი აბრუნებს განუსაზღვრელ მნიშვნელობას.”გვაქვს კოდი:

#include "stdio.h"

int F(void);
int F(void)
{
     return;
}
void main(void)
{
     printf("%d",F());
     printf("%s","\nFree Text");
}

    შედეგად დაწერს 0-ს. ახლა ვნახოთ C++; აი პასუხიც error C2561: 'F' : function must return a value.

    და ბოლოს, მესამე ფრაზა: “C-ში თუ ფუნქციის მიერ დასაბრუნებელი ტიპი ცხადად არ არის მოცემული მაშინ იგი აბრუნებს მთელ ტიპს. C++-ში ასეთი წესი არ არის, ესე იგი დასაბრუნებელი ტიპი უნდა მიეთითოს ცხადად”

#include "stdio.h"

F(void);
F(void)
{
     return 3.45;
}
void main(void)
{
     printf("%d",F());
     printf("%s","\nFree Text");
}

    კომპილირება, გაშვება და პასუხიც სახეზეა: 3.

    ახლა ვნახოთ C++-ში:

#include "iostream"
using namespace std;

F();
F()
{
     return 3.45;
}
void main()
{

     cout << F() << endl;
}

    ამ შემთხვევაში მან იკადრა რომ C-დან მემკვიდრეობით მიეღო რაღაც თვისება და თავი მაინცდამაინც არ გაუგიჟებია შეცდომების გამოტანით, მაგრამ სინდისი ეყო და ბოლოს მაინც შემოეფრთხილა, სასხვათაშიროსოდ: warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data. . . . და ჩვეული სისწრაფით გამოვარდა Console ფანჯარა.

    პრინციპში აქ ბევრი რამე კომპილატორის რეალიზაციაზეც არის დამოკიდებული. შეგიძლიათ შეამოწმოთ იგივე კოდი Borland-ში: Turbo C++-ზე ან Builder-ზე. ჩემის აზრით ნებისმიერ კომპილატორს უნდა ჰქონდეს სტანდარტისადმი სრული მხარდაჭერა და თუ საჭიროა დაემატოს კიდევ რაღაც რაღაცეები. როგორც გამოცდილება მკარნახობს Borland-ი ამ საკითხებში უფრო მეტ გულისხმიერებას იჩენს ხოლმე, თუმცა ამას არ ვამტკიცებ – უბრალოდ შემოწმება უნდა.

    სულ ეს იყო.

    შემდეგ სტატიებში განვიხილავთ სხვა მსგავს “გაუგებრობებსაც”.

 რეზიუმე
ეგეც შენი Microsoft-ი.   გაუგებ რამეს?. . .

 

ავტორი: გიორგი ბაწაშვილი (G3B)

  
ინფორმაცია


თემატური სტატიები




ბმულები შესაბამის თემაზე


სტატიის შეფასება
ეს გვერდი უკვე შეაფასეს!

შეფასება: 1
შეფასება: 1



გამოხმაურება

აღდგენილია სტატიის საწყისი ვარიანტი
07-02-2010, 10:57:29 | G3B

რავი თვითონ პროგრამებში არის პატარ პატარა შეცდომები ;) ისე ლინკებს თუ დადებდი MS Visual C++ 7.0 და ბორლანდოსი კარგი იქნებოდა :)
04-07-2008, 11:04:20 | bakurmefe


კომენტარის დატოვება
თქვენ არ შეგიძლიათ კომენტარების დატოვება.