Логический оператор XOR в C++?

Существует интересная статья Joel Spolsky: основанное на доказательстве Планирование

1) Повреждение вЂ˜er вниз

, Когда я вижу расписание, измеряемое в днях или даже неделях, я знаю it’s, не собирающийся работать. Необходимо повредить расписание в очень маленькие задачи, которые могут измеряться в часах. Ничто дольше, чем 16 часов.

Это вынуждает Вас на самом деле выяснить то, что Вы собираетесь сделать. Запишите нечто подпрограммы. Создайте это диалоговое окно. Проанализируйте файл Fizzbott. Отдельные задачи разработки легко оценить, потому что you’ve записанные подпрограммы, создал диалоговые окна и проанализированные файлы прежде.

, Если Вы неаккуратны, и выбираете задачи недели большой тройки (например, фотография Ajax “Implement editor”), тогда Вы, haven’t думал о том, что Вы собираетесь сделать. Подробно. Шаг за шагом. И когда Вы, haven’t думал о том, что знают you’re, собирающиеся сделать, Вы can’t, сколько времени он возьмет.

Установка 16-часового максимума вынуждает Вас разработать проклятую функцию. Если у Вас есть ручная волнистая трехнедельная функция по имени фотография “Ajax editor” без детального проектирования, I’m извините, что были тем для повреждения ее Вам, но Вы официально обречены. Вы никогда не думали о шагах it’s собирающийся брать и you’re убеждающийся забыть многие из них.

основной момент - то, что он (и Вы) должен научиться на своих ошибках и принять их во внимание на следующей оценке.

кроме того, если бы Вы - разработчик, я сделал бы регулярный обзор кода в конце дня для получения лучшего понимания его процесса разработки.

И, конечно, меньшие повторения и больше гранулярности с задачами. Установите максимальную продолжительность задачи на 1 день. Это - правило, которое мы имеем.

271
задан jotik 12 May 2016 в 05:22
поделиться

5 ответов

The != operator serves this purpose for bool values.

503
ответ дан 23 November 2019 в 02:16
поделиться

Proper manual logical XOR implementation depends on how closely you want to mimic the general behavior of other logical operators (|| and &&) with your XOR. There are two important things about these operators: 1) they guarantee short-circuit evaluation, 2) they introduce a sequence point, 3) they evaluate their operands only once.

XOR evaluation, as you understand, cannot be short-circuited since the result always depends on both operands. So 1 is out of question. But what about 2? If you don't care about 2, then with normalized (i.e. bool) values operator != does the job of XOR in terms of the result. And the operands can be easily normalized with unary !, if necessary. Thus !A != !B implements the proper XOR in that regard.

But if you care about the extra sequence point though, neither != nor bitwise ^ is the proper way to implement XOR. One possible way to do XOR(a, b) correctly might look as follows

a ? !b : b

This is actually as close as you can get to making a homemade XOR "similar" to || and &&. This will only work, of course, if you implement your XOR as a macro. A function won't do, since the sequencing will not apply to function's arguments.

Someone might say though, that the only reason of having a sequence point at each && and || is to support the short-circuited evaluation, and thus XOR does not need one. This makes sense, actually. Yet, it is worth considering having a XOR with a sequence point in the middle. For example, the following expression

++x > 1 && x < 5

has defined behavior and specificed result in C/C++ (with regard to sequencing at least). So, one might reasonably expect the same from user-defined logical XOR, as in

XOR(++x > 1, x < 5)

while a !=-based XOR doesn't have this property.

41
ответ дан 23 November 2019 в 02:16
поделиться

Для истинной логической операции XOR это будет работать:

if(!A != !B) {
    // code here
}
230
ответ дан 23 November 2019 в 02:16
поделиться

Оператор XOR не может быть закорочен; т.е. вы не можете предсказать результат выражения XOR, просто оценив его левый операнд. Таким образом, нет причин предоставлять версию ^^ .

18
ответ дан 23 November 2019 в 02:16
поделиться

Я использую "xor" (кажется, это ключевое слово; в Code :: Blocks по крайней мере это выделяется полужирным шрифтом) так же, как вы можете использовать «и» вместо && и «или» вместо || .

if (first xor second)...

Да, это побитовое. Извините.

1
ответ дан 23 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: