質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

9回答

198閲覧

if分の条件について

santaro

総合スコア18

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/02/14 08:08

if(a == i || b == i || c == i){}

このような条件があった場合、簡略化できるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a_saitoh

2018/02/14 14:17

何のために簡略化したいのか追記するとよりよい回答が得られると思います。ソースコードのわかりやすさ?ソースコードの文字数?実行時間を削るために簡略化したい?
guest

回答9

0

具体的に何を簡略化するかによります。また、変数の数にもよります。

単純にソースコードを打ち込むタイプ数であるならば、3つ程度なら元の形で十分でしょう。変化させる方がひどくなると思います。数が多いならば、配列に入れて検索が妥当です。ちなみに、左辺の方が整数定数ならこういう書き方もあります。

C/C++

1switch(i) 2{ 3case a: 4case b: 5case c: 6//条件合致時の処理 7break; 8default: 9}

そして、処理時間を短くするならば、変数の並びが影響します。iの可能性が高いものを優先的に判別することが望ましいです。整列済みならば二分探索が有効です。(ただし、整列をわざわざ前処理にするくらいなら全検索したほうが早い)

投稿2018/02/14 13:35

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

||において、a==itrueのとき、後の式は評価されません。これを短絡評価といいます。

論理演算子(&&, ||)の短絡評価 - Qiita

短絡評価の存在を加味すると、回りくどくてもそのままの書き方がいいような気がします。

(配列に入れて存在を確認する方法も短絡評価に似たような挙動かもしれませんが、「配列に入れる」という処理と、最後に評価する処理が追加で生じてしまいます。)

回答とは言えないかも…すみません。何か思いついたら追記しようと思います。

追記

処理が一つ増えますが、~~コードゴルフ的には、~~こんなのはどうでしょうか?

c

1if(!(a-i&&b-i&&c-i)) printf("true\n");

空白を除いた字数はcまでだと同じですが、変数の数が増えた場合は少しづつ減っていきます。
(ただあまりにも大量になった場合は配列や辞書に入れる、もとい配列や辞書で扱った方がいいですから、この方法は非推奨です。)

まぁ、iを書く数は変わらないので、意味のない回答かもしれませんが。

投稿2018/02/14 09:33

編集2018/02/14 10:05
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkgrei

2018/02/14 09:46

辞書を使えば一回(数回)で評価できます。 一般化した時に書くのが楽なだけかと思われます。(条件式が10個とか、可変個とか。) 速度を追求するのなら全部書くしかないですね。 if文の評価速度がボトルネックになるようなのはライブラリを作るときとかでない限り珍しいかと思いますが… O(N)かO(1)かの評価速度が影響するケースですよね。
namnium1125

2018/02/14 09:51

コメントありがとうございます。 全然速度とか測れない奴の知ったかぶりな回答なので、矛盾点があればバツバツ突っ込んでください。 「iを書く回数を減らす」という意味でしたら、皆様の方法がベストですね。
guest

0

a,b,cを配列にいれ、iが存在するか。
調べるとすぐ出てくると思いますので検索してみてください。

投稿2018/02/14 08:51

hien

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一部無駄な部分がありますが。
こっそりunordered_setにすり替えておく…

c++

1#include <iostream> 2#include <algorithm> 3#include <unordered_set> 4 5int main() { 6 std::unordered_set<int> lookup = {1, 2, 3}; 7 int a; 8 std::cin >> a; 9 if (lookup.find(a) == lookup.end()) { 10 std::cout << "NOT FOUND" << std::endl; 11 } else { 12 std::cout << "FOUND" << std::endl; 13 } 14 return 0; 15}

投稿2018/02/14 08:49

編集2018/02/15 00:50
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

テクニックとしては、他の方が書かれているように、色々あろうかと思います。
なので、ちょっと視点を変えて、簡略化の目的が何かということについて。

おそらくタイピング量を減らしたいということだろうかと思いますが、それによってロジックが判りにくいものになったら本末転倒です。

今のコンパイラは中々優秀なのと、PCも速度が速いので余程のことがない限り速度的なチューニングというのは、if文に関しては無いだろうと思います。
であるならば、見通しの良い、メンテナンスのし易い、誰が見てもわかりやすいコードを書くのが良いと私は思います。

投稿2018/02/20 08:17

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C# ならば以下のコードでいかがでしょうか?

List<int> parameter = new List<int> { a, b, c }; if ( parameter.Contains(i) ) { }

投稿2018/02/17 05:58

GuielNo4

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

簡略化の目的が推測になってしまうのですが、
(推測が外れていたらすみません。)

A)「3つの要素のいずれか」が「指定の数字」と同じか判断することが目的
B) 目的は1つなのに if で 条件式が 3つも必要。

