320 likes | 475 Views
Типове и декларации. Доц. д-р Владимир Димитров e-mail: cht@fmi.uni-sofia.bg Web: cht_co.tripod.com Wap: http://www.wapdrive.com/cht_co. Типове Фундаментални типове Булев тип Символни типове Символни литерали Цели типове Цели литерали Реални типове Реални литерали Размери Тип void
E N D
Типове и декларации Доц. д-р Владимир Димитров e-mail: cht@fmi.uni-sofia.bg Web: cht_co.tripod.com Wap: http://www.wapdrive.com/cht_co
Типове Фундаментални типове Булев тип Символни типове Символни литерали Цели типове Цели литерали Реални типове Реални литерали Размери Тип void Изброявания Декларации Структура на декларациите Деклариране на няколко имена едновременно Имена Област на действие Инициализация Обекти и lvalue typedef Заключение Съдържание
Типове 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 floatingpoint number
Фундаментални типове §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
Булев тип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
Булев тип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 }
Символни типове char ch = 'a'; #include <iostream> intmain() { char c; std::cin >> c; std::cout <<"the value of'"<< c <<"' is " << int(c) << '\n'; }
Цели типове 0123497612345678901234567890 decimal:026383 octal: 00020770123 hexadecimal: 0x00x20x3f0x53
Реални типове 1.23.230.231.1.0 1.2e10 1.23e-15 65.43 e - 21 3.14159265f 2.0f 2.997925F
Размери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)
Размери 2 char: 'a' bool: 1 short: 756 int: 100000000 int*: &c1 double: 1234567e34 char[14]: Hello, world!\0
Размери 3 #include <limits> intmain() { cout << " largest float == " << numeric_limits<float>:: max() << ", char is signed == " << numeric_limits<char>::is_signed << '\n'; }
Тип 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
Изброявания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; } }
Изброявания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
Декларации 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; }
Декларации 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;
Декларации 3 void f() { int count = 1; char* name = "Bjarne"; // ... count = 2; name = "Marian"; }
Структура на декларацията 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'
Декларация на множество имена 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;
Имена hellothis_is_a_most_unusually_long_name DEFINEDfoObAru_nameHorseSense var0 var1 CLASS_class ___ 012a fool$sysclass3var pay.duefoo-bar.nameif
Област на действие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
Област на действие 2 int x; void f2() { int x = 1; // hide global x ::x = 2; // assign to global x x = 2; // assign to local x // ... }
Област на действие 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 }
Област на действие 4 void f5(int x) { int x; // error }
Инициализация 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
typedef typedefchar* Pchar; Pchar p1, p2; // pi and p2 are char*s char* p3 = p1; typedefunsignedchar uchar; typedefint int32; typedefshort int16; typedeflong int32;
Съвети 1 • Поддържай малки области на действие • Не използвай едно и също име дадена област на действие и обхващащата я • Декларирай по едно име в декларация • Стреми се обичайните и локалните имена да са кратки, необичайните и нелокалните имена да са по-дълги • Избягвай имена, които визуално си приличат • Поддържай цялостен стил на именоване
Съвети 2 • Избирай внимателно имената, така че да отразяват смилъла, а не реализацията на променливата • Използвай typedefза да дефинираш име за вграден тип в случайте, при които вграденият тип се използва за представяне на стойност, и който тип може да се промени • Използвай typedefза да дефинираш синоними; използвай изброявания и класове за да дефинираш нови типове
Съвети 3 • Във всяка декларация трябва да се задава тип (няма intпо премълчаване) • Избягвай излишни предположения за числовите стойности на символите • Избягвай излишни предположения за размера на целите числа • Избягвай излишни предположения за диапазона на реалните числа • За предпочитане е intпред shortintили longint
Съвети 4 • За предпочитане е doubleпред floatили longdouble • За предпочитане е charпред signedcharи unsignedchar • Избягвай излишни предположения за размерите на обектите • Избягвай аритметиката без знак • Разгреждай с подозрение преобразуванията от signedв unsignedи от unsignedв signed
Съвети 5 • Разгреждай с подозрениепреобразуванията от реални към цели числа • Разгреждай с подозрениепреобразуванията към по-малки типове, напр. от intкъм char