C语言中布尔表达式的返回值

C语言中布尔表达式的返回值,c,boolean,c99,c89,C,Boolean,C99,C89,出于不值得一提的原因,我想知道布尔表达式是否有一个标准的定义值。例如 int foo () { return (bar > 5); } 背景是,我担心我们的团队将TRUE定义为与1不同的东西,我担心有人可能会: if (foo() == TRUE) { /* do stuff */ } 我知道最好的选择是简单地去做 if (foo()) 但你永远不知道 布尔表达式是否有定义的标准值,还是由编译器决定?如果有,C99中是否包含标准值?C89呢?一个操作符,比如==,=、&&和|

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

int foo () {
    return (bar > 5);
}
背景是,我担心我们的团队将TRUE定义为与1不同的东西,我担心有人可能会:

if (foo() == TRUE) { /* do stuff */ }
我知道最好的选择是简单地去做

if (foo())
但你永远不知道


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

一个操作符,比如
==
=
&&
| |
将计算为表达式中的1为真,如果表达式为假,则计算为0。此表达式的类型为
int

因此,如果
TRUE
宏未定义为
1
,则上述比较将失败

在布尔上下文中计算表达式时,0的计算结果为false,非零的计算结果为true。因此,为了安全起见,
TRUE
应定义为:

#define TRUE (!0)
正如评论中提到的,如果您的编译器符合C99,则可以
#包括
并使用
true
false

根据:

6.5.3.3(一元算术运算符)

逻辑求反运算符的结果
int
。这个 表达式
!E
相当于
(0==E)

6.5.8(关系运算符)

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

6.5.9(相等运算符)

==
(等于)和
=(不等于)运算符为
与关系运算符类似,除了其较低的
优先。如果指定了
关系为true,如果为false,则为0。结果具有类型
int

6.5.13(逻辑与运算符)

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

6.5.14(逻辑或运算符)

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


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

C中的布尔值:

0 = false` 

Any other value = true`
通常人们会使用
1
表示真实

C99引入了
\u Bool
数据类型,该数据类型在其他
C
衍生产品中不可用。请参阅维基百科链接。此外,出于兼容性原因,添加了一个新的头文件
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");
另外,还有相关的堆栈溢出问题

自C99以来,在标准标题
stdbool.h
中定义了一个标准类型
bool
,其中包含常量
true
false
。要完成Eugene所说的内容,您可能会对以下链接感兴趣:谢谢。事实上,我正在寻找有争议的事实,1)更改TRUE的定义,2)使用兼容C99的编译器(现在,我们使用兼容C89的编译器),谢谢。我早就料到了。但我不确定它是否按标准计算为1,或者这是否是一个问题-specific@JACH添加了C99中关于布尔表达式的附加注释。详细信息:结果类型为
int
,其中
==,!=,&&&,| |,!,>,>=,谢谢你提供的信息。因此它在C99中定义。似乎C89信息很难获得,或者根本不存在。我想换成C99的另一个原因是。我想你可以把“为了安全起见,TRUE应该定义为:
#define TRUE(!0)
”的措辞改成类似于“如果你记不起C中TRUE的值是什么(它是1),你可以使用
#define TRUE(!0)
”的措辞,因为我看到有高代表性的人建议
!0
并不总是1。感谢您提供的链接,非常有用。不过,我的问题更多地与布尔运算的结果有关,因为我们在内部使用的伪布尔类型已经是TRUE或FALSE。这并不能回答问题。在C中使用
enum
作为布尔类型是一个非常糟糕的主意!