1

以下のコードで int の代わりに bool 変数を使用して値 1 または 0 を設定する利点は何ですか? どんな違いがあるの?

#include<stdio.h>
int main(void)
{
    int p,d;
    _Bool isPrime;

    for ( p = 2; p <= 50; p++){
        isPrime = 1;

        for (d = 2; d < p; d++)
            if (p %d == 0)
                isPrime = 0;

        if (isPrime != 0)
            printf("%i ",p);
    }

    printf("\n");
    return 0;
}
4

2 に答える 2

3

意図を明確にするのに役立ちます。変数を として宣言すると、 andBool_以外の値を持つことは決して想定されていないことは明らかです。truefalse

サンプル コードを記述する従来の方法は、次のようになります。

#含む

int main(void)
{
    for (int p = 2; p <= 50; p++) {
        bool isPrime = true;

        for (int d = 2; d < p; d++) {
            if (p % d == 0) isPrime = false;
        }

        if (!isPrime) printf("%i ", p);
    }

    printf("\n");
    return 0;
}
于 2012-11-15T01:08:53.843 に答える
2

typedef や true/false 値の特別な定義や列挙を使用せずに、単純な int をブール型として使用します。ブール定数と比較しないという以下の私の提案に従う場合は、とにかくフラグを初期化するために 0/1 を使用するだけで済みます。しかし、このようなアプローチは現代では反動的すぎると思われるかもしれません。その場合、少なくとも標準化されるという利点があるため、必ず使用する必要があります。

ブール定数の名前が何であれ、それらは初期化にのみ使用してください。みたいなことは絶対に書かない

if (ready == TRUE) ...
while (empty == FALSE) ...

これらは常により明確なものに置き換えることができます

if (ready) ... while (!empty) ... これらは実際には合理的かつ理解できるように読み上げられることに注意してください。

ブール変数に正の名前を付けます。つまり、notfull の代わりに full を付けます。後者は読みにくいコードにつながります。比較

if (full) ...
if (!full) ...

if (!notfull) ...
if (notfull) ...

前者のペアはどちらも自然に読めますが、!notfull はそのままでも読みにくく、より複雑なブール式ではさらに悪化します。

ブール引数は一般的に避けるべきです。このように定義された関数を考えてみましょう

void foo(bool option) { ... }

関数の本体内では、便利で、できれば意味のある名前が付けられているため、引数が何を意味するかは非常に明確です。しかし、呼び出しサイトは次のようになります

foo(TRUE);
foo(FALSE):

ここで、常に関数の定義または宣言を見ずにパラメーターの意味を判断することは本質的に不可能であり、ブール型パラメーターをさらに追加するとすぐに悪化します..どちらかをお勧めします.

typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);

また

#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }

どちらの場合でも、呼び出しサイトは次のようになります

foo(OPT_ON);
foo(OPT_OFF);

読者は、少なくとも foo の定義を掘り下げることなく理解できる可能性があります。

于 2012-11-15T01:06:33.060 に答える