2016-12-20 14 views
1

Этот код, который я нашел при просмотре кода. Есть ли скрытая проблема в этом коде или это просто отлично?Результат логического оператора OR как rvalue

myBool = myBoolA || (oldState == AS_PLAYING); //code #1 

Edit: Одна опечатка (myBoolA вместо myBool) со мной создали некоторые неприятные путаницы; Мне очень жаль.

На самом деле код, который будет рассмотрен в:

myBool = myBool || (oldState == AS_PLAYING); //code #1, not myBoolA 

и мой Рекомендованное код:

if(oldState == AS_PLAYING) myBool = true; //code #2 

Преимущества с кодом # 2 IMO:

  1. лучше читаемость
  2. если myBool не инициализирован, чтобы начать wi th, не будет неопределенного поведения.
+2

Ваше предложение как есть не имеет такого же значения. Вы полностью отказались от 'myBoolA' – StoryTeller

+3

Две строки, которые вы показываете, не эквивалентны. –

+0

Ну вторая версия не использует 'myBoolA', но, скорее всего, это хороший совет, чтобы не пытаться использовать все на одной строке. – DeiDei

ответ

8

myBool = myBoolA || (oldState == AS_PLAYING); абсолютно нормально.

|| является точкой последовательности в C++, так что даже если выражение на правой стороне, зависит от левой стороны (возможно oldState является ссылки наmyBool или myBoolA), поведение будет определяться.

Ваша рекомендация в изменении этого значения

if(oldState == AS_PLAYING) myBool = true;

фактически функционально отличается (присваивание myBool отличается, например), так что не изменить его к этому.

И наконец, обратите внимание, что замыкающий контакт || устраняется, если || перегружен. Поэтому всегда проверяйте это при рефакторинге кода.

+1

+1 для фактического ответа на вопрос вместо того, чтобы просто указывать на ошибку. Это должен быть правильный ответ. – KyleKW

+0

Спасибо. В спешке я ошибочно набрал 'myBool' как' myBoolA'. –

+0

@SauravSahu - также обратите внимание. Это, если 'oldState == AS_PLAYING' был на самом деле более экспансивной проверкой, ваше предложение будет * всегда * преформировать его. Хотя исходный код пропустит его, когда он не требуется. – StoryTeller

1

В соответствии с вашими комментариями позже,

Вы можете реорганизовать следующим образом:

if(!myBool) 
    myBool = (oldState == AS_PLAYING); 

это позволит сэкономить одну дополнительную операцию присваивания. когда myBool имеет значение до if

+0

И это не единственная проблема со вторым утверждением, поскольку он не будет устанавливать 'myBool'' false'. –

1

myBool = myBoolA || (oldState == AS_PLAYING); // код # 1 представляется правильной версией.

Ваша версия не эквивалентна этому. Как? См.

если myBoolA является истинным и (oldState == AS_PLAYING) является ложным. myBool все равно будет правдой, но в вашей версии он не будет установлен.

После EDIT

if(oldState != AS_PLAYING) myBool = false; //code #2 more readable IMO 

Это будет хорошо только тогда, когда myBool инициализируется true.

+0

Ваше неправильное изменение. Если 'myBool' является ранее истинным, это станет' false', что не удовлетворяет 'myBool = myBool || (oldState == AS_PLAYING); '. –

+0

Я не помню, почему я сказал это, так как существует так много изменений с самого вопроса. Я ответил, рассматривая myBool и myBoolA как два разных bool. – instance