Оператор не имеет результата требуется оператор с побочным действием

Оператор не имеет результата требуется оператор с побочным действием thumbnail

  Обновл. 21 Сен 2020  | 

На этом уроке мы рассмотрим логические операторы И, ИЛИ и НЕ в языке С++.

Логические операторы

В то время как операторы сравнения используются для проверки конкретного условия: ложное оно или истинное, они могут проверить только одно условие за определенный промежуток времени. Но бывают ситуации, когда нужно протестировать сразу несколько условий. Например, чтобы узнать, выиграли ли мы в лотерею, нам нужно сравнить все цифры купленного билета с выигрышными. Если в лотерее 6 цифр, то нужно выполнить 6 сравнений, все из которых должны быть true.

Также иногда нам нужно знать, является ли хоть одно из нескольких условий истинным. Например, мы не пойдем сегодня на работу, если больны или слишком устали, или если выиграли в лотерею. ???? Нам нужно проверить, является ли хоть одно из этих 3-х условий истинным. Как это сделать? С помощью логических операторов! Они позволяют проверить сразу несколько условий за раз.

В языке C++ есть 3 логических оператора:

ОператорСимволПримерОперация
Логическое НЕ!!xtrue, если x — false и false, если x — true
Логическое И&&x && ytrue, если x и y — true, в противном случае — false
Логическое ИЛИ||x || ytrue, если x или y — true, в противном случае — false

Логический оператор НЕ

Мы уже с ним сталкивались на уроке №34.

Логический оператор НЕ (!)
ОперандРезультат
truefalse
falsetrue

Если операндом является true, то, после применения логического НЕ, результатом будет false. Если же операнд до применения оператора НЕ был false, то после его применения станет true. Другими словами, логический оператор НЕ меняет результат на противоположный начальному значению. Он часто используется в условных выражениях:

bool bTooLarge = (x > 100); // переменная bTooLarge будет true, если x > 100

if (!bTooLarge)

    // Делаем что-нибудь с x

else

    // Выводим ошибку

Следует помнить, что логический оператор НЕ имеет очень высокий уровень приоритета. Новички часто совершают следующую ошибку:

#include <iostream>

int main()

{

int x = 5;

int y = 7;

if (!x == y)

std::cout << “x does not equal y”;

else

std::cout << “x equals y”;

return 0;

}

Результат выполнения программы:

х equals у

Но х ведь не равно у, как это возможно? Поскольку приоритет логического оператора НЕ выше, чем приоритет оператора равенства, то выражение ! х == у обрабатывается как (! х) == у. Так как х — это 5, то !x — это 0. Условие 0 == у ложное, поэтому выполняется часть else!

Напоминание: Любое ненулевое целое значение в логическом контексте является true. Так как х = 5, то х вычисляется как true, а вот !x = false, т.е. 0. Использование целых чисел в логических операциях подобным образом может запутать не только пользователя, но и самого разработчика, поэтому так не рекомендуется делать!

Правильный способ написания программы, приведенной выше:

#include <iostream>

int main()

{

int x = 5;

int y = 7;

if (!(x == y))

std::cout << “x does not equal y”;

else

std::cout << “x equals y”;

return 0;

}

Сначала обрабатывается х == у, а затем уже оператор НЕ изменяет результат на противоположный.

Правило: Если логический оператор НЕ должен работать с результатами работы других операторов, то другие операторы и их операнды должны находиться в круглых скобках.

Логический оператор ИЛИ

Если хоть одно из двух условий является истинным, то логический оператор ИЛИ является true.

Логический оператор ИЛИ (||)
Левый операндПравый операндРезультат
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

Рассмотрим следующую программу:

#include <iostream>

int main()

{

    std::cout << “Enter a number: “;

    int value;

    std::cin >> value;

    if (value== 0 || value== 1)

        std::cout << “You picked 0 or 1” << std::endl;

    else

        std::cout << “You did not pick 0 or 1” << std::endl;

    return 0;

}

