2013 10 01_lecture_04

20
Лекция 4. Встроенные типы, инструкции и операторы. С++ Basics. Valery Lesin, 2013 1

description

 

Transcript of 2013 10 01_lecture_04

Page 1: 2013 10 01_lecture_04

Лекция 4. Встроенные типы,

инструкции и операторы.

С++ Basics. Valery Lesin, 2013 1

Page 2: 2013 10 01_lecture_04

Встроенные типы

С++ Basics. Valery Lesin, 2013 2

Группа Тип Литералы

Логический bool true, false

Символьный char, wchar_t ‘a’, ‘\n’, ‘\t’, L’xy’

Целый int 0, 5, 0xef, 045

short [int] 32767

long [int] 56L, -1234567L

unsigned [int] 765u

Вещественный long double 6.626e-34L

double 2.71, .56, 2., 6e24

float 3.1415f

Page 3: 2013 10 01_lecture_04

Размеры типов

С++ Basics. Valery Lesin, 2013 3

12345

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(long double)sizeof(T) == sizeof(signed T)== sizeof(unsigned T)

• Ограничения типа: std::numeric_limits<type>

• Не полагайтесь на размер, для этого есть

uint16_t, int64_t и т.д.

Page 4: 2013 10 01_lecture_04

Явное приведение типов• Базовые типы неявно приводятся друг у другу.

Многие с потерей значимости (warning).

С++ Basics. Valery Lesin, 2013 4

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

float* pfv; const int* piv; short sv;

int* a = (int*)pfv; // 1. C-stylechar b(sv); // 2. constructor

double pi = 3.1415;int ipi = static_cast<int>(pi); //---int* c = reinterpret_cast<int*>(pfv); //---int* d = const_cast<int*>(piv);//---derived* d = dynamic_cast<derived*>(base);

Page 5: 2013 10 01_lecture_04

Тип void

• Указатель на void:

С++ Basics. Valery Lesin, 2013 5

1.2.3.4.5.

void *p = 0, *q = 0;bool eq = (p == q);void do_smth(int value);int main (void); // C-stylevoid nothing; // wrong!

1.2.3.4.5.6.7.8.9.10.

void send(const void* data, size_t size);//...X* ptr = ...;send(ptr, sizeof(X));//-------------------------------------------void receive_X(const void* data, size_t size){

Assert(size == sizeof(X));X const* ptr = static_cast<X const*>(data);

}

Page 6: 2013 10 01_lecture_04

null terminated strings

• Одинаковые литералы могут размещаться в одном месте

• Спец. символы: ‘\t’ ‘\r’ ‘\n’ ‘\a’

С++ Basics. Valery Lesin, 2013 6

1.2.3.4.5.6.7.

const char str [] = "Hello"; // native typechar can_edit[] = "can change this string";char* c_style = "old style string"; // don't change it

const char ml [] = "this is""multiline\string";

null terminated string std::string

char* a = “…”, *b = “…”; string a = “…”, b = “…”;

strcmp(a, b) == 0; a == b;

strcpy(a,b); a = b;

Page 7: 2013 10 01_lecture_04

Перечисления enum

• Нет неявного приведения из целого типа

• Пользовательский тип - можно, например, переопределить операторы

С++ Basics. Valery Lesin, 2013 7

1.

2.

3.

4.

5.

6.

enum msg_type{

mt_setup,mt_request = 0x10,mt_response

};

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

int process_msg(msg_type type, const void* data){

switch(type){case mi_setup : return process_setup (*static_cast<setup *>(data));case mi_request : return process_request (*static_cast<request *>(data));case mi_response: return process_response(*static_cast<response*>(data));default: throw std::runtime_error("unknown message");}

} // hidden error! where?

Page 8: 2013 10 01_lecture_04

Синоним имени typedef

• Задает синоним имени, не задает новый тип

• Делает код короче – проще читать

• Платформонезависимые типы

• «Протаскивает» тип через шаблон

• Имеет внутреннюю компоновку

С++ Basics. Valery Lesin, 2013 8

1.

2.

3.

typedefstd::map<std::string, student> students_t;

Page 9: 2013 10 01_lecture_04

И еще раз про объявления

• Идентификаторы: буквы, цифры, _ (начало не с цифры). Длина не ограничена стандартом, но часто реализацией

• Объявление через запятую – остается только базовый тип (не делайте так!):

С++ Basics. Valery Lesin, 2013 9

Необязательный

спецификатор (e.g.

extern, virtual)

Базовый тип Объявляющая

часть

Необязательный

инициализатор

--- const char array[] = “Hello, World!”

1.2.

int* x, y = 1, *const z = 0; // int* x; int y = 1; int *const z = 0;

Page 10: 2013 10 01_lecture_04

Области действия и видимости

С++ Basics. Valery Lesin, 2013 10

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.

int uno; // = 0

