LINUX.ORG.RU

xor в C++. Так, есть или нет?

 ,


0

2

Из книги Г. Шилдта — «C++. Базовый курс»:

Несмотря на то что C++ не содержит встроенный логический оператор «исключающее ИЛИ» (XOR)...

В книге говорится, что оператор xor в C++ нет, но g++ (v. 5.4.0) на инструкции

cout << "P XOR Q: " << (p xor q) << '\n';
не возмущается. Так, есть или нет оператор xor в C++? Или его добавили в новых стандартах?



Последнее исправление: Mg_usr (всего исправлений: 1)

ИМХО есть. А что тебе мешает проверить на примере?

a1ur0n
()

xor
логический оператор «исключающее ИЛИ»
логический

xor == ^ == битовый оператор. Видимо, имеется в виду, что есть && и ||, а ^^ отсутствует. Но в нём и смысла нет, для xor надо всегда два операнда вычислять, чтобы определить результат.

xaizek ★★★★★
()

В C++ есть все операторы, которые есть в C, в том числе и xor — ^. Если тебе нужнен логический xor, а не побитовый, то да, его нет, но его можно получить с помощью имеющихся логических операторов

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)

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

Есть логические операторы и есть бинарные. Биты маленькие, поэтмоу бинарные операторы состоят из одного символа «^», а логические из двух (кроме отрицания). Так вот оператора «^^» в C++ нет.

anonymous
()

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

xor 00000
    00100
---------
        1
Битовый оператор:
xor 00000
    00100
---------
    00100
Шилдт прав, ты - нет. Не путай их.

PPP328 ★★★★★
()
Ответ на: комментарий от DonkeyHot

Логический xor называется "!=", нужно только типы поприводить.

Да, если забыть про досрочные вычисления. А если не забывать, то != и ^^ вполне могли бы быть разными операторами.

Crocodoom ★★★★★
()

Ответу только одно. C90, iso646.h, там все это есть (побитовое, правда). xor == ^

Meyer ★★★★★
()
Последнее исправление: Meyer (всего исправлений: 1)
Ответ на: комментарий от anonymous

По поводу книги Шилдта

не читай Шилдта
ты бы хотя бы отзывы о нем почитал в интернете

На pikabu отзывы были исключительно положительные. ))

А вот здесь уже не так радужно:

и вобще, есть же список https://stackoverflow.com/a/388282

Да, посоветовали уже. Посмотрел тогда, почитал отзывы и выбрал книгу Stanley Lippman — «C++ Primer». Начал изучать по этой книге, но на 31 с. сдался (оператор расширения области видимости :: испугал; на wiki почитал как эта билибирда называется:) ). Да и перевод на русский чуть корявый.

А что говорит accu.org по поводу этой книги?

Ну что ж, придётся не сдаватся. )

P.S. Спасибо, anon!

Mg_usr
() автор топика
Ответ на: комментарий от Crocodoom

Да, если забыть про досрочные вычисления. А если не забывать, то != и ^^ вполне могли бы быть разными операторами.

Что за досрочные вычисления? Здесь же один фиг оба параметра вычислять.

anonymous
()
Ответ на: комментарий от anonymous

x ^^ y ^^ y = x, значение y можно не вычислять (а значит не будет побочных эффектов)

Ну понятно, что всё зависит от реализиции XOR.

Crocodoom ★★★★★
()

xaizek:

xor == ^ == битовый оператор. Видимо, имеется в виду, что есть && и ||, а ^^ отсутствует.

XMs:

В C++ есть все операторы, которые есть в C, в том числе и xor — ^. Если тебе нужнен логический xor, а не побитовый, то да, его нет...

Да, в книге имеется в виду, что в C++ логического оператора ^^ нет. (я уже это понял, до побитовых операторов не дошёл ещё)

но его можно получить с помощью имеющихся логических операторов

Ниже в книге приводится пример как:

bool xor(bool a, bool b)
{
    return (a || b) && !(a && b);
}


PPP328:

Шилдт прав, ты - нет. Не путай их.

Хорошо, больше не буду путать кто прав и кто — нет. :)

Mg_usr
() автор топика
Ответ на: комментарий от Crocodoom