Здесь мы использовали логический оператор ИЛИ, чтобы проверить, является ли хоть одно из двух условий истинным: левое (value == 0) или правое (value == 1). Если хоть одно из условий — true или оба сразу true, то выполняться будет стейтмент if. Если ни одно из условий не является true, то результат — false и выполняться будет стейтмент else.

Вы можете связать сразу несколько условий:

if (value == 0 || value == 1 || value == 2 || value == 3)

     std::cout << “You picked 0, 1, 2, or 3” << std::endl;

Новички иногда путают логическое ИЛИ (||) с побитовым ИЛИ (|). Хоть у них и одинаковые названия, функции они выполняют разные.

Логический оператор И

Только при условии, что оба операнда будут истинными, логический оператор И будет true. Если нет, тогда — false.

Логический оператор И (&&)
Левый операндПравый операндРезультат
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

Например, мы хотим узнать, находится ли значение переменной х в диапазоне от 10 до 20. Здесь у нас есть два условия: мы должны проверить, является ли х больше 10 и является ли х меньше 20.

#include <iostream>

int main()

{

    std::cout << “Enter a number: “;

    int value;

    std::cin >> value ;

    if (value > 10 && value < 20)

        std::cout << “Your value is between 10 and 20” << std::endl;

    else

        std::cout << “Your value is not between 10 and 20” << std::endl;

    return 0;

}

Если оба условия истинны, то выполняется часть if. Если же хоть одно или сразу оба условия ложные, то выполняется часть else.

Как и с логическим ИЛИ, мы можем комбинировать сразу несколько условий И:

if (value > 10 && value < 20 && value != 16)

    // Делаем что-нибудь

else

    // Делаем что-нибудь другое

Короткий цикл вычислений

Для того, чтобы логическое И возвращало true, оба операнда должны быть истинными. Если первый операнд вычисляется как false, то оператор И должен сразу возвращать false независимо от результата второго операнда (даже без его обработки). Это называется коротким циклом вычисления (англ. «short circuit evaluation») и выполняется он, в первую очередь, в целях оптимизации.

Аналогично, если первый операнд логического ИЛИ является true, то и всё условие будет true (даже без обработки второго операнда).

Как и в случае с оператором ИЛИ, новички иногда путают логическое И (&&) с побитовым И (&).

Использование логических операторов И/ИЛИ

Иногда возникают ситуации, когда смешивания логических операторов И и ИЛИ в одном выражении не избежать. Тогда следует знать о возможных проблемах, которые могут произойти.

Многие программисты думают, что логические И и ИЛИ имеют одинаковый приоритет (или забывают, что это не так), так же как и сложение/вычитание или умножение/деление. Тем не менее, приоритет логического И выше приоритета ИЛИ. Таким образом, операции с оператором И всегда будут вычисляться первыми (если только операции с ИЛИ не находятся в круглых скобках).

Рассмотрим следующее выражение: value1 || value2 && value3. Поскольку приоритет логического И выше, то обрабатываться выражение будет так:

value1 || (value2 && value3)

А не так:

(value1 || value2) && value3

Хорошей практикой является использование круглых скобок с операциями. Это предотвратит ошибки приоритета, увеличит читабельность кода и чётко даст понять компилятору, как следует обрабатывать выражения. Например, вместо того, чтобы писать value1 && value2 || value3 && value4, лучше записать (value1 && value2) || (value3 && value4).

Законы Де Моргана

Многие программисты совершают ошибку, думая, что !(x && y) — это то же самое, что и !x && !y. К сожалению, вы не можете использовать логическое НЕ подобным образом.

Законы Де Моргана гласят, что !(x && y) эквивалентно !x || !y, а !(x || y) эквивалентно !x && !y.

Другими словами, логические операторы И и ИЛИ меняются местами! В некоторых случаях, это даже полезно, так как улучшает читабельность.

А где же побитовое исключающее ИЛИ (XOR)?

