짧은 답변
모든 사업자는 +=
, -=
, *=
, /=
, &=
, |=
... 산술하고 같은 기대를 제공합니다 :
x &= foo() // We expect foo() be called whatever the value of x
그러나 연산자 &&=
와 ||=
는 논리적이며 많은 개발자가 foo()
항상 x &&= foo()
.
bool x;
// ...
x &&= foo(); // Many developers might be confused
x = x && foo(); // Still confusing but correct
x = x ? foo() : x; // Understandable
x = x ? foo() : false; // Understandable
if (x) x = foo(); // Obvious
긴 대답
예 &&=
경우 &&=
운영자가 가능했던,이 코드 :
bool ok = true; //becomes false when at least a function returns false
ok &&= f1();
ok &&= f2(); //we may expect f2() is called whatever the f1() returned value
다음과 같습니다.
bool ok = true;
if (ok) ok = f1();
if (ok) ok = f2(); //f2() is called only when f1() returns true
이 첫 번째 코드는 많은 개발자 가 항상 반환 된 값이 무엇이든 호출 된다고 생각 하기 때문에 오류가 발생 하기 쉽습니다 . 반환 할 때만 호출 되는 곳에 쓰는 것과 같습니다 .f2()
f1()
bool ok = f1() && f2();
f2()
f1()
true
- 개발자가 실제로
f2()
를 f1()
반환 할 때만 호출 되기를 원하는 경우 true
위의 두 번째 코드는 오류가 덜 발생합니다.
- 그렇지 않으면 (개발자가
f2()
항상 호출 되기를 원함 ) &=
충분합니다.
예 &=
bool ok = true;
ok &= f1();
ok &= f2(); //f2() always called whatever the f1() returned value
또한 컴파일러가 위 코드를 아래 코드보다 최적화하는 것이 더 쉽습니다.
bool ok = true;
if (!f1()) ok = false;
if (!f2()) ok = false; //f2() always called
비교 &&
하고&
우리는 사업자인지 궁금 할 &&
하고 &
적용 할 때와 동일한 결과를 제공 bool
값?
다음 C ++ 코드를 사용하여 확인해 보겠습니다.
#include <iostream>
void test (int testnumber, bool a, bool b)
{
std::cout << testnumber <<") a="<< a <<" and b="<< b <<"\n"
"a && b = "<< (a && b) <<"\n"
"a & b = "<< (a & b) <<"\n"
"======================" "\n";
}
int main ()
{
test (1, true, true);
test (2, true, false);
test (3, false, false);
test (4, false, true);
}
산출:
1) a=1 and b=1
a && b = 1
a & b = 1
======================
2) a=1 and b=0
a && b = 0
a & b = 0
======================
3) a=0 and b=0
a && b = 0
a & b = 0
======================
4) a=0 and b=1
a && b = 0
a & b = 0
======================
결론
따라서 YES 우리는 대체 할 수있는 &&
가 &
에 대한 bool
값 ;-)
그래서 더 나은 사용하는 &=
대신 &&=
. 부울에는 쓸모없는
것으로 간주 할 수 있습니다 &&=
.
동일 ||=
오퍼레이터는 |=
또한 적은 오류가 발생하기 쉬운 보다||=
개발자가 f2()
다음 대신를 f1()
반환 할 때만 호출 되기를 원하는 경우 false
:
bool ok = false;
ok ||= f1();
ok ||= f2(); //f2() is called only when f1() returns false
ok ||= f3(); //f3() is called only when f1() or f2() return false
ok ||= f4(); //f4() is called only when ...
다음과 같은 더 이해하기 쉬운 대안을 조언합니다.
bool ok = false;
if (!ok) ok = f1();
if (!ok) ok = f2();
if (!ok) ok = f3();
if (!ok) ok = f4();
// no comment required here (code is enough understandable)
또는 모두 한 선 스타일 을 선호하는 경우 :
// this comment is required to explain to developers that
// f2() is called only when f1() returns false, and so on...
bool ok = f1() || f2() || f3() || f4();