지 바이너리 부울업 연관성?
-
27-12-2019 - |
문제
가 a && b && c
에 의해 정의 언어를 의미 (a && b) && c
나 a && (b && c)
?
Wow,제리가 빠르다.쇠고기 질문:가 실제로 그것이 문제인가?는 것이 현저한 차이를 사 a && b && c
되는 것으로 해석 (a && b) && c
나 a && (b && c)
?
해결책
§5.14 / 1 : "&& 운영자 그룹 왼쪽에서 오른쪽으로 & & & && && && & && 왼쪽에서 오른쪽으로 보장합니다. 평가 : 첫 번째 피연산자가 false 인 경우 두 번째 피연산자가 평가되지 않습니다. "
어떤 것 또는 방법에 대해서도 : 내장형 유형을 위해 실제로는 정말로 확실하지 않습니다.그러나 그런 식으로이를 과부하시키는 것이 가능합니다.예 :
#include <iostream>
class A;
class M {
int x;
public:
M(int x) : x(x) {}
M &operator&&(M const &r);
M &operator&&(A const &r);
friend class A;
};
class A {
int x;
public:
A(int x) : x(x) {}
A &operator&&(M const &r);
A &operator&&(A const &r);
operator int() { return x;}
friend class M;
};
M & M::operator&&(M const &r) {
x *= r.x;
return *this;
}
M & M::operator&&(A const &r) {
x *= r.x;
return *this;
}
A &A::operator&&(M const &r) {
x += r.x;
return *this;
}
A &A::operator&&(A const &r) {
x += r.x;
return *this;
}
int main() {
A a(2), b(3);
M c(4);
std::cout << ((a && b) && c) << "\n";
std::cout << (a && (b && c)) << "\n";
}
.
결과 :
9
16
.
caveat : 이것은 이 물질로 을 어떻게 만들 수 있는지 보여줍니다.저는 not 가 아니라는 것을 특히 추천합니다.
다른 팁
이 &&
고 ||
사업자 short-circuit:피연산자 왼쪽에서 결정한 결과의 전반적인 표현의 범위 내에서 권하지 않도 평가됩니다.
따라서,수학자으로 그들을 설명하는 것입 왼쪽 연결,예를 들어,
a && b && c
⇔ (a && b) && c
, 기 때문에,수학자는 수단 a
고 b
는 먼저 고려합니다.에 대한 교육 목적지만,그것은 유용하게 사용할 수 있습 쓰 a && (b && c)
대신에,강조하는 도 b
도 c
평가 될 것입니다 경우 a
거짓입니다.
괄호 안에서 C 만 변경 평가하기 위해 때를 재정의 우선 순위.모두 a && (b && c)
고 (a && b) && c
으로 평가 받게 됩니다 a
먼저,다음 b
, 다음 c
.마찬가지로,평가하기 위해 모두의
a + (b + c)
고 (a + b) + c
지정되지 않습니다.대 a + (b * c)
대 (a + b) * c
, 는 컴파일러는 여전히 자유롭게 평가 a
, b
, 고 c
어떤 순서로든지만,괄호는지 여부를 확인 곱셈 또는 추가 발생 처음이다.또한 반면 FORTRAN,어디에서 적어도 몇 가지의 경우 괄호 안 표현을 평가해야 하 처음이다.
실제로 표현식이 왼쪽에서 오른쪽으로 계산되는 것이 매우 중요합니다.이것은 일부 표현식에서 단락 회로를 갖는 데 사용됩니다.여기에 중요한 경우는 다음과 같습니다.
vector<vector<int> > a;
if (!a.empty() && !a[0].empty() && a[0].back() == 3)
.
나는 당신이 하루에 몇 번 유사한 진술을 작성하는 것을 내기 때문입니다.또한 연관성이 정의되지 않은 경우 거대한 문제가 발생합니다.
는 경우 a && b
false,다음 && c
부는지 테스트합니다.그래서 그래,그것은 중요하(적어도는 당신이 필요하신의 작업에서 주문 왼쪽에서 오른쪽). &&
연관 작업에 의해 자연입니다.
연관성
내에서 표현을 포함하는 두 개 또는 그 이상 발 행에의 동일한 연결자는 순서에 따라 작업 수행하지 않는 물질 만큼의 순서는 피연산자 변경되지 않습니다.는,다시 정렬하는 괄호 안에서 그러한 식지 않을 것이 값을 변경하십시오.
이든 상관없어요(논리적으로)당신이 쓰 a && (b && c)
나 (a && b) && c
.모두가 동일합니다.하지만 순서를 변경할 수 없습 operations(e.g a && c && b
지 않은 해당하는 a && b && c
).