1

次の定数があるとします。

const char EASY = 'E';
const char NORMAL = 'N';
const char HARD = 'H';
const char LUNATIC = 'L';

LUNATICはHARD以上、NORMAL以上、EASY以上であってほしい。

以下が機能する場合、それらをそのように定義するにはどうすればよいですか。

int main(){
    char diff1 = LUNATIC;
    char diff2 = NORMAL;

    if (diff1 > diff2){
        printf("Lunatic is harder than normal");
    }
    return 0;
}
4

3 に答える 3

2

enum { EASY, NORMAL, HARD, LUNATIC };定数定義の代わりに使用すると、コードが機能し始めます。

しかし、私が理解できないことの 1 つは、定数を比較する必要があることです。コンパイル時の定数であるため、値を知っています!

于 2013-07-19T15:26:35.353 に答える
0

いくつかの方法があります。よりクリーンな解決策は、整数値が増加することが保証されている列挙子を使用することです。

typedef enum Difficulty {
    Easy,
    Normal,
    Hard,
    Lunatic
} Difficulty;

これは次のように使用できます。

void foo(Difficulty a, Difficulty b)
{
    if (a > b) {
        // ...
    } else
    // ...
}

// ...

Difficulty a = Easy;
Difficulty b = Hard;
foo(a, b);

他のアプローチも可能です。値を増やしてマクロを使用できます。

#define EASY 0
#define NORMAL 1
#define HARD 2
#define LUNATIC 3

現在のアプローチも機能しますが、定数に実際の文字を使用する理由はありません。代わりに数値を使用できます。

const char EASY = 0;
const char NORMAL = 1;
const char HARD = 2;
const char LUNATIC = 3;

もちろん、私が見る限り、char定数を使用する必要がある本当の理由はありません。代わりに使用できますint

最初のアプローチ (列挙子を使用する) は、使用できる実際の typedef を提供するため、通常は好まれます。これにより、コードが少し読みやすくなります。type の変数が表示された場合Difficulty、保持することが期待される値の種類がすぐにわかります。

列挙子について留意すべきことの 1 つは、列挙子が整数と互換性があるということです。つまり、それらには任意の数値を割り当てることができるため、型の安全性は実際には提供されません。それは主に、型の安全性ではなく、よりクリーンなコードを書くことです。

于 2013-07-19T15:37:19.253 に答える