Это не верно.'short-circuit evaluation' имеет отношение к конкретному оператору, если есть смысл. Для логического xor это, очевидно, не имеет смысла.

То, о чем говоришь ты и приводишь пример, это частный случай оптимизации выражений. И такие оптимизации должны проводиться в рамках стандарта: положено вычислять все аргументы? Будут вычислены. Порядок вычисления аргументов определен? Нет. И т.п.

(Мне то самому не нравится отсутствие логического оператора xor в с++, т.к. выглядит неоднородно)

Deleted
()
Ответ на: комментарий от Deleted

Как оператор ^^ был бы записан в стандарт - этого никто не знает. Но если бы он был записан туда вместе с тем правилом оптимизации x ^^ y ^^ y == x, то тут же бы стал отличаться от оператора !=. А такая оптимизация вполне резонна, если уж этот оператор вводить.

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

x ^^ y ^^ y = x, значение y можно не вычислять (а значит не будет побочных эффектов)

Видимо, я сильно отстал от жизни в плюсах. Неужели с++ научился гарантировать (y == y) в случае наличия побочных эффектов внутри y ?

DonkeyHot ★★★★★
()
Последнее исправление: DonkeyHot (всего исправлений: 1)

Если тебе нужен логический xor, а не побитовый, то да, его (в C++) нет...

Мне то самому не нравится отсутствие логического оператора xor в с++, т.к. выглядит неоднородно

А в Pascal и логический, и побитовый, операторы xor есть. 1:0 )

Mg_usr
() автор топика

Зачем вообще может понадобится логический xor? при работе с числами в условиях можно использовать и бинарный, ведь значение отличное от нуля это true. А осмысленные условия типа

if (fileHasOpenned(file) ^^ a = 5)
мне сложно представить.

SR_team ★★★★★
()
Ответ на: комментарий от Deleted

Хорошо, пусть будет "x ^^ y ^^ y эквивалентно y"

Хотя особой проблемы в операторе сравнения не вижу, мы ведь говорим о bool

Crocodoom ★★★★★
()

На pikabu отзывы были исключительно положительные

Вот это ты толсто вбросил.

А в Pascal и логический, и побитовый, операторы xor есть. 1:0 )

Ничто не мешает перейти на Паскаль)

meliafaro ★★★★★
()
Ответ на: комментарий от meliafaro

Ничто не мешает перейти на Паскаль)

Я на обратном пути)

Mg_usr
() автор топика
Ответ на: комментарий от DonkeyHot

Нет, не научился :) Спасибо за поправку.

Значит, остаётся только скорость вычисления выражения (в тех случаях, когда компилятор может гарантировать y == y). Но такое можно провернуть и с !=, так что нужды в отдельном операторе нет.

Crocodoom ★★★★★
()
Ответ на: комментарий от Mg_usr

Множества фишек Паскаля и С++ если и пересекаются, но уж точно ниодно не принадлежит другому. С теплотой вспоминаю свое обучение в 9 классе на паскале. И понимаю, что сейчас я уже больше 10 лет не использовал его.

Deleted
()
Ответ на: комментарий от SR_team

А осмысленные условия типа

if (fileHasOpenned(file) ^^ a = 5)
мне сложно представить.

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

const86 ★★★★★
()
Ответ на: По поводу книги Шилдта от Mg_usr

А разве функция main() может возвращать что-то ещё? void main()? — не, не слышал)

Здрасьте. Из C++ стандарта

3.6.1 Main function [basic.start.main] 1 A program shall contain a global function called main, which is the designated start of the program. It is implementation-defined whether a program in a freestanding environment is required to define a main function. [Note: in a freestanding environment, start-up and termination is implementation-defined; startup contains the execution of constructors for objects of namespace scope with static storage duration; termination contains the execution of destructors for objects with static storage duration. ] 2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined.

Так что не особо ты авторитетное мнение привел.

anonymous
()

Из книги Г. Шилдта — «C++. Базовый курс»:

Выкинь бяку.

Оператор есть, реализован ЕМНИП #define'ом, но на практике в реальном коде я его не встречал. То есть популярностью не пользуется.

DELIRIUM ☆☆☆☆☆
()

У a != b такая же таблица истинности как у XOR (:

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.