bool变量在C中的效用是什么?

bool变量在C中的效用是什么?,c,variables,boolean,C,Variables,Boolean,在下面的代码中使用bool变量而不是int来设置值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)

在下面的代码中使用bool变量而不是int来设置值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;
}

我只使用普通int作为布尔类型,没有任何typedef或特殊定义或枚举来表示真/假值。如果您遵循我下面关于从不与布尔常量进行比较的建议,那么您只需要使用0/1来初始化标志。然而,这种做法在当今时代可能被认为过于反动。在这种情况下,应该明确使用,因为它至少有被标准化的好处

无论调用什么布尔常量,都只在初始化时使用它们。永远不要写这样的东西

if (ready == TRUE) ...
while (empty == FALSE) ...
这些总是可以被更清晰的图像所取代

如果准备好了。。。 虽然空的 请注意,这些事实上可以合理且可以理解地大声读出

给你的布尔变量正名(用full代替notfull)。后者导致代码难以轻松阅读。比较

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

前一对都能自然地阅读,然而!notfull即使是这样也很难阅读,在更复杂的布尔表达式中会变得更糟糕

通常应避免使用布尔参数。考虑这样定义的函数

void foo(bool option) { ... }
在函数体中,参数的含义是非常清楚的,因为它有一个方便的、希望有意义的名称。但是,呼叫站点看起来像

foo(TRUE);
foo(FALSE):
在这里,如果不始终查看函数定义或声明,就根本无法判断参数的含义,如果添加更多布尔参数,情况会变得更糟。。我也建议

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

无论是哪种情况,呼叫站点现在看起来都像

foo(OPT_ON);
foo(OPT_OFF);

读者至少有机会理解它,而不必深入了解foo的定义。

我只使用普通int作为布尔类型,而不使用任何typedef或特殊定义或枚举来表示真/假值。如果您遵循我下面关于从不与布尔常量进行比较的建议,那么您只需要使用0/1来初始化标志。然而,这种做法在当今时代可能被认为过于反动。在这种情况下,应该明确使用,因为它至少有被标准化的好处

无论调用什么布尔常量,都只在初始化时使用它们。永远不要写这样的东西

if (ready == TRUE) ...
while (empty == FALSE) ...
这些总是可以被更清晰的图像所取代

如果准备好了。。。 虽然空的 请注意,这些事实上可以合理且可以理解地大声读出

给你的布尔变量正名(用full代替notfull)。后者导致代码难以轻松阅读。比较

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

前一对都能自然地阅读,然而!notfull即使是这样也很难阅读,在更复杂的布尔表达式中会变得更糟糕

通常应避免使用布尔参数。考虑这样定义的函数

void foo(bool option) { ... }
在函数体中,参数的含义是非常清楚的,因为它有一个方便的、希望有意义的名称。但是,呼叫站点看起来像

foo(TRUE);
foo(FALSE):
在这里,如果不始终查看函数定义或声明,就根本无法判断参数的含义,如果添加更多布尔参数,情况会变得更糟。。我也建议

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

无论是哪种情况,呼叫站点现在看起来都像

foo(OPT_ON);
foo(OPT_OFF);

读者至少有机会在不深入了解foo定义的情况下理解它。

这有助于明确你的意图。当您将一个变量声明为Bool_3;时,很明显,它不应该有一个除true和false之外的值

编写示例代码的更传统的方法是:

包括

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;
}

这有助于明确你的意图。当您将一个变量声明为Bool_3;时,很明显,它不应该有一个除true和false之外的值

编写示例代码的更传统的方法是:

包括

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;
}

这是一条切线。我有一个建议要补充:如果你有一个函数在逻辑上调用了很多布尔参数,我相信传统的做法是使用位掩码来代替。我有一个建议要补充:如果你有一个函数在逻辑上调用许多布尔参数,我认为使用位掩码是传统的做法。它们会对执行速度产生一些影响吗,由于它们的大小很小,并且只包含0或1?@user1825355,因此在两种执行相同操作并使用相同内存量的数据类型之间进行更改不太可能对性能产生任何影响。即使这样做了,这也不太可能使您的程序明显变慢。如果有什么不同的话,那么使用Bool会给乐观主义者带来更多的工作机会。如果您关心性能,请首先测量以找出您的程序花费的时间,然后是elim
消除瓶颈。现代的优化器和CPU体系结构太复杂,不能让你说改变一行代码会使程序变慢。那么我们可以说,使用布尔变量仅仅提高了源代码的可读性吗?@ USE1825355,我认为它是这样的。@ USER 1825355考虑了一些系统调用返回错误代码的惯例,并使用outparam作为实际结果值。错误代码为0通常表示成功。如果您从遵循该约定的两个函数以及从返回true或false的函数返回int,那么不清楚应该如何使用返回值来测试阳性结果。如果结果或如果结果==成功。如果将_Bool用于第二种类型,只需查看函数签名即可知道将得到什么值以及它们的含义。它们是否会对执行速度产生一些影响,由于它们的大小很小,并且只包含0或1?@user1825355,因此在两种执行相同操作并使用相同内存量的数据类型之间进行更改不太可能对性能产生任何影响。即使这样做了,这也不太可能使您的程序明显变慢。如果有什么不同的话,那么使用Bool会给乐观主义者带来更多的工作机会。如果您关心性能,请首先测量以找出您的程序在哪里花费时间,然后消除瓶颈。现代的优化器和CPU体系结构太复杂,不能让你说改变一行代码会使程序变慢。那么我们可以说,使用布尔变量仅仅提高了源代码的可读性吗?@ USE1825355,我认为它是这样的。@ USER 1825355考虑了一些系统调用返回错误代码的惯例,并使用outparam作为实际结果值。错误代码为0通常表示成功。如果您从遵循该约定的两个函数以及从返回true或false的函数返回int,那么不清楚应该如何使用返回值来测试阳性结果。如果结果或如果结果==成功。如果将_Bool用于第二种类型,则只需查看函数签名即可了解将获得的值及其含义。