質問

a && b && c 意味する言語によって定義されます (a && b) && c または a && (b && c)?

うわー、ジェリーは速かった。質問を強化するには:それは実際に重要ですか?間に観察可能な違いがありますか a && b && c として解釈されている (a && b) && c または a && (b && c)?

役に立ちましたか?

解決

§5.14/ 1:「&&演算子は左から右にグループ化します。[...] && &&保証左から右を保証します 評価:最初のオペランドが偽の場合、2番目のオペランドは評価されません。 "

いつまたはどのように問題の問題について:それが実際に組み込み型のためにそうではありません。しかし、それを問題にする方法で過負荷にすることは可能です。例えば:

#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
.

警告:これは、それがどのようにして存在することができるかを示すのにのみ表示されます。私はではなく特に誰かがそうすることを推奨しています。

他のヒント

ザ- &&|| オペレータ短絡:左側のオペランドが式全体の結果を決定する場合、右側のオペランドは評価されません。

したがって、数学者はそれらを左連想として記述します。
a && b && c(a && b) && c, 数学者にとっては ab 最初に考慮されます。教育的な目的のために、しかし、それは書くことが有用であるかもしれません a && (b && c) 代わりに、それを強調するために どちらも b nor 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) 
.

私はあなたが1日に数回類似のステートメントを書くことに賭けます。そして、関連性が定義されていない場合は、大きなトラブルになるでしょう。

もし a && b が偽である場合には、その場合には、 && c 部分は決してテストされません。そうです、それは重要です(少なくとも、操作を左から右に注文する必要があるという点で)。 && 本質的に連想演算です。

連想プロパティ

の行に2つ以上の出現を含む式内では、次のようになります。 同じ連想演算子で、操作の順序は次のとおりです オペランドのシーケンスが次の場合に限り、実行は問題ではありません 変更されていません。つまり、このような括弧を再配置することです。 式はその値を変更しません。

だからあなたがそれを書くならば(論理的に)問題ではありません a && (b && c) または (a && b) && c.どちらも同等です。ただし、操作の順序を変更することはできません(例: a && c && b と同等ではありません a && b && c).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top