Побитовое исключающее ИЛИ (XOR) — это логический оператор, который используется в некоторых языках программирования для проверки на истинность нечётного количества условий.

Побитовое исключающее ИЛИ (XOR)
Левый операндПравый операндРезультат
falsefalsefalse
falsetruetrue
truefalsetrue
truetruefalse

В языке C++ нет такого оператора. В отличии от логических И/ИЛИ, к XOR не применяется короткий цикл вычислений. Однако его легко можно сымитировать, используя оператор неравенства (!=):

if (a != b) … // a XOR b (предполагается, что a и b имеют тип bool)

Можно также расширить количество операндов:

Следует отметить, что вышеприведенные шаблоны XOR работают только, если операнды имеют логический (а не целочисленный) тип данных. Если вы хотите, чтобы это работало и с целыми числами, то используйте оператор static_cast.

Форма XOR, которая работает и с другими типами данных (с помощью оператора static_cast мы можем конвертировать любой тип данных в тип bool):

if (static_cast<bool>(a) != static_cast<bool>(b) != static_cast<bool>(c) != static_cast<bool>(d)) … // a XOR b XOR c XOR d, для любого типа, который может быть конвертирован в тип bool

Тест

Какой результат следующих выражений?

   Выражение №1: (true && true) || false

   Выражение №2: (false && true) || true

   Выражение №3: (false && true) || false || true

   Выражение №4: (5 > 6 || 4 > 3) && (7 > 8)

   Выражение №5: !(7 > 6 || 3 > 4)

Ответ

Примечание: В ответах объяснение выполняется с помощью стрелочки (=>). Например, (true || false) => true означает, что результатом выражения (true || false) является true.

   Выражение №1: (true && true) || false => true || false => true

   Выражение №2: (false && true) || true => false || true => true

   Выражение №3: (false && true) || false || true => false || false || true => false || true => true

   Выражение №4: (5 > 6 || 4 > 3) && (7 > 8) => (false || true) && false => true && false => false

   Выражение №5: !(7 > 6 || 3 > 4) => !(true || false) => !true => false

Оценить статью:

Загрузка…

Источник

Доброго времени суток!

Желание написать данную статью появилось после прочтения поста Перегрузка C++ операторов, потому что в нём не были раскрыты многие важные темы.

Самое главное, что необходимо помнить — перегрузка операторов, это всего лишь более удобный способ вызова функций, поэтому не стоит увлекаться перегрузкой операторов. Использовать её следует только тогда, когда это упростит написание кода. Но, не настолько, чтобы это затрудняло чтение. Ведь, как известно, код читается намного чаще, чем пишется. И не забывайте, что вам никогда не дадут перегрузить операторы в тандеме со встроенными типами, возможность перегрузки есть только для пользовательских типов/классов.

Синтаксис перегрузки

Синтаксис перегрузки операторов очень похож на определение функции с именем operator@, где @ — это идентификатор оператора (например +, -, <<, >>). Рассмотрим простейший пример:

class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
const Integer operator+(const Integer& rv) const {
return (value + rv.value);
}
};

В данном случае, оператор оформлен как член класса, аргумент определяет значение, находящееся в правой части оператора. Вообще, существует два основных способа перегрузки операторов: глобальные функции, дружественные для класса, или подставляемые функции самого класса. Какой способ, для какого оператора лучше, рассмотрим в конце топика.

В большинстве случаев, операторы (кроме условных) возвращают объект, или ссылку на тип, к которому относятся его аргументы (если типы разные, то вы сами решаете как интерпретировать результат вычисления оператора).

Перегрузка унарных операторов

Рассмотрим примеры перегрузки унарных операторов для определенного выше класса Integer. Заодно определим их в виде дружественных функций и рассмотрим операторы декремента и инкремента:

class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}

//унарный +
friend const Integer& operator+(const Integer& i);

//унарный –
friend const Integer operator-(const Integer& i);

//префиксный инкремент
friend const Integer& operator++(Integer& i);

