1 / 32

Типове и декларации

Типове и декларации. Доц. д-р Владимир Димитров e-mail: cht@fmi.uni-sofia.bg Web: cht_co.tripod.com Wap: http://www.wapdrive.com/cht_co. Типове Фундаментални типове Булев тип Символни типове Символни литерали Цели типове Цели литерали Реални типове Реални литерали Размери Тип void

dougal
Download Presentation

Типове и декларации

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Типове и декларации Доц. д-р Владимир Димитров e-mail: cht@fmi.uni-sofia.bg Web: cht_co.tripod.com Wap: http://www.wapdrive.com/cht_co

  2. Типове Фундаментални типове Булев тип Символни типове Символни литерали Цели типове Цели литерали Реални типове Реални литерали Размери Тип void Изброявания Декларации Структура на декларациите Деклариране на няколко имена едновременно Имена Област на действие Инициализация Обекти и lvalue typedef Заключение Съдържание

  3. Типове x = y + f(2); float x; // x is a floating­ point variable i inty = 7; // y is an integer variable with the initial value 7 float f(int); // f is a function taking an argument of type int and returning a floating­point number

  4. Фундаментални типове §4.2 A Boolean type (bool) §4.3 Character types (such as char) §4.4 Integer types (such as int) §4.5 Floating­ point types (such as double) §4.8 Enumeration types for representing specific sets of values (enum) §4.7 A type, void, used to signify the absence of information §5.1 Pointer types (such as int*) §5.2 Array types (such as char[]) §5.5 Reference types (such as double&) §5.7 Data structures and classes

  5. Булев тип1 void f(int a,int b) { bool bl = a==b;// = is assignment, == is equality //... } bool is_open(File*); bool greater(int a, int b) { return a>b; } bool b = 7; // bool(7) is true, so b becomes true int i = true;// int(true) is 1, so i becomes 1

  6. Булев тип2 void g() { bool a = true; bool b = true; bool x = a+b; // a+b is 2, so x becomes true bool y = a | b;// a | b is 7, so y becomes true }

  7. Символни типове char ch = 'a'; #include <iostream> intmain() { char c; std::cin >> c; std::cout <<"the value of'"<< c <<"' is " << int(c) << '\n'; }

  8. Цели типове 0123497612345678901234567890 decimal:026383 octal: 00020770123 hexadecimal: 0x00x20x3f0x53

  9. Реални типове 1.23.230.231.1.0 1.2e10 1.23e-15 65.43 e - 21 3.14159265f 2.0f 2.997925F

  10. Размери1 1 sizeof(char)  sizeof(short)  sizeof(int)  sizeof(long) 1 sizeof(bool)  sizeof(long) sizeof(char)  sizeof(wchar_t)  sizeof(long) sizeof(float)  sizeof(double)  sizeof(longdouble) sizeof(N)  sizeof(signed N)  sizeof(unsigned N)

  11. Размери 2 char: 'a' bool: 1 short: 756 int: 100000000 int*: &c1 double: 1234567e34 char[14]: Hello, world!\0

  12. Размери 3 #include <limits> intmain() { cout << " largest float == " << numeric_limits<float>:: max() << ", char is signed == " << numeric_limits<char>::is_signed << '\n'; }

  13. Тип void void x; // error: there are no void objects void f();// function f does not return a value void* pv; // pointer to object of unknown type

  14. Изброявания1 enum { ASM, AUTO, BREAK }; enum keyword { ASM, AUTO, BREAK }; voidf(keyword key) { switch(key) { case ASM: // do something break; case BREAK: // do something break; } }

  15. Изброявания2 enum e1 { dark, light };// range 0:1 enum e2 { a = 3, b = 9 }; // range 0:15 enum e3 { min = -10, max = 1000000 }; // range -1048576:1048575 enum flag { x=1, y=2, z=4, e=8 }; // range 0:15 flag fl = 5; // type error: 5 is not of type flag flag f2 = flag(5); // ok: flag(5) is of type flag and within the range of flag flag f3 = flag(z | e); // ok:flag(12) is of type flag and within the range of flag flag f4 = flag(99); // undefined: 99 is not within the range of flag

  16. Декларации 1 char ch; string s; int count = 1; constdouble pi = 3.1415926535897932385; externint error_number; // int error_number = 1; char* name = "Njal"; char* season[] = { "spring", "summer", "fall", "winter" }; struct Date{int d, m, y; }; int day(Date* p) { return p->d; } double sqrt(double); // double sqrt(double) { /* … */ }; template<class T> T abs (T a) { return a<0 ? -a : a; } typedef complex<short> Point; struct User; // struct User { /* … */ }; enum Beer { Carlsberg, Tuborg, Thor } ; namespace NS { int a; }

  17. Декларации 2 int count; int count; // error: redefinition externint error _number; externshort error_number;// error: type mismatch externint error_number; externint error_number; struct Date { int d, m, y; }; typedef complex<short> Point; int day(Date* p) { return p->d; } constdouble pi =3.1415926535897932385;

  18. Декларации 3 void f() { int count = 1; char* name = "Bjarne"; // ... count = 2; name = "Marian"; }

  19. Структура на декларацията char* kings[] = { "Antigonus", "Seleucus", "Ptolemy" }; * pointerprefix *constconstant pointerprefix & referenceprefix [] array postfix () function postfix const c = 7; // error: no type gt(int a, int b) { return (a>b) ? a : b; } // error: no return type unsigned ui; // ok: 'unsigned' is the type 'unsignedint' long li;//ok: 'long'is the type 'longint'

  20. Декларация на множество имена int x, y; //int x; inty; int* p, y; //int* p; int y; NOT int* y; int x, *q; // int x;int* q; int v[70], *pv; //int v[10];int* pv;

  21. Имена hellothis_is_a_most_unusually_long_name DEFINEDfoObAru_nameHorseSense var0 var1 CLASS_class ___ 012a fool$sysclass3var pay.duefoo-bar.nameif

  22. Област на действие1 int x; // global x void f() { int x; // local x hides global x x = 1; // assign to local x { int x; // hides first local x x = 2;// assign to second local x } x = 3; // assign to first local x } int* p = &x; // take address of global x

  23. Област на действие 2 int x; void f2() { int x = 1; // hide global x ::x = 2; // assign to global x x = 2; // assign to local x // ... }

  24. Област на действие 3 int x; void f3() { int x = x; // perverse: initialize x with its own (uninitialized) value } int x= 11; void f4()// perverse: { int y = x; // use global x: y = 11 int x = 22; y = x; // use local x: y = 22 }

  25. Област на действие 4 void f5(int x) { int x; // error }

  26. Инициализация int a;// means "int a = 0;" double d;// means "double d= 0.0;" void f() { int x; // x does not have a well-defined value // ... } int a[] = { 1, 2 };// array initializer Point z(1, 2); // function-style initializer (initialization by constructor) int f(); // function declaration

  27. typedef typedefchar* Pchar; Pchar p1, p2; // pi and p2 are char*s char* p3 = p1; typedefunsignedchar uchar; typedefint int32; typedefshort int16; typedeflong int32;

  28. Съвети 1 • Поддържай малки области на действие • Не използвай едно и също име дадена област на действие и обхващащата я • Декларирай по едно име в декларация • Стреми се обичайните и локалните имена да са кратки, необичайните и нелокалните имена да са по-дълги • Избягвай имена, които визуално си приличат • Поддържай цялостен стил на именоване

  29. Съвети 2 • Избирай внимателно имената, така че да отразяват смилъла, а не реализацията на променливата • Използвай typedefза да дефинираш име за вграден тип в случайте, при които вграденият тип се използва за представяне на стойност, и който тип може да се промени • Използвай typedefза да дефинираш синоними; използвай изброявания и класове за да дефинираш нови типове

  30. Съвети 3 • Във всяка декларация трябва да се задава тип (няма intпо премълчаване) • Избягвай излишни предположения за числовите стойности на символите • Избягвай излишни предположения за размера на целите числа • Избягвай излишни предположения за диапазона на реалните числа • За предпочитане е intпред shortintили longint

  31. Съвети 4 • За предпочитане е doubleпред floatили longdouble • За предпочитане е charпред signedcharи unsignedchar • Избягвай излишни предположения за размерите на обектите • Избягвай аритметиката без знак • Разгреждай с подозрение преобразуванията от signedв unsignedи от unsignedв signed

  32. Съвети 5 • Разгреждай с подозрениепреобразуванията от реални към цели числа • Разгреждай с подозрениепреобразуванията към по-малки типове, напр. от intкъм char

More Related