
C/C++
Объясните значение операторов на скрине.
Почему оба способа являются одним и тем же? В интернете написано что ^-исключающее или, но я так и не понял, что это значит.


Если y не равен z и равен 1 (true) то y в степени z true
Артём Вящев
Там нет степени
Эти выражения не эквивалентны. Я написал небольшую программу, которая это показывает:
#include <iostream>
void test(int a, int b)
{
std::cout << a << " " << b << " !(a==b)==1: " << (!(a==b)==1) << std::endl;
std::cout << a << " " << b << " (a ^ b)==1: " << ((a ^ b)==1) << std::endl;
}
int main()
{
test(0,0);
test(4,8);
return 0;
}
#include <iostream>
void test(int a, int b)
{
std::cout << a << " " << b << " !(a==b)==1: " << (!(a==b)==1) << std::endl;
std::cout << a << " " << b << " (a ^ b)==1: " << ((a ^ b)==1) << std::endl;
}
int main()
{
test(0,0);
test(4,8);
return 0;
}
Борис Волохов
Ой-ой как Вы правы!
В первом случае вычисляется логическое выражение, и числовая константа 1 тоже преобразуется к логическому типу для участия в сравнении.
Во втором случае все величины числовые, и сравниваются именно числа. Чтобы оба случая были эквивалентны, необходимо левую часть привести к логическому типу.
…Ну, если оптимизировать решение, то достаточно во втором случае вместо == 1 писать != 0 .
В первом случае вычисляется логическое выражение, и числовая константа 1 тоже преобразуется к логическому типу для участия в сравнении.
Во втором случае все величины числовые, и сравниваются именно числа. Чтобы оба случая были эквивалентны, необходимо левую часть привести к логическому типу.
…Ну, если оптимизировать решение, то достаточно во втором случае вместо == 1 писать != 0 .
Олег, имеется ввиду тождественность логических выражений. Но в рамках C++ во первых лучше из обоих выражений изъять правые части (то есть == 1), а во вторых тождественность будет верна только в тех конструкциях, где предполагается логическое выражение (условное ветвление, заголовок цикла, и пр.). Например, if (!(y == z)) и if (y ^ z) будут работать одинаково, оттого что результат операции “Исключающее ИЛИ” неявно преобразуется к логическому типу.
Лучше сравнивать эти выражения алгоритмически. Имеется ввиду тот факт, что поразрядные числовые аналоги логических операций это отражение алгебры логики на двоичные элементы: двоичный 0 ассоциируется с логическим значением „ложь”, двоичная 1 ассоциируется с логическим значением „истина”. Тогда правила выполнения логических операций (типа утверждениеA И утверждениеB) могут быть перенесены в двоичную математику:
если результатом логической операции над утверждениями является третье утверждение, то результатом той же операции над двоичными цифрами должна стать некая двоичная цифра, аналогия только в смысле операций.
Олег, если бы Вы рассмотрели таблицу истинности Исключающего ИЛИ, то знали бы, что при сопоставлении утверждений истина означает, что утверждения противоположны по смыслу, ложь означает, что утверждения равноценны; при сопоставлении двоичных цифр 1 получается только из неодинаковых аргументов (0 xor 1 либо 1 xor 0), 0 свидетельствует о равенстве аргументов. Таким образом, если два целых числа сопоставить через Исключающее ИЛИ, то нулевой результат (во всех битах 0) показывает, что эти числа равны друг другу!!!
Лучше сравнивать эти выражения алгоритмически. Имеется ввиду тот факт, что поразрядные числовые аналоги логических операций это отражение алгебры логики на двоичные элементы: двоичный 0 ассоциируется с логическим значением „ложь”, двоичная 1 ассоциируется с логическим значением „истина”. Тогда правила выполнения логических операций (типа утверждениеA И утверждениеB) могут быть перенесены в двоичную математику:
если результатом логической операции над утверждениями является третье утверждение, то результатом той же операции над двоичными цифрами должна стать некая двоичная цифра, аналогия только в смысле операций.
Олег, если бы Вы рассмотрели таблицу истинности Исключающего ИЛИ, то знали бы, что при сопоставлении утверждений истина означает, что утверждения противоположны по смыслу, ложь означает, что утверждения равноценны; при сопоставлении двоичных цифр 1 получается только из неодинаковых аргументов (0 xor 1 либо 1 xor 0), 0 свидетельствует о равенстве аргументов. Таким образом, если два целых числа сопоставить через Исключающее ИЛИ, то нулевой результат (во всех битах 0) показывает, что эти числа равны друг другу!!!
Знаю, что исключающее или применяется в побитовых операциях, то есть два числа берутся в двоичной системе и каждый бит сравнивается с другим соответствующим битом, первый к первому, второй ко второму и тд. И этот оператор возвращает единицу, если только один из битов равен 1, иначе ноль
Похожие вопросы
- Логический оператор И и ИЛИ в Си
- Операторы преобразования типов в C++
- Помогите пожалуйста построить таблицу значений функции y = f(x) для x ∈ [a, b] с шагом h (с помощью условного оператора)
- Помогите пожалуйста уже голову сломал, ничего не получается, когда перегружаю шаблонный оператор << ,
- Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде
- Как разработать динамические переменные с помощью оператора new и при этом удалены оператором delete C++? Можно пример?
- Функцию или оператор надо сделать для класса? Cи++
- Перегрузка оператора c++
- Перегрузка операторов ввода-вывода для файловых потоков
- C++ слишком много значений инициализатора.