switch文で以下のように書いた時に処理はCを実行するのですが、
変数a が 0~9の時に こうしますよ と範囲がまだ狭い時はこのように書いても処理はできると思いますが 変数a の範囲が 0~99だった場合、いちいちcase を100回書いて(defaultを使えば処理は減るだろうけど) と数字を100回書かないといけないのはとても面倒だと思うのです。
そこで以下のようにifを使わずにswitchを使って範囲を指定する方法はありませんか?
//ifを使った場合の範囲指定
if( ( 0 <= a ) && ( a < 25 ) ){ //略 }
else if( ( 25 <= a ) && ( a < 50 ) ){ //略 }
else if( ( 50 <= a ) && ( a < 75 ) ){ //略 }
else if( ( 75 <= a ) && ( a < 100 ) ){ //略 }
//ソース
int a = 6;
switch( a ){
case 0: case 1:
//処理A
break;
case 2: case 3: case 4:
//処理B
break;
case 5: case 6:
//処理C
break;
case 7: case 8: case 9:
//処理D
break;
}
No.1ベストアンサー
- 回答日時:
>そこで以下のようにifを使わずにswitchを使って範囲を指定する方法はありませんか?
結論からいうとありません。
但し、今回のケース限定ですが、if文を使用したものと、同等の機能が得られるようにするとすれば、
aを25で割った商についてswitch文を使用すればよいかと。
switch(a/25){
case 0: // 0 <= a && a < 25 のケース
省略
case 1: // 25 <= a && a < 50 のケース
省略
・・・以下省略
}
やっぱりないのですか・・。
あれば非常に便利なので皆さん使っているでしょうしね。
今回のケースは25で分けているので簡単だと思います。
本来なら0~10、10~15、15~40、40~70、70~100と言った具合にバラけて使いたかったのです。
No.5
- 回答日時:
ifもswitchも使わない方法も、ここで一つ。
#include <stdio.h>
#define x5(f) f,f,f,f,f
#define x25(f) x5(f),x5(f),x5(f),x5(f),x5(f)
typedef void (*jump)(int) ;
void A(int a) { puts("処理A"); };
void B(int a) { puts("処理B"); };
void C(int a) { puts("処理C"); };
void D(int a) { puts("処理D"); };
jump cases[] = { x25(A), x25(B), x25(C), x25(D) };
int main(void)
{
for (int i = 0; i < 100; i++) cases[i](i);
return 0;
}
No.4
- 回答日時:
switch 使う方法はいろいろ出ているので。
たとえばa が常に正だとして。
if( ( 0 <= a ) && ( a < 25 ) ){ //略 }
が成立していたら
else if( ( 25 <= a ) && ( a < 50 ) ){ //略 }
ここは通りません。
前のifが成立、ということは a<25 ですから、不成立ということは、 25<=a はかならず成立する、ということになります。
必ず成立する条件を判定するのは無駄です。
と、無駄を省くと
if( a < 0 ) { ... }
else if ( a < 25 ) { //略 }
else if ( a < 50 ) { //略 }
else if ( a < 75 ) { //略 }
else if ( a < 100 ) { //略 }
となります。ちょっと長いですが、switch~caseとそれほど変わらないと思います。
あああ本当ですね。
すっごい省略できます。
今までは数値の範囲がわかりやすかったのであのように書いてましたが、今後はまねてみますね。
これくらいなら処理速度がそれほど変わらないのはわかるのですが、非常に大規模な処理を行いたいので処理速度に気をつけてるのですよ。
ですので、どうしてもifを使わなければいけないもの以外は、できる限りswitchを使いたいのです
No.2
- 回答日時:
面倒な条件で switch する場合、チャンと書くならこうでしょう
#define CASE_A 1
#define CASE_B 2
int 自作関数(int a){
if (...) return CASE_A;
if (...) return CASE_B;
...
return 0;
}
(中略)
switch (自作関数(a)) {
case CASE_A: 処理A(); break;
case CASE_B: 処理B(); break;
default: 処理X();
}
すみません
関数を使った処理はいいと思います。
ですが、ifを使っている処理だとswitchだけを使った処理速度より遅くなってしまうため使うのをためらってしまいます。
せっかく教えていただいたのですが、申し訳ありませんね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
switch()文で値の大小比較
PHP
-
switch分のケースを範囲数?にしたい
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
-
4
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
5
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
6
関数から配列を返すには?
C言語・C++・C#
-
7
C言語初心者の質問失礼します。
C言語・C++・C#
-
8
複数桁10進数の*桁目だけを抽出したい
C言語・C++・C#
-
9
セグメントエラー
C言語・C++・C#
-
10
構造体のメンバをfor文で回したい
C言語・C++・C#
-
11
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
12
C言語での引数の省略方法
C言語・C++・C#
-
13
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
14
文字列から空白を取り除きたいのですが
C言語・C++・C#
-
15
IF関数で空欄(")の時、Nullにしたい
その他(Microsoft Office)
-
16
getcの改行判定
C言語・C++・C#
-
17
fgets関数を使用したときの文字あふれについて
C言語・C++・C#
-
18
C言語において、 配列要素をひとつずつ前にずらすコード
C言語・C++・C#
-
19
ラベル内の文字(Caption)を縦表示にする方法
Visual Basic(VBA)
-
20
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
VBAでループ内で使う変数名を可...
-
エクセルで、日付を入力すると...
-
メルカリのメルカードで買い物...
-
インタラクティブの反対語は?
-
EXCEL VBA マクロ 実行する度に...
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
UMLでの例外処理
-
VBの質問#if 0 then ってどう...
-
findは動くがfindnextがマクロ...
-
DoEventsがやはり分からない
-
ボタンクリックイベント 重複...
-
EXCEL2003 VBAで2つのDBに接続...
-
月度は何て読みますか?
-
FFTの結果ついて
-
iD
-
C# 画面のちらつきを解消したい
-
RPGプログラムの*HIVALについて
-
(Delphi)ESCキーでWindowを閉...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
EXCEL VBA マクロ 実行する度に...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
メルカリのメルカードで買い物...
-
DoEventsがやはり分からない
-
【Excel】特定の文字を含むセル...
-
findは動くがfindnextがマクロ...
-
switch の範囲指定
-
月度は何て読みますか?
-
インタラクティブの反対語は?
-
VBの質問#if 0 then ってどう...
-
UMLでの例外処理
-
お家デートをしててハグを長い...
-
Do~Loopした回数をカウントしたい
-
リョウ・・・量?料?
-
FFTの結果ついて
-
iD
-
VBAでセルに値が入力されるまで...
-
VB.NET Excelを読み込んでDataT...
おすすめ情報