【问题标题】:Return value of a boolean expression in CC中布尔表达式的返回值
【发布时间】:2017-02-05 10:26:21
【问题描述】:

出于不值得一提的原因,我想知道布尔表达式是否有标准定义的值。例如

int foo () {
    return (bar > 5);
}

背景是我担心我们的团队将 TRUE 定义为不同于 1 的东西,我担心有人可能会这样做:

if (foo() == TRUE) { /* do stuff */ }

我知道最好的选择是简单地做

if (foo())

但你永远不知道。

是否有为布尔表达式定义的标准值,还是取决于编译器?如果有,标准值是否包含在 C99 中? C89呢?

【问题讨论】:

  • 有一个标准类型bool,其常量truefalse在C99以来的标准标头stdbool.h中定义。
  • 要完成尤金所说的,您可能会对这个链接感兴趣:en.cppreference.com/w/c/types/boolean
  • 谢谢。我实际上正在寻找有争议的事实来 1)更改 TRUE 的定义,以及 2)使用符合 C99 的编译器(现在,我们正在使用符合 C89 的编译器)

标签: c boolean c99 c89


【解决方案1】:

==!=&&|| 等产生布尔值的运算符将评估为表达式的 1 为真,如果表达式为假,则为 0。这个表达式的类型是int

所以如果TRUE宏没有定义为1,那么像上面这样的比较就会失败。

在布尔上下文中计算表达式时,0 计算为假,非零计算为真。所以为了安全起见,TRUE 应该定义为:

#define TRUE (!0)

正如 cmets 中提到的,如果您的编译器符合 C99,您可以#include <stdbool.h> 并使用truefalse

根据C99

6.5.3.3(一元算术运算符)

逻辑否定运算符! 的结果为 0,如果 其操作数的值比较不等于 0,如果其操作数的值比较不等于 1 操作数比较等于 0。结果的类型为 int。这 表达式!E 等价于(0==E)

6.5.8(关系运算符)

每个运算符<(小于)、>(大于)、<= (小于或等于)和>=(大于或等于) 如果指定的关系为真,则应产生 1,如果为假,则应产生 0。 结果类型为int

6.5.9(等式运算符)

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

6.5.13(逻辑与运算符)

如果两个操作数比较,&& 运算符将产生 1 不等于0;否则,它产生 0。结果的类型为 int

6.5.14(逻辑或运算符)

|| 运算符在其任一操作数比较时应产生 1 不等于0;否则,它产生 0。结果的类型为 int

【讨论】:

  • 谢谢。我期待这么多。但我不确定它是否按标准计算为 1,或者这是否是特定于编译器的
  • @JACH 添加了 C99 中关于布尔表达式的附加说明。
  • 详细信息:结果的类型int==, !=, &&, ||, !, >, >=, <, <=
  • 感谢您的信息。所以它是在 C99 中定义的。似乎 C89 信息很难获得或不存在。我猜是切换到 C99 的另一个原因。
  • 我认为你可以更改 “所以为了安全起见,TRUE 应该定义为:#define TRUE (!0) 类似于 “如果你不能记住 true 在 C 中的值是什么(它是 1),你可以使用 #define TRUE (!0)" 因为我见过高级代表建议 !0 并不总是 1。
【解决方案2】:

C 编程语言没有定义 Boolean 值。传统上,C 编程语言使用integer 类型来表示布尔数据类型。

C 中的布尔值:

0 = false` 

Any other value = true`

通常人们会使用1 来表示真实。

C99 引入了_Bool 数据类型,这在其他C 衍生品中不可用。参见维基百科链接here。此外,出于兼容性原因,添加了一个新的标头stdbool.h。此标头允许程序员以与C++ 语言相同的方式使用boolean 类型。

要在C 中使用bool,我们可以使用enum,如下所示。

enum bool {
    false, true
};

bool value;
value = bool(0); // False
value = bool(1); // True

if(value == false)
    printf("Value is false");
else
    printf("Value is true");

另外,相关的堆栈溢出问题 Is bool a native C type?

【讨论】:

  • 感谢您的链接,非常有用。不过,我的问题与布尔运算的结果更相关,因为我们在内部已经使用 TRUE 或 FALSE 作为伪布尔类型。
  • 这完全没有回答问题。在 C 中使用 enum 表示布尔类型是一个非常糟糕的主意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
相关资源
最近更新 更多