//постфиксный инкремент
friend const Integer operator++(Integer& i, int);

//префиксный декремент
friend const Integer& operator–(Integer& i);

//постфиксный декремент
friend const Integer operator–(Integer& i, int);
};

//унарный плюс ничего не делает.
const Integer& operator+(const Integer& i) {
return i.value;
}

const Integer operator-(const Integer& i) {
return Integer(-i.value);
}

//префиксная версия возвращает значение после инкремента
const Integer& operator++(Integer& i) {
i.value++;
return i;
}

//постфиксная версия возвращает значение до инкремента
const Integer operator++(Integer& i, int) {
Integer oldValue(i.value);
i.value++;
return oldValue;
}

//префиксная версия возвращает значение после декремента
const Integer& operator–(Integer& i) {
i.value–;
return i;
}

//постфиксная версия возвращает значение до декремента
const Integer operator–(Integer& i, int) {
Integer oldValue(i.value);
i.value–;
return oldValue;
}

Теперь вы знаете, как компилятор различает префиксные и постфиксные версии декремента и инкремента. В случае, когда он видит выражение ++i, то вызывается функция operator++(a). Если же он видит i++, то вызывается operator++(a, int). То есть вызывается перегруженная функция operator++, и именно для этого используется фиктивный параметр int в постфиксной версии.

Бинарные операторы

Рассмотрим синтаксис перегрузки бинарных операторов. Перегрузим один оператор, который возвращает l-значение, один условный оператор и один оператор, создающий новое значение (определим их глобально):

class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
friend const Integer operator+(const Integer& left, const Integer& right);

friend Integer& operator+=(Integer& left, const Integer& right);

friend bool operator==(const Integer& left, const Integer& right);
};

const Integer operator+(const Integer& left, const Integer& right) {
return Integer(left.value + right.value);
}

Integer& operator+=(Integer& left, const Integer& right) {
left.value += right.value;
return left;
}

bool operator==(const Integer& left, const Integer& right) {
return left.value == right.value;
}

Во всех этих примерах операторы перегружаются для одного типа, однако, это необязательно. Можно, к примеру, перегрузить сложение нашего типа Integer и определенного по его подобию Float.

Аргументы и возвращаемые значения

Как можно было заметить, в примерах используются различные способы передачи аргументов в функции и возвращения значений операторов.

  • Если аргумент не изменяется оператором, в случае, например унарного плюса, его нужно передавать как ссылку на константу. Вообще, это справедливо для почти всех арифметических операторов (сложение, вычитание, умножение…)
  • Тип возвращаемого значения зависит от сути оператора. Если оператор должен возвращать новое значение, то необходимо создавать новый объект (как в случае бинарного плюса). Если вы хотите запретить изменение объекта как l-value, то нужно возвращать его константным.
  • Для операторов присваивания необходимо возвращать ссылку на измененный элемент. Также, если вы хотите использовать оператор присваивания в конструкциях вида (x=y).f(), где функция f() вызывается для для переменной x, после присваивания ей y, то не возвращайте ссылку на константу, возвращайте просто ссылку.
  • Логические операторы должны возвращать в худшем случае int, а в лучшем bool.

Оптимизация возвращаемого значения

При создании новых объектов и возвращении их из функции следует использовать запись как для вышеописанного примера оператора бинарного плюса.

return Integer(left.value + right.value);

Честно говоря, не знаю, какая ситуация актуальна для C++11, все рассуждения далее справедливы для C++98.
На первый взгляд, это похоже на синтаксис создания временного объекта, то есть как будто бы нет разницы между кодом выше и этим:

Integer temp(left.value + right.value);
return temp;

Но на самом деле, в этом случае произойдет вызов конструктора в первой строке, далее вызов конструктора копирования, который скопирует объект, а далее, при раскрутке стека вызовется деструктор. При использовании первой записи компилятор изначально создаёт объект в памяти, в которую нужно его скопировать, таким образом экономится вызов конструктора копирования и деструктора.

