2

この美しいものの広大で危険な飛行機の周りの私の終わりのない旅を通して、私はThe Internet名前が言及されない神秘的な、古い、白ひげの魔法使いに出くわしました。非常に強力な死であったにもかかわらず、彼はすぐに連れ去られました。

彼が息を引き取る直前に、彼は私に巻物を渡し、失神しながらささやきました。

Take this and spread the knowledge

彼の死後すぐに、彼の体はエネルギー、宇宙全体に広がる純粋なエネルギーに変わりました。

巻物には次のコードが含まれていました。

#include <iostream>
int main()
{
    int x = 3;
    while(2 <= x <= 5)
        std::cout << x++;
}

謎は今日まで残っています:

状態はどのように評価されますか?

4

2 に答える 2

13

いずれかがまたはに2<=x評価され、どちらも であるため、常に true になります。10<=5

つまり、事実上無限ループです。

while( (2 <= x) <= 5)
    std::cout<<x++;
于 2013-01-15T12:54:54.743 に答える
5

さて、この巻物の作曲者は、数学でよく知られている連鎖演算子表記法と呼ばれる条件を表現したかったのです (魔法使いは数学者だったのでしょうか?)。

Let x ∈ ℜ, 2 ≤ x ≤ 5. Then ...

通常、これは、C++、C、Java、および同様の式評価ロジックを持つ他の多くの言語では不可能です。このような機能を有効にするライブラリがありますが、一方で引数の 1 つを最初にラップする必要があるため、冗長性が導入されます。また、プログラマにとって非常に読みにくいです。

ウィザードがこのスクロールで行ったような言語で式を記述した場合、式は左から右に評価されます。

while ( (2 <= x) <= 5 )
    ...

は or のいずれかでありtrue、常にorの整数値に暗黙的にキャストされるため、これは常にです。2 <= xtruefalse105

数学者が望んでいたように条件を表現するには、次の構文を使用する必要があります

while ( (2 <= x) && (x <= 5) )
    ...

またはユーティリティ関数を使用して、これを正確に表現します。

template<class T>
bool between(const T& arg, const T& min, const T& max) {
    return !(arg < min) && !(max < arg);
}


while ( between(x, 2, 5) )
    ...

で条件をどのように記述したかに注意してくださいbetween。必要なのは の実装のみでoperator<(T, T)、カスタム型の実装が容易になります。

于 2013-01-15T13:05:05.627 に答える