8

複数の変数を比較して、それらがすべて同じ値であるかどうかを確認する最も簡単な方法は何ですか? たとえば、var1 = 53 の場合、var2 または var3 が var1 と互いに等しいかどうかを確認したいですか? これまでのところ、私はこれを行ってきました:

if(row1==row2==row3==row4==col1==col2==col3==col4==diag1==diag2)
    cout << "It is a magic square";
else
    cout << "Not a magic square";

しかし、これはうまくいかないようです。助けてくれてありがとう。

4

6 に答える 6

16

C++11 では、可変個引数テンプレートを使用して独自の関数を定義できます。

#include <iostream>

template<typename T, typename U>
bool all_equal(T&& t, U&& u)
{
    return (t == u);
}

template<typename T, typename U, typename... Ts>
bool all_equal(T&& t, U&& u, Ts&&... args)
{
    return (t == u) && all_equal(u, std::forward<Ts>(args)...);
}

int main()
{
    int x = 42;
    int y = 42
    std::cout << all_equal(42, y, x);
}
于 2013-03-04T18:53:48.137 に答える
4

==そのような演算子をチェーンすることはできません。たとえば、次のように書く必要があります。

if (row1==row2 && row2==row3 && row3==row4 && ...)
于 2013-03-04T18:53:52.693 に答える
2

==比較演算子がtrueor false(どちらが1orであるか) を返すため、機能しません0。ペアごとの比較を避けるには、ループを使用するのが最善の方法だと思います。

int vals[] = {row1,row2,row3,row4,col1,col2,col3,col4,diag1,diag2};
bool equals = true;
for (int i = 0; i < sizeof(vals); ++i) {
  if (vals[i] != vals[i+1]) {
    equals = false;
    break;
  }
}

ビットごとのループでも機能すると思います:

int val = vals[0];
for (int i = 1; i < sizeof(vals); ++i)
  val &= vals[i];
bool equals = val == vals[0];
于 2013-03-04T18:53:33.250 に答える
0

&& 演算子を使用する必要がありますが、入力する必要があるコードの量が増えます。行列の値を比較する場合は、値を変数に割り当てて等価性をテストするのではなく、ループとインデックスを使用して値を比較することをお勧めします。

if(row1==row2 && row2==row3 && row3==row4 && row4==col1 && col1==col2 && col2==col3 &&   col3==col4 && col4==diag1 && diag1==diag2)
    cout << "It is a magic square";
else
    cout << "Not a magic square";
于 2013-03-04T18:54:24.583 に答える