質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初見さん

質問です

#1

投稿記事 by 初見さん » 8年前

switch文だと、case1.2.3.....100みたいな感じで、任意の数字までを順番に羅列しないといけないのですが、1~20まではAを表示するプログラム、21~50まではBを表示するプログラムと言った感じで、まとめて自分で範囲を決めて、動作を分割、統一できないでしょうか?

Math

Re: 質問です

#2

投稿記事 by Math » 8年前

コード:

C# 7では、switchステートメントのcase句に、値だけでなく、型を書けるようになりました。 型による条件の書き方は、前節のis演算子と同様です。 また、型による条件に加えて、when句というものを付けて追加の条件式を書くこともできます。
switch(変数)
{
    case 型 変数:
        // 型が一致しているときにここに来る
        // その型に変換した結果が変数に入っている
        break;
    case 型 変数 when 条件式:
        // 型が一致していて、かつ、条件式満たしているときにここに来る
        break;
    case 値:
        // 通常の値による条件との混在も可能
        break;
      ・
      ・
      ・
    default:
        // どの条件も満たさない時に実行される
        break;
}


Cではif文の受け持ち範囲と思います。

Math

Re: 質問です

#3

投稿記事 by Math » 8年前

「前節」
C# 7で、is演算子やswitchステートメントのcaseが拡張されて、以下のような機能が入りました。
•caseでも、is演算子と同じように、インスタンスの型を見ての分岐ができるようになった
•x is T tや、case T tというように、型を調べつつ、型が一致してたらキャスト結果を変数tで受け取れるようになった

この機能を型スイッチ(type switch)と呼びます。

この機能は、C# 7よりもさらに先のバージョンで入る予定の「パターン マッチング(pattern matching)」という機能のうち、一番初歩的な部分だけを先に実装したものです。C# 7の時点では、型を見ての分岐(型スイッチ)だけが実装されていますが、将来的にはもっと複雑な条件を書けるようになります。

is演算子の拡張

C# 7では、is演算子で以下のような書き方ができるようになりました(型の後ろに新しい変数を書けるようになりました) 。
型を調べたい変数 is 型 新しい変数

Math

Re: 質問です

#4

投稿記事 by Math » 8年前

コード:

static void F(object obj)
{
    switch (obj)
    {
        case string s:
            Console.WriteLine("string #" + s.Length);
            break;
        case 7:
            Console.WriteLine("7の時だけここに来る");
            break;
        case int n when n > 0:
            Console.WriteLine("正の数の時にここに来る " + n);
            // ただし、上から順に判定するので、7 の時には来なくなる
            break;
        case int n:
            Console.WriteLine("整数の時にここに来る" + n);
            // 同上、0 以下の時にしか来ない
            break;
        default:
            Console.WriteLine("その他");
            break;
    }
}
[/size]

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 質問です

#5

投稿記事 by みけCAT » 8年前

言語が指定されていませんが、C言語ではGCC拡張であればできます。 (使用しないことを推奨します)

コード:

#include <stdio.h>

int main(void) {
	int i;
	for (i = 0; i < 100; i++) {
		printf("i = %d\n", i);
		switch (i) {
			case 1 ... 20:
				puts("A");
				break;
			case 21 ... 50:
				puts("B");
				break;
		}
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る