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

Обновл. 21 Сен 2020 |
На этом уроке мы рассмотрим логические операторы И, ИЛИ и НЕ в языке С++.
Логические операторы
В то время как операторы сравнения используются для проверки конкретного условия: ложное оно или истинное, они могут проверить только одно условие за определенный промежуток времени. Но бывают ситуации, когда нужно протестировать сразу несколько условий. Например, чтобы узнать, выиграли ли мы в лотерею, нам нужно сравнить все цифры купленного билета с выигрышными. Если в лотерее 6 цифр, то нужно выполнить 6 сравнений, все из которых должны быть true.
Также иногда нам нужно знать, является ли хоть одно из нескольких условий истинным. Например, мы не пойдем сегодня на работу, если больны или слишком устали, или если выиграли в лотерею. ???? Нам нужно проверить, является ли хоть одно из этих 3-х условий истинным. Как это сделать? С помощью логических операторов! Они позволяют проверить сразу несколько условий за раз.
В языке C++ есть 3 логических оператора:
Оператор | Символ | Пример | Операция |
Логическое НЕ | ! | !x | true, если x — false и false, если x — true |
Логическое И | && | x && y | true, если x и y — true, в противном случае — false |
Логическое ИЛИ | || | x || y | true, если x или y — true, в противном случае — false |
Логический оператор НЕ
Мы уже с ним сталкивались на уроке №34.
Логический оператор НЕ (!) | |
Операнд | Результат |
true | false |
false | true |
Если операндом является 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.
Логический оператор ИЛИ (||) | ||
Левый операнд | Правый операнд | Результат |
false | false | false |
false | true | true |
true | false | true |
true | true | true |
Рассмотрим следующую программу:
#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.
Логический оператор И (&&) | ||
Левый операнд | Правый операнд | Результат |
false | false | false |
false | true | false |
true | false | false |
true | true | true |
Например, мы хотим узнать, находится ли значение переменной х в диапазоне от 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) | ||
Левый операнд | Правый операнд | Результат |
false | false | false |
false | true | true |
true | false | true |
true | true | false |
В языке C++ нет такого оператора. В отличии от логических И/ИЛИ, к XOR не применяется короткий цикл вычислений. Однако его легко можно сымитировать, используя оператор неравенства (!=):
if (a != b) … // a XOR b (предполагается, что a и b имеют тип bool) |
Можно также расширить количество операндов:
if (a != b != c != d) … // a XOR b XOR c XOR d (предполагается, что a, b, c и d имеют тип 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Исходн? |