C/C++

Объясните значение операторов на скрине.

Почему оба способа являются одним и тем же? В интернете написано что ^-исключающее или, но я так и не понял, что это значит.
Если y не равен z и равен 1 (true) то y в степени z true
Олег Вернюк
Олег Вернюк
71 517
Лучший ответ
Артём Вящев Там нет степени
Эти выражения не эквивалентны. Я написал небольшую программу, которая это показывает:

#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;
}
Viktop Cedakov
Viktop Cedakov
58 065
Борис Волохов Ой-ой как Вы правы!
  В первом случае вычисляется логическое выражение, и числовая константа 1 тоже преобразуется к логическому типу для участия в сравнении.
  Во втором случае все величины числовые, и сравниваются именно числа. Чтобы оба случая были эквивалентны, необходимо левую часть привести к логическому типу.
  …Ну, если оптимизировать решение, то достаточно во втором случае вместо == 1 писать != 0 .
  Олег, имеется ввиду тождественность логических выражений. Но в рамках C++ во первых лучше из обоих выражений изъять правые части (то есть == 1), а во вторых тождественность будет верна только в тех конструкциях, где предполагается логическое выражение (условное ветвление, заголовок цикла, и пр.). Например, if (!(y == z)) и if (y ^ z) будут работать одинаково, оттого что результат операции “Исключающее ИЛИ” неявно преобразуется к логическому типу.

  Лучше сравнивать эти выражения алгоритмически. Имеется ввиду тот факт, что поразрядные числовые аналоги логических операций это отражение алгебры логики на двоичные элементы: двоичный 0 ассоциируется с логическим значением „ложь”, двоичная 1 ассоциируется с логическим значением „истина”. Тогда правила выполнения логических операций (типа утверждениеA И утверждениеB) могут быть перенесены в двоичную математику:
    если результатом логической операции над утверждениями является третье утверждение, то результатом той же операции над двоичными цифрами должна стать некая двоичная цифра, аналогия только в смысле операций.

  Олег, если бы Вы рассмотрели таблицу истинности Исключающего ИЛИ, то знали бы, что при сопоставлении утверждений истина означает, что утверждения противоположны по смыслу, ложь означает, что утверждения равноценны; при сопоставлении двоичных цифр 1 получается только из неодинаковых аргументов (0 xor 1 либо 1 xor 0), 0 свидетельствует о равенстве аргументов. Таким образом, если два целых числа сопоставить через Исключающее ИЛИ, то нулевой результат (во всех битах 0) показывает, что эти числа равны друг другу!!!
М А
М А
16 172
М А   А в C++, чтобы не ошибиться, следует писать (bool)(y ^ z), а можно даже проще: (y ^ z) != 0
Знаю, что исключающее или применяется в побитовых операциях, то есть два числа берутся в двоичной системе и каждый бит сравнивается с другим соответствующим битом, первый к первому, второй ко второму и тд. И этот оператор возвращает единицу, если только один из битов равен 1, иначе ноль
Леонид Марков
Леонид Марков
1 019