문제

a && b && c 에 의해 정의 언어를 의미 (a && b) && ca && (b && c)?

Wow,제리가 빠르다.쇠고기 질문:가 실제로 그것이 문제인가?는 것이 현저한 차이를 사 a && b && c 되는 것으로 해석 (a && b) && ca && (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, 기 때문에,수학자는 수단 ab 는 먼저 고려합니다.에 대한 교육 목적지만,그것은 유용하게 사용할 수 있습 쓰 a && (b && c) 대신에,강조하는 bc 평가 될 것입니다 경우 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).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top