Особые операторы

В C++ есть операторы, обладающие специфическим синтаксисом и способом перегрузки. Например оператор индексирования []. Он всегда определяется как член класса и, так как подразумевается поведение индексируемого объекта как массива, то ему следует возвращать ссылку.

Оператор запятая

В число «особых» операторов входит также оператор запятая. Он вызывается для объектов, рядом с которыми поставлена запятая (но он не вызывается в списках аргументов функций). Придумать осмысленный пример использования этого оператора не так-то просто. Хабраюзер AxisPod в комментариях к предыдущей статье о перегрузке рассказал об одном.

Оператор разыменования указателя

Перегрузка этих операторов может быть оправдана для классов умных указателей. Этот оператор обязательно определяется как функция класса, причём на него накладываются некоторые ограничения: он должен возвращать либо объект (или ссылку), либо указатель, позволяющий обратиться к объекту.

Оператор присваивания

Оператор присваивания обязательно определяется в виде функции класса, потому что он неразрывно связан с объектом, находящимся слева от “=”. Определение оператора присваивания в глобальном виде сделало бы возможным переопределение стандартного поведения оператора “=”. Пример:

class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}

Integer& operator=(const Integer& right) {
//проверка на самоприсваивание
if (this == &right) {
return *this;
}
value = right.value;
return *this;
}
};

Читайте также:  Лекарство герцептин применение и побочные действия

Как можно заметить, в начале функции производится проверка на самоприсваивание. Вообще, в данном случае самоприсваивание безвредно, но ситуация не всегда такая простая. Например, если объект большой, можно потратить много времени на ненужное копирование, или при работе с указателями.

Неперегружаемые операторы

Некоторые операторы в C++ не перегружаются в принципе. По всей видимости, это сделано из соображений безопасности.

  • Оператор выбора члена класса “.”.
  • Оператор разыменования указателя на член класса “.*”
  • В С++ отсутствует оператор возведения в степень (как в Fortran) “**”.
  • Запрещено определять свои операторы (возможны проблемы с определением приоритетов).
  • Нельзя изменять приоритеты операторов

Рекомендации к форме определения операторов

Как мы уже выяснили, существует два способа операторов — в виде функции класса и в виде дружественной глобальной функции.
Роб Мюррей, в своей книге C++ Strategies and Tactics определил следующие рекомендации по выбору формы оператора:

Оператор Рекомендуемая форма
Все унарные операторыЧлен класса
= () [] -> ->*Обязательно член класса
+= -= /= *= ^= &= |= %= >>= <<=Член класса
Остальные бинарные операторыНе член класса

Почему так? Во-первых, на некоторые операторы изначально наложено ограничение. Вообще, если семантически нет разницы как определять оператор, то лучше его оформить в виде функции класса, чтобы подчеркнуть связь, плюс помимо этого функция будет подставляемой (inline). К тому же, иногда может возникнуть потребность в том, чтобы представить левосторонний операнд объектом другого класса. Наверное, самый яркий пример — переопределение << и >> для потоков ввода/вывода.

Литература

Брюс Эккель — Философия C++. Введение в стандартный C++.

