除了0和1之外的整数的布尔值是什么?

6

我正在编写一个简单的函数,根据一组文件生成新的文件名。这些文件应该被命名为cam1_0.bmp、cam1_1.bmp等。我尝试了以下代码:

static int suffix = 0;
std::string fPre("cam");
std::ifstream fs;
std::string fName;
do {
    fName = fPre;
    fName.append(std::to_string(camera)).append("_").append(std::to_string(suffix)).append(".bmp");
    fs.open(fName);
} while (fs.good() && ++suffix);

这个代码可以正常工作,但是让我想知道除了0和1之外的数字值对应的布尔值的标准定义行为是什么。通过这个实验,我发现所有的数值,包括负数,都会被视为true,只有0才被标准认为是false吗?


3
是的。0 是唯一的“假”整数。 - Cameron
3个回答

18

C++中,整数没有布尔值。(不同的语言有不同的规则,但这个问题是关于C++的。)

将整数值转换为bool类型的结果(通常会隐式地进行转换)是被定义好的。将0转换为false;将任何非零值转换为true

这同样适用于浮点数(0.0转换为false,所有其他值转换为true)和指针(空指针转换为false,所有非空指针值转换为true)。


2
除了上述内容外,值得注意的是规则“类型的默认值转换为false”,尽管在其他一些语言中是这样的,在C++中仅适用于基本内置类型。特别是关于转换为bool空字符串被视为它所衰减到的非空指针,因此它会转换为true。而在例如Python中,它会转换为False - Cheers and hth. - Alf
2
我不同意你的说法:“整数没有布尔值”。首先,从底层来看,它们都是由0和1组成的,因此在机器看来并没有区别。其次,有很多编程语言是弱类型的,并且使用数字作为布尔值,例如M[umps];或者支持从数字到布尔值的隐式转换,例如C;或者只是将所有内容视为“真”或“假”,例如JavaScript。 - Sildoreth
1
@Sildoreth:如果你愿意,你可以持不同意见,但这就是标准确立的方式。而且无论其他语言做了什么奇怪的事情都没关系。 - Deduplicator
1
@Sildoreth:这个问题是关于C++的;这也是我回答的上下文。我使用“boolean”这个词特别指代C++类型bool,而“integers”则指代C++整数类型的值。任何类型的值,包括bool,都表示为“全1和0”,但这个问题不是关于底层表示的。C++标准明确规定,在ifwhile语句中的条件会被转换为bool。(例如,C标准并没有这样说;如果是类似标记为“C”的类似问题,我的答案会完全不同。) - Keith Thompson
1
利用这个属性并像上述那样使用它是可以的吗?还是说会被认为是不良实践? - dev_nut
显示剩余2条评论

4

值为零(对于整数、浮点数和无作用域枚举)、空指针和空指向成员的值变为false。所有其他值变为true。

来源


3

5
虽然在这种情况下VB和C++的行为是一样的,但你不应该假设Visual Basic的行为与C++的行为有任何关系。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接