【问题标题】:return counter==0 produces a boolean or integer?return counter==0 产生一个布尔值还是整数?
【发布时间】:2015-07-25 04:57:24
【问题描述】:

我是 C 初学者并检查此代码

int is_finished()
{
    int counter = 0;
    sem_wait(&global_mutex);
    counter = NotEatenCount;
    sem_post(&global_mutex);    
    return counter==0;
}

函数应该返回一个整数。 return counter==0 在这里是什么意思?它看起来像:

if(counter==0){
  return true;
}
else{
 return false;
}

【问题讨论】:

  • 函数只能返回int,所以counter==0的评估无关紧要。 (它是布尔值(转换为 0 或 1 个整数),因为 c89,IIRC)
  • 对于条件评估效果,任何非零值都将被视为真,因此安全的做法是在任何情况下都与0而不是1进行比较,或者只使用表达式作为真值。

标签: c


【解决方案1】:

我宁愿避免使用truefalse,因为它们是您使用 C 语言的方式所固有的。

整数值 0 为假。非 0 值为真。所以

if (apples) {...}

将在apples != 0 时执行。

C 语言将给出1 的值以响应特定测试。

int a = (apples > 0);

并非所有语言都如此,有些人认为-1 是真的。但永远不需要与 0、true 或 false 进行比较。

if (a) {...}

只有笨拙的代码会尝试使用truefalse。否则,逻辑流程是甜蜜的。

TRUE指出语句的荒谬性

if ((ptr == NULL) == TRUE) {...}

什么时候

if (ptr == NULL) {...}

完成这项工作。

【讨论】:

    【解决方案2】:

    最好的解决方案是检查 - 打印typeof (:

    无论如何,答案是两者都。在 C 中,true/false 关键字不是语言内置的。它们只是一个定义,或者是使用它们的库的一部分,例如:

    #define TRUE 1
    #define FALSE 0
    

    如果这些定义是数字,则将它们保存为整数,因此,每个布尔值都是一个整数(但相反的情况并非如此......除非您以这种方式定义它)。规范是0为FALSE,其余为TRUE

    编辑:回想起来,我实际上已经回答了一个与目标 C 相关的类似问题。如果您有兴趣,请查看 here

    【讨论】:

    • 在 C 中,布尔值确实存在。 _Bool.
    • @chux 看这里:stackoverflow.com/questions/8724349/… _Bool 是来自stdbool 的布尔值的旧版本,与我给出的定义相似。
    • _Bool 是语言的一部分 - 它是布尔类型 - 即使代码不包含 stdbool.h 也可用。 boolstdbool.h 中的类型定义,并且还定义了 truefalse
    • 值得一提的是_Bool是在C99中引入的
    • truefalse 关键字不存在是一种误导:它们不是关键字,但它们确实作为stdbool.h 中的宏定义存在。
    【解决方案3】:

    return counter==0 产生一个int,因为返回类型是int
    它的值为01


    counter==0 本身会产生一个int

    ==(等于)和!=(不等于)运算符类似于关系运算符,除了它们的优先级较低。)如果指定的关系为真,则每个运算符产生 1,如果它是假的。结果的类型为int。 ... C11 §6.5.9 3

    无论是否尝试返回 3.14,该函数都会返回 int - 它将被转换为 int。 @wildplasser

    int is_finished(){   
       ...
       return true;
       ...
       return 3.14
    }
    

    【讨论】:

      【解决方案4】:
       return counter==0
      

      如果counter 等于0,则返回int1,否则返回int0

      在 C 中,相等和关系运算符总是产生 int01。请注意,这在 C++ 中有所不同,默认情况下,这些运算符返回 bool 类型的值。

      【讨论】:

        【解决方案5】:

        由于您使用的是“等于”运算符而不是“赋值”运算符,您将获得一个布尔函数(这里的区别:http://en.wikipedia.org/wiki/Operators_in_C_and_C++)。因此,您的退货声明如何决定这一点是:

        返回(计数器 == 0);


        我相信你想在这里返回的是

        返回计数器

        然后在您的 is_finished() 函数之外,如果 counter == 0 或不等于,则表示您的布尔值。

        【讨论】:

          【解决方案6】:

          == 计算结果为 0 或 1 的整数,具体取决于比较结果。在这种情况下,如果 counter 等于 0,函数将返回 1 (true);否则返回 0。

          【讨论】:

            猜你喜欢
            • 2020-08-30
            • 2011-07-30
            • 2017-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多