Источник

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Ошибка    1   error C2079: “cn” использует неопределенный class “std::basic_ofstream<char,std::char_traits<char>>”    c:usersмирбекdesktopnewtonnewtonисходный код.cpp 11  1   Newton
Ошибка    101 error C2228: выражение слева от “.close” должно представлять класс, структуру или объединение c:usersмирбекdesktopnewtonnewtonисходный код.cpp 134 1   Newton
Ошибка    2   error C2228: выражение слева от “.open” должно представлять класс, структуру или объединение  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 12  1   Newton
Ошибка    43  error C2297: <<: недопустимо, правый оператор имеет тип “const char [10]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    44  error C2297: <<: недопустимо, правый оператор имеет тип “const char [11]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    54  error C2297: <<: недопустимо, правый оператор имеет тип “const char [11]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 77  1   Newton
Ошибка    53  error C2297: <<: недопустимо, правый оператор имеет тип “const char [14]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 77  1   Newton
Ошибка    16  error C2297: <<: недопустимо, правый оператор имеет тип “const char [2]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 42  1   Newton
Ошибка    57  error C2297: <<: недопустимо, правый оператор имеет тип “const char [2]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 77  1   Newton
Ошибка    6   error C2297: <<: недопустимо, правый оператор имеет тип “const char [3]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 35  1   Newton
Ошибка    24  error C2297: <<: недопустимо, правый оператор имеет тип “const char [3]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 54  1   Newton
Ошибка    30  error C2297: <<: недопустимо, правый оператор имеет тип “const char [3]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 57  1   Newton
Ошибка    40  error C2297: <<: недопустимо, правый оператор имеет тип “const char [3]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    76  error C2297: <<: недопустимо, правый оператор имеет тип “const char [30]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 96  1   Newton
Ошибка    88  error C2297: <<: недопустимо, правый оператор имеет тип “const char [30]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 127 1   Newton
Ошибка    98  error C2297: <<: недопустимо, правый оператор имеет тип “const char [30]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 130 1   Newton
Ошибка    69  error C2297: <<: недопустимо, правый оператор имеет тип “const char [31]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 94  1   Newton
Ошибка    3   error C2297: <<: недопустимо, правый оператор имеет тип “const char [37]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 32  1   Newton
Ошибка    48  error C2297: <<: недопустимо, правый оператор имеет тип “const char [4]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    62  error C2297: <<: недопустимо, правый оператор имеет тип “const char [4]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 83  1   Newton
Ошибка    79  error C2297: <<: недопустимо, правый оператор имеет тип “const char [4]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 102 1   Newton
Ошибка    82  error C2297: <<: недопустимо, правый оператор имеет тип “const char [4]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 109 1   Newton
Ошибка    7   error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 35  1   Newton
Ошибка    11  error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 36  1   Newton
Ошибка    15  error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 42  1   Newton
Ошибка    37  error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 69  1   Newton
Ошибка    42  error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    56  error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 77  1   Newton
Ошибка    66  error C2297: <<: недопустимо, правый оператор имеет тип “const char [5]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 93  1   Newton
Ошибка    21  error C2297: <<: недопустимо, правый оператор имеет тип “const char [6]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 54  1   Newton
Ошибка    27  error C2297: <<: недопустимо, правый оператор имеет тип “const char [6]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 57  1   Newton
Ошибка    34  error C2297: <<: недопустимо, правый оператор имеет тип “const char [6]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 60  1   Newton
Ошибка    47  error C2297: <<: недопустимо, правый оператор имеет тип “const char [6]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    64  error C2297: <<: недопустимо, правый оператор имеет тип “const char [6]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 83  1   Newton
Ошибка    85  error C2297: <<: недопустимо, правый оператор имеет тип “const char [6]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 118 1   Newton
Ошибка    18  error C2297: <<: недопустимо, правый оператор имеет тип “const char [63]”  c:usersмирбекdesktopnewtonnewtonисходный код.cpp 45  1   Newton
Ошибка    22  error C2297: <<: недопустимо, правый оператор имеет тип “const char [7]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 54  1   Newton
Ошибка    33  error C2297: <<: недопустимо, правый оператор имеет тип “const char [7]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 60  1   Newton
Ошибка    91  error C2297: <<: недопустимо, правый оператор имеет тип “const char [7]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 128 1   Newton
Ошибка    28  error C2297: <<: недопустимо, правый оператор имеет тип “const char [8]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 57  1   Newton
Ошибка    45  error C2297: <<: недопустимо, правый оператор имеет тип “const char [8]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    72  error C2297: <<: недопустимо, правый оператор имеет тип “const char [8]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 95  1   Newton
Ошибка    94  error C2297: <<: недопустимо, правый оператор имеет тип “const char [8]”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 129 1   Newton
Ошибка    8   error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 35  1   Newton
Ошибка    12  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 36  1   Newton
Ошибка    23  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 54  1   Newton
Ошибка    29  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 57  1   Newton
Ошибка    35  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 60  1   Newton
Ошибка    46  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 70  1   Newton
Ошибка    50  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 74  1   Newton
Ошибка    55  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 77  1   Newton
Ошибка    59  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 80  1   Newton
Ошибка    63  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 83  1   Newton
Ошибка    73  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 95  1   Newton
Ошибка    95  error C2297: <<: недопустимо, правый оператор имеет тип “double”   c:usersмирбекdesktopnewtonnewtonисходный код.cpp 129 1   Newton
Ошибка    4   error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 32  1   Newton
Ошибка    9   error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 35  1   Newton
Ошибка    13  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 36  1   Newton
Ошибка    19  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 45  1   Newton
Ошибка    25  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 54  1   Newton
Ошибка    31  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 57  1   Newton
Ошибка    38  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 69  1   Newton
Ошибка    51  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 74  1   Newton
Ошибка    60  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 80  1   Newton
Ошибка    67  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 93  1   Newton
Ошибка    70  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 94  1   Newton
Ошибка    74  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 95  1   Newton
Ошибка    77  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 96  1   Newton
Ошибка    80  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 102 1   Newton
Ошибка    83  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 109 1   Newton
Ошибка    86  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 118 1   Newton
Ошибка    89  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 127 1   Newton
Ошибка    92  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 128 1   Newton
Ошибка    96  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 129 1   Newton
Ошибка    99  error C2563: несоответствие в списке формальных параметров c:usersмирбекdesktopnewtonnewtonисходный код.cpp 130 1   Newton
Ошибка    5   error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 32  1   Newton
Ошибка    10  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 35  1   Newton
Ошибка    14  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 36  1   Newton
Ошибка    20  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 45  1   Newton
Ошибка    26  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 54  1   Newton
Ошибка    32  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 57  1   Newton
Ошибка    39  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 69  1   Newton
Ошибка    52  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 74  1   Newton
Ошибка    61  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 80  1   Newton
Ошибка    68  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 93  1   Newton
Ошибка    71  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 94  1   Newton
Ошибка    75  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 95  1   Newton
Ошибка    78  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 96  1   Newton
Ошибка    81  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 102 1   Newton
Ошибка    84  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 109 1   Newton
Ошибка    87  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 118 1   Newton
Ошибка    90  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 127 1   Newton
Ошибка    93  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 128 1   Newton
Ошибка    97  error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 129 1   Newton
Ошибка    100 error C2568: <<: не удается разрешить перегрузку функции c:usersмирбекdesktopnewtonnewtonисходный код.cpp 130 1   Newton
    102 IntelliSense: недопустимый неполный тип  c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 11  11  Newton
    103 IntelliSense: недопустимый неполный тип  c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 12  2   Newton
    129 IntelliSense: недопустимый неполный тип  c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 134 2   Newton
    115 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [14]   c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 77  7   Newton
    105 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [3]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 35  5   Newton
    113 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [3]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 70  7   Newton
    121 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [30]   c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 96  8   Newton
    125 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [30]   c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 127 6   Newton
    128 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [30]   c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 130 6   Newton
    119 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [31]   c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 94  8   Newton
    104 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [37]   c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 32  5   Newton
    117 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [4]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 83  7   Newton
    122 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [4]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 102 8   Newton
    123 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [4]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 109 7   Newton
    106 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [5]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 36  5   Newton
    107 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [5]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 42  6   Newton
    112 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [5]    c:UsersМирбекDesktopNewtonNewtonИсходный код.cpp 69  7   Newton
    118 IntelliSense: отсутствует оператор “<<“, соответствующий этим операндам
            типы операндов: std::ofstream << const char [5]    c:UsersМирбекDesktopNewtonNewtonИсходн?

Читайте также:  Побочные действия окситоцина после родов