という、A)という1つの目的に B)のように条件式が3要素になってしまうので簡略化できないか?
という意味で質問されているのであれば、
あまりお勧めの方法ではありませんが、マクロでどうでしょうか?

/// マクロ #define OR_EQUAL3( a, b, c, i, result ) if ( a == i || b == i || c == i ) { result = true; } else { result = false; } /// コード bool result = false; OR_EQUAL3( a, b, c, i, result ); if( true == result ) {}

投稿2018/02/17 05:12

GuielNo4

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/02/17 12:30

そのように三要素固定でマクロにするくらいなら、関数にした方がいいような気もしますが... bool or_equal_3(int a, int b, int c, int i) { return a == i || b == i || c == i; } if(or_equal_3(a, b, c, i)) {...} else{...}
GuielNo4

2018/02/18 04:00

プログラム規模とコンパイラとオプション指定によって変わりますが、 ①場合によっては関数にしてしまうと、スタック処理が入ってしまうかも。 ②もともとのコードの見た目や変数の配置を極力変更しない方が、  意図が伝わりやすくなるかも。 以上の2点でマクロを採用してみました。 特に②のように質問者の方のコードを極力維持しながら解決策を提案できないか考えて回答してみたのですが…。
guest

0

簡略化をどう捕らえるかによりますが、別の書き方にするのであれば方法はいくつかあると思います。
言語によっても異なりますので、言語を特定したほうがより良い回答が得られると思います。
とりあえずC言語の場合を回答しておきます。
C言語の場合、言語的な制約が多いので、関数化してしまうのが手っ取り早く、また汎用的と思われます。
ですが、この場合main関数から見れば簡略化されていますが、内部的には圧倒的に処理量が増えています。

c

1#include <stdio.h> 2#include <stdarg.h> 3 4int find(int val, int argc, ...) 5{ 6 va_list arg; 7 int i; 8 int ret = 0; 9 va_start(arg, argc); 10 for(i = 0; i < argc; i++){ 11 if(val == va_arg(arg, int)){ 12 ret = 1; 13 break; 14 } 15 } 16 va_end(arg); 17 return ret; 18} 19int main(void){ 20 int i = 1; 21 int a = 2, b = 3, c = 4; 22 if(find(i, 3, a, b, c)){ 23 printf("found\n"); 24 } else { 25 printf("not found\n"); 26 } 27} 28

投稿2018/02/15 00:08

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C++

1#include <iostream> 2#include <algorithm> 3 4int main() { 5 using namespace std; 6 int a=1, b=2, c=3; 7 int i=2; 8 auto target = { a, b, c }; 9 if ( any_of(begin(target), end(target), [=](auto x) { return x == i;}) ) { 10 cout << "ok.\n"; 11 } 12}

簡略化されてない... orz

セールスポイントは

  • 比較対象となるtargetの要素数がいくつでもok. 配列でもok. vector/list/setモロモロok.
  • 条件式をlambdaで追い出してるので、==だけじゃなく!=だろが<だろが...
  • 短絡評価もできてるよ♪

投稿2018/02/14 23:51

編集2018/02/15 00:17
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問