2013-06-21 4 views
10

иногда я хотел бы сделатьIs & = гарантированно ведет себя как гипотетический && = оператор?

bool success= true; 
success &&= dosmthing1(); 
success &&= dosmthing2(); 
success &&= dosmthing3(); 
if (success) 

Позволяет игнорировать, что я мог бы использовать исключение ... моего вопроса является то, гарантируемым C++ стандарта, который &= будет вести себя как несуществующие &&= для моего случая использования? не ...

EDIT: сделать smthing-s возвращение Его

+1

Как все может вести себя как нечто, чего не существует? Не настоящий вопрос. – EJP

+5

@EJP Извините, но я действительно сомневаюсь, что у кого-нибудь возникнут проблемы с представлением о том, как будет выглядеть этот гипотетический '&& =', если он существует, помимо двусмысленности в отношении короткого замыкания, но это может быть очень хорошо запрошено у OP (кто вероятно, вообще не думал о коротком замыкании). Не настоящий сдержанный голос. –

+0

@ChristianRau Я знаю о SCEval, но tbh Я не думал об этом, задавая это Q – NoSenseEtAl

ответ

9

Это зависит от того, как вы ожидаете, &&= работать. Если вы хотите, чтобы x &&= y(); был эквивалентен x = x && y();, тогда нет, потому что в этом выражении y() не вызывается, если x начинается как false, но в x &= y(); будет.

Если вы не ожидаете, что это короткое замыкание, и все ваше выражение действительно имеет тип bool (не что-то конвертируемое в bool, как указатели, целые числа или определенные пользователем объекты), он работает. Однако это много ограничений.

+0

Требование к короткому замыканию является критическим. Если 'doSomething1()' возвращает false, 'doSomething2' и' doSomething3' не следует вызывать (я думаю). –

+0

@JamesKanze иногда мне нужно вызывать все функции иногда я не – NoSenseEtAl

+0

@NoSenseEtAl Если вам нужно вызвать все функции, вы не можете использовать '&&', независимо. Вся суть '&&' заключается в том, что это короткие замыкания, останавливающиеся при первом аргументе, который возвращает false. –

4

Нет; это не короткое замыкание.

bool x = false; 
x &= (cout << "You shouldn't see me!"); 
+0

Даже если это было короткое замыкание, побитовая операция по-прежнему отличается от логической. –

+1

@ H2CO3 Если оба аргумента имеют тип 'bool', то единственным отличием между' & 'и' && 'является короткое замыкание. (Вот почему, например, нам не нужен оператор '^^'. Поскольку эксклюзивный или никогда не закорачивается, нет необходимости в коротком замыкающем операторе.) –

+1

@JamesKanze True. За исключением того, что иногда это был бы удобный ярлык для контекстно-преобразованного-к-bool-и-не-равного. – Angew

6

Нет, & поразрядное и & & это логическое и. Если dosmthing * возвращает что-то отличное от 1 или 0, результаты будут разными.

+0

Не имеет значения для булевых. Но это правда, что если функции dosmething не возвращают bool, это может иметь значение. –

+0

@SebastianRedl Почему бы и нет? Конечно. Булевы не являются 1-битными значениями. –

+1

Концептуально, они есть. Что касается поразрядной арифметики, то они есть. –

4

Они совершенно разные. В этом случае короткое замыкание && представляется важным: если dosmthing1() возвращает ложь, dosmthing2 и dosmthing3 не будет вызван, если вы использования &&. Они будут вызываться, если вы используете &.

В данном конкретном случае, почему бы просто не написать:

success = dosmthing1() 
     && dosmthing2() 
     && dosmthing3(); 

Это кажется столь же ясно (по крайней мере, отформатированный как это), и избегает необходимости &&=.

Смежные вопросы