void foobar(){

int due; // = 'trash‘int& quatro = due;

int uno = 1;::uno = 2; // uno != ::uno

if (true){

double due = 8.31;T tre = func(&tre);quatro = 2; // due <line 5> == 2

}}

Page 11: 2013 10 01_lecture_04

Структуры struct

С++ Basics. Valery Lesin, 2013 11

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.

struct student{

string name;double av_score;

};

student peter = {"Peter", 4.68};student* paul = new student;

paul->name = "Paul";paul->av_score = 3.96;

struct size_test{

short mem1;bool mem2;int mem4;

};

sizeof(size_test) == 8; // not 7, at least on my computer

Page 12: 2013 10 01_lecture_04

Структуры struct, часть 2

С++ Basics. Valery Lesin, 2013 12

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

struct list;struct node{

list* owner; // correctnode* next ; // correctT data ;

};

// declarationsextern list my_list;list make_list();void sort_list(list&);

// definitionslist wrong; list* ok; make_list(); // wrong, need sizesort_list(wrong); // hmm, wrong?

// equivalence// Эти структуры задают разные типыstruct my_class {int x; int y;};struct your_class{int x; int y;};

Page 13: 2013 10 01_lecture_04

Операторы

С++ Basics. Valery Lesin, 2013 13

Семантика Синтаксис

Область видимости [namespace|class]::name

Выбор члена object.memberptr->member

Доступ по индексу pointer[]

Вызов функции expr(expr-list)

Постфиксный инкремент lvalue++

Идентификатор типа typeid({expr|type})

Преобразование типов static_cast<type>(expr)

Взятие размера sizeof({expr|type})

Унарные префиксные операторы ~lvalue

Разыменование *expr

Выделение/освобождение памяти new type (expr-list)

Page 14: 2013 10 01_lecture_04

Операторы, часть 2

С++ Basics. Valery Lesin, 2013 14

Семантика Синтаксис

Бинарные арифметические операторы expr * expr

Сдвиги expr << expr

Бинарные операторы сравнения expr < expr

Бинарные логические операторы expr || expr

Условное выражение expr ? expr : expr

Присваивания expr = expr

expr <<= expr

expr += expr

Генерация исключения throw expr

Запятая expr, expr

Page 15: 2013 10 01_lecture_04

Выражения

• Результат:

– Расширение к большему (например, *)

– Логическое выражение bool

– Там, где можно, lvalue (a=b=c)

• Порядок вычисления в общем случае не определен

• Исключение: ленивое вычисление && и || на встроенных типах

С++ Basics. Valery Lesin, 2013 15

1.2.3.4.

f(a) + f(b)// what would you get here?if (var & mask == 0){...}if (0<=x<=99) {...}

Page 16: 2013 10 01_lecture_04

Инкремент/Декремент

• Префиксный: изменил, вернул новое значение

• Постфиксный: изменил, вернул старое значение

С++ Basics. Valery Lesin, 2013 16

1.2.3.4.5.6.7.8.9.

int a = ++x;int b = x += 1;

int c = x++;int t;int d = (t = x, x += 1, t);

// prefer prefix ++for (auto it = cont.begin(); it != cont.end(); ++it);

Page 17: 2013 10 01_lecture_04

Инструкция (statement) выбора

С++ Basics. Valery Lesin, 2013 17

1.2.3.4.5.

if (ptr p = get_pointer(...))if (connected(p))

disconnect(p);else

connect (p);

1.2.3.4.5.6.7.8.9.10.11.12.13.

switch(id){btn_yes:

apply_changes();btn_no :

close_doc ();break;

btn_cancel:continue_editing();break;

default:Log("Unexpected btn " << id);

}

• switch– окончание ветки: break, return, throw, exit(0)

– для определения переменных потребуются скобки {}

Page 18: 2013 10 01_lecture_04

Циклы

• Управление циклом:

– досрочный выход: break, return, throw, exit(0)

– продолжение: continue

С++ Basics. Valery Lesin, 2013 18

1.2.3.4.5.6.7.8.9.10.

for (init; condition; modification) {}while(condition) {}do{} while(condition)

// examplesfor (size_t i = 0, size = strlen(src); i < size; ++i)

dest[i] = src[i];

while(*dest++ = *src++); // don't do this

Page 19: 2013 10 01_lecture_04

Комментарии

• Лучше вообще без комментариев, чем нерелевантные комментарии

• Если можно выразить кодом, не пишите комментарии

• Сложный алгоритм – дай ссылку на статью

• Желательно написать: – сложный код (например, оптимизация)

– а-ля разметка (окончание namespace)

– в заголовке файла (зачем он, copyright)

С++ Basics. Valery Lesin, 2013 19

1.2.3.

// one line /* multi

line */

Page 20: 2013 10 01_lecture_04

Вопросы?

С++ Basics. Valery Lesin, 2013 20