3

我们都知道 C++(虽然不是超集)几乎是从 C 派生的。

在 C++ 中,运算符 <、<=、>、>=、== 和 != 都有布尔返回值。但是,在 C 中,相同的运算符返回 1 或 0,因为 C 中没有“布尔”类型。

由于除 0 之外的所有整数值都被视为“真”,而 0 为“假”,我想知道:

C++ 是否仍将运算符的返回值限制为 1 与 0,或者这些运算符之一的“真”是否返回任何 1 字节值,只要它不是 0?

我想知道,因为使用这些返回值作为显式 1 或 0 在不分支的按位运算中很有用。

作为一个可怕的例子,采取以下措施:

bool timesTwo;
int value;

//...

if(timesTwo)
    value << 1;

//vs

value << (int) timesTwo;
4

3 回答 3

5

C++ 是否仍将运算符的返回值限制为 1 与 0,或者这些运算符之一的“真”是否返回任何 1 字节值,只要它不是 0?

比较运算符,假设它们没有被重载,只会返回trueand false

int(true)始终为 1。

int(false)始终为 0。

所以,

int one(1), two(2);
assert( (one<two) == 1 );
assert( (two<one) == 0 );
于 2012-10-26T21:37:37.090 回答
2

实际上,bool在表达式中使用时会自动转换为 C++ 中的整数(如果为真,则为 0,如果为假),无需强制转换。

value << (int) timesTwo;

这种情况是不必要的:如果 `timesTwo` 为真,那么

您可以直接在没有 casr 的情况下进行:

value<<timesTwo;

这相当于:

value<<1;
于 2012-10-26T21:52:20.433 回答
0

该类型bool有两个值:falsetrue。您可以将其视为整数,在这种情况下,false将转换为 0 并true转换为 1。这就是它的全部内容。

C 风格的布尔类型,其中 0 被视为假,非零被视为真,当有人天真地做类似#define FALSE 0and的事情时会导致问题#define TRUE !FALSE。这实际上定义TRUE为 1,并且类似的比较if (f() == TRUE)可能会神秘地失败。正确的测试是if (f() != FALSE). 当然,对于真正的布尔类型,这不是问题,因为不为假的值总是相同的。

于 2012-10-27T14:48:57.960 回答