- ベストアンサー
C言語の演算子!=の使い方で質問です。
if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o) 上記は間違いです。 変数a~nが同じじゃなければとしたいのです。 ご指導お願いします。
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
配列に入れ直せば簡単ですね。 下のはインデントは全角スペースです。 int x[15] x[0] = a; x[1] = b; x[2] = c; .... x[14] = o; int check = 0; for(int i = 0;i < 14;i++) for(int j = i+1;j < 15;j++){ if(x[i] == x[j]){ check = 1; break; } } } こんな感じでcheck=0なら全部値が違う、check=1なら同じ値ありです。
その他の回答 (14)
- qwertfk
- ベストアンサー率67% (55/81)
template<typename T> class IsnotExistSame_t { public: IsnotExistSame_t(const T& value) { m_values.insert(value); m_detectedSame = false; } IsnotExistSame_t& operator()(const T& value) { if( !m_detectedSame ) { if( m_values.find( value ) != m_values.end() ) { m_detectedSame = true; } else { m_values.insert( value ); } } return *this; } operator bool(void) const { return !m_detectedSame; } private: std::set<T> m_values; bool m_detectedSame; }; template<typename T> IsnotExistSame_t<T> IsnotExistSame(const T& value) { return IsnotExistSame_t<T>(value); } if( IsnotExistSame(a)(b)(c)(d)(e) .... ) こんなんでどうでしょうか。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
C++の範囲だけど、この前、STL の set を使う方法を教えてもらった。 本質的には、No.12 であげられている > ・一つずつ、リストに昇順または降順になるように挿入する→同じのが見つかったら失敗して終了 ですが。 #include <iostream> #include <set> int main() { int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o; std::set<int> forCheck; // a - o に何か計算結果を入れる if( forCheck.insert(a).second && forCheck.insert(b).second && forCheck.insert(c).second && forCheck.insert(d).second && forCheck.insert(e).second && forCheck.insert(f).second && forCheck.insert(g).second && forCheck.insert(h).second && forCheck.insert(i).second && forCheck.insert(j).second && forCheck.insert(k).second && forCheck.insert(l).second && forCheck.insert(m).second && forCheck.insert(n).second && forCheck.insert(o).second ) std::cout << "全部違う"; else std::cout << "同じのがある"; return 0; }
- kmee
- ベストアンサー率55% (1857/3366)
まずは、配列を使えるように勉強するのが最初ですね。 こんな式、例え期待通りに動作するとしても、面倒だし打ち間違いしそうだし、自分では作りたくないです。 出てないアイディアとしては ・ソートする→前後が等しくないことだけチェックすればよい ・一つずつ、リストに昇順または降順になるように挿入する→同じのが見つかったら失敗して終了 ・前のつづきで1~15だったら、 int check[15+1]={0} ;とでもして用意した、中身が0の配列で、 check[a] += 1; check[b] += 1; .... とやって、check[?]>=1 だったら重複あり で、これらを int isUniq(int ia,int ib,...) { 上のような判定 return 判定結果,1なら重複無し } みたいに関数にして if( isUniq(a,b,c,...) ) { 重複しないときの処理 } みたいにすると、ちょっとは見易くなる。
- neko1963
- ベストアンサー率49% (127/258)
>#.7 それがわかっているのなら、 比較結果に等しい場合だけロジックを分ける事もできるでしょ。 どちらにしてもスマートでは無いですけどね。 変数a~nでは簡潔な記述はできないですね。
- nak777r
- ベストアンサー率36% (49/136)
a~o 全てが同じ値でないとしたいのなら単純に書くとこうなります if( (a != b) && (a != c) && (a != d) && (a != e) && (a != f) && (a != g) && (a != h) && (a != i) && (a != j) && (a != k) && (a != l) && (a != m) && (a != n) && (a != o) && (b != c) && (b != d) && (b != e) && (b != f) && (b != g) && (b != h) && (b != i) && (b != j) && (b != k) && (b != l) && (b != m) && (b != n) && (b != o) && (c != d) && (c != e) && (c != f) && (c != g) && (c != h) && (c != i) && (c != j) && (c != k) && (c != l) && (c != m) && (c != n) && (c != o) && (d != e) && (d != f) && (d != g) && (d != h) && (d != i) && (d != j) && (d != k) && (d != l) && (d != m) && (d != n) && (d != o) && (e != f) && (e != g) && (e != h) && (e != i) && (e != j) && (e != k) && (e != l) && (e != m) && (e != n) && (e != o) && (f != g) && (f != h) && (f != i) && (f != j) && (f != k) && (f != l) && (f != m) && (f != n) && (f != o) && (g != h) && (g != i) && (g != j) && (g != k) && (g != l) && (g != m) && (g != n) && (g != o) && (h != i) && (h != j) && (h != k) && (h != l) && (h != m) && (h != n) && (h != o) && (i != j) && (i != k) && (i != l) && (i != m) && (i != n) && (i != o) && (j != k) && (j != l) && (j != m) && (j != n) && (j != o) && (k != l) && (k != m) && (k != n) && (k != o) && (l != m) && (l != n) && (l != o) && (m != n) && (m != o) && (n != o) ){ }
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
> 変数a~nが同じじゃなければとしたいのです。 o は仲間はずれで良いのだろうか? a, b, c ..... o にこだわるなら、 static int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o; に対して、 { int *array[] = {&a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m, &n, &o, 0}; int ix; int iy; int s = 1; for(ix = 0; array[ix + 1]; ix++) for(iy = ix +1; array[iy]; iy++) { s *= (*array[ix] - *array[iy]); if (s) s = 1; } if (s) { // あれこれ } }
- Tacosan
- ベストアンサー率23% (3656/15482)
C の比較演算子・等値演算子はすべて 0 または 1 の値を返します>#7. したがって, a == b == c の値は ・c が 0 なら !(a == b) つまり a != b と同じ ・c が 1 なら a == b と同じ ・どちらでもなければ a や b の値に無関係に必ず 0 です. ちなみに a != b != c だと ・c が 0 なら a != b と同じ ・c が 1 なら !(a != b) つまり a == b と同じ ・どちらでもなければ a や b の値に無関係に必ず 1 となります... おぉ, (c == c == c) == (c != c != c) とやると c == 0 || c == 1 と同じ意味なのか....
- maru_yoshi_
- ベストアンサー率39% (17/43)
>#6 演算子の結合規則が分かっていないようですね。間違いを教えてもらっては困ります。 あなたの実行結果がそれらしくみえる(のかな?)のは、たまたまです。 a == b == c と書かれている場合 (a == b) == c と解釈されます。つまりaとbの比較結果をさらにcと比較します。比較結果は0または非0(通常1)なので全て1だと たまたま全一致という結果になります。すべて2だと別の結果になります。つまりあなたが思っている動作と異なります。 a~oが全て同じ値であるかを判定したかったら #5 で書かれているようにaとb~oをすべて比較して論理積(&&)を とる必要があります。
- neko1963
- ベストアンサー率49% (127/258)
スマートな書き方では無いですが、改めて実行結果を提示します。 int main() { int a, b, c, d, e, f, g, h, i, j, k, l, m, n; a = 1; b = 1 ; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1 ; i = 1; j = 1; k = 1; l = 1; m = 1; n = 1 ; if(!(a == b == c == d == e == f == g == h == i == j == k == l == m == n)) { printf( "すべて同じ値\n" ); } a = 2; b = 1 ; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1 ; i = 1; j = 1; k = 1; l = 1; m = 1; n = 1 ; if(!(a == b == c == d == e == f == g == h == i == j == k == l == m == n)) { printf( "aだけ異なる\n" ); } a = 2; b = 3 ; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1 ; i = 1; j = 1; k = 1; l = 1; m = 1; n = 1 ; if(!(a == b == c == d == e == f == g == h == i == j == k == l == m == n)) { printf( "aとbだけ異なる\n" ); } return 0; } ※上記の実行結果 aだけ異なる aとbだけ異なる
文章で書けば、aとb~nを比較すればいいと思います。 if(!(a==b && a==c && ・・・ こんな感じでできると思います。
- 1
- 2