【问题标题】:What is the utility of a bool variable in C?C语言中bool变量的用处是什么?
【发布时间】:2012-11-15 01:01:19
【问题描述】:

在下面的代码中使用 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;
}

【问题讨论】:

    标签: c variables boolean


    【解决方案1】:

    这对于明确您的意图很有用。当您将变量声明为Bool_ 时,很明显它不应该有除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;
    }
    

    【讨论】:

    • 它们会不会对执行速度有一些影响,因为它们体积小并且只包含 0 或 1?
    • @user1825355 先验非常好 在执行相同操作并使用相同内存量的两种数据类型之间进行更改根本不会对性能产生任何影响。即使确实如此,这仍然不太可能使您的程序明显变慢。如果有的话,使用_Bool 会给优化器更多的工作。如果您关心性能,请首先测量以找出程序花费时间的地方,然后消除瓶颈。现代优化器和 CPU 架构过于复杂,不能让您说更改一行代码会使程序变慢。
    • 那么我们可以说使用bool变量只会提高源代码的可读性吗?
    • @user1825355 我认为确实如此。
    • @user1825355 请特别考虑某些系统调用返回错误代码的约定,并为实际结果值使用outparam。 0 的错误代码通常表示成功。如果您从两个遵循该约定的函数以及从返回 truefalse 的函数返回 int,那么对于返回值应该做什么来测试肯定结果并不是很明显。 (if (result)if (result == SUCCESS)。)如果您将_Bool 用于第二种,您只需查看函数签名即可了解您将获得哪些值以及它们的含义。
    【解决方案2】:

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

    无论调用什么布尔常量,仅将它们用于初始化。永远不要写类似

    的东西
    if (ready == TRUE) ...
    while (empty == FALSE) ...
    

    这些总是可以用清除器代替

    如果(准备好)... 而 (!empty) ... 请注意,这些实际上可以合理且可以理解地大声读出。

    给你的布尔变量正名,即full而不是notfull。后者导致代码难以阅读。比较

    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 的定义。

    【讨论】:

    • 好吧,这不切实际。我有一个建议要补充:如果您有一个逻辑上需要许多布尔参数的函数,我认为使用位掩码是常规做法。
    猜你喜欢
    • 2014-02-17
    • 2012-08-16
    • 1970-01-01
    • 2012-12-12
    • 2014-09-09
    • 2012-09-16
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多