【问题标题】:Are there any risks or gotchas when using C bools as integers将 C 布尔值用作整数时是否存在任何风险或陷阱
【发布时间】:2015-09-25 15:19:50
【问题描述】:

我有时发现在整数表达式中使用布尔值可以使代码更短更简单。 比如我更喜欢

int n_items = has_a + has_b + has_box * 5;

结束

int n_items = (has_a ? 1 : 0) + (has_b ? 1 : 0) + (has_box ? 5 : 0);

这应该是安全的,因为 false==0 和 true==1。有没有应该知道的风险或陷阱?

对于布尔值,我指的是 C99 布尔值或布尔表达式,如 a>b。当然,我必须注意实际上不是布尔值的值,例如 isdigit() 的返回值。

【问题讨论】:

  • 这是编写非常混乱的代码的好方法。
  • 没有布尔值这样的东西。 C只有整数,所以这个问题没有意义。 “布尔值”已经是整数。 C99 中有_Bool,但它仍然保持10无符号整数 值。
  • @meagar:C 中有一个数据类型_Bool/bool。然而,它实际上一个无符号整数类型,其值为01 .
  • 布尔表达式不会产生 bool 结果,而是产生 int(兼容性)。
  • @Emi1303 C 具有 _Bool 布尔类型。

标签: c boolean


【解决方案1】:

bool 的一个风险是它与int 具有不同的语义,并且许多程序已经使用bool 作为int 的别名并且没有使用来自@987654326 的C99 _Bool typedef @(例如,为 C89 开发或旨在兼容的程序):

typedef int bool;

那么这个表达式例如可能有不同的含义:

int a = (bool) 0.5;  // if bool is _Bool, evaluates to 1
                     // if bool is int, evaluates to 0

这会产生一些非常讨厌的错误。

另一方面,比(has_a ? 1 : 0) 更短的形式是惯用的!!has_a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2011-03-11
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多