C++ 编译器是否同样处理int和bool类型?
如果我有以下代码:C++ 编译器是否同样处理int和bool类型?,c++,types,C++,Types,如果我有以下代码: int a = 1; bool b = 1; a等于b吗?即使程序可能会返回相同的结果,但它们在低级别的所有方面实际上是平等的吗 此外,如果我使用代码(伪代码),例如: execute()会运行吗?我在寻求理论上的答案,但我无法用实验说服自己,因为这不是自然科学。谢谢大家。我想你们可以用以下方法说服自己: 这两种类型可能看起来相似,因为两者之间存在隐式转换。任何为零的整数表达式都可以隐式转换为false,任何非零的整数表达式都可以隐式转换为true。相反,false可以隐式
int a = 1;
bool b = 1;
a等于b吗?即使程序可能会返回相同的结果,但它们在低级别的所有方面实际上是平等的吗
此外,如果我使用代码(伪代码),例如:
execute()
会运行吗?我在寻求理论上的答案,但我无法用实验说服自己,因为这不是自然科学。谢谢大家。我想你们可以用以下方法说服自己:
这两种类型可能看起来相似,因为两者之间存在隐式转换。任何为零的整数表达式都可以隐式转换为false
,任何非零的整数表达式都可以隐式转换为true
。相反,false
可以隐式转换为零,true
可以隐式转换为一。如果2!=一,
现在是关于
execute()代码>在问题的代码段中被调用应该是显而易见的:值a
将在if
语句中转换为bool
,由于它不是零,它将转换为true
,并导致调用execute()
在布尔上下文中使用时,非零数值或指针表达式将计算为true
。类似地,零表达式的计算结果将为false
。但是,<代码> int <代码>和 BOOL是不同的类型,所以它们不一样。 < p>这个线程与CARS相比,讨论了C++布尔值,但是它会让您了解引擎下发生了什么。
a等于b吗?即使程序可能会返回相同的结果,但它们在低级别的所有方面实际上是平等的吗
这完全取决于你所说的平等是什么意思。类型不同,这意味着内存中的表示可能会有所不同(编译器可以将这两个表示为完全相同,但也可以不这样做)。在大多数编译器/体系结构中,bool
只占用一个字节的存储空间,int
的大小更大(通常为4个字节,但这取决于体系结构)
除了大小不同之外,编译器将以不同的方式处理这两种类型(不仅加载和存储到内存,而且操作也会有所不同。在bool中只能存储0和1,这意味着某些操作可能会使用这些知识。例如,在一种情况下,条件测试的实现会有所不同(注意,本文有一个未定义行为的案例,导致bool
计算为true
和false
。对于测试,编译器假设bool
只能是0或1,而int
不能发生这种情况。)
从逻辑的角度来看,语言决定了不同类型在操作中的使用方式,特别是如果您试图在程序中比较a
和b
,表达式的结果将是true
。请注意,这并不意味着它们完全相同,语言定义了一组转换用于将两个变量转换为同一类型并在该类型中执行比较的规则。在这种情况下,将转换为int
。bool
变量将转换为0
iffalse
或1
iftrue
另外,如果我使用代码(伪代码),例如:if(a)execute()
,execute()会运行吗
是。在这种情况下,if
中的条件需要一个bool
值,因此转换将从int
转换为bool
。标准规定,如果整数值为0
,则转换为false
,否则转换为true
,有效地实现了i的等效f(a!=0)
。由于a
是1
,因此条件保持并execute()
将被评估。实验有什么问题吗?@BrendanLong:它们只告诉你你的编译器是如何工作的。这应该对某人有帮助吗?如果OP首先问这个问题,你认为他可能理解这段代码吗?我知道我不知道…@Nedbatcheld这段代码实际上是在问编译器ifa
和b
是同一类型。如果你编译它,它将回答OP的问题。@NedBatchelder,std::is__same
检查两种类型是否相同,并且decltype
给出类型。static_assert
是一个编译时assert
@Ned我对答案进行了一点扩展。其他人我已经解释了代码中的位,所以我只感谢它们,而不是重复它们:)
if (a)
then execute();
#include <type_traits>
int main() {
int a = 1;
bool b = 1;
static_assert(! std::is_same<decltype(a), decltype(b)>::value,
"No, they are not the same on all aspects");
}
#include <cassert>
int main() {
int a = 2;
bool b = 2;
assert(a != b);
}