当您if在C/C++或任何其他逻辑运算符中使用该语句时,是否将操作数传递给转换为整数以进行求值的语句?
我目前的理解是传递给语句的操作数被强制转换为一个整数来测试它是否为非零(true),并且如果你传递一个指针,这可以被强制转换为一个整数来评估0/null值是否为定义为false.
我的印象是C++的标准下Bool值均简单地typedef的unsigned char具有值0和1.
任何人都能用这种行为解释幕后实际发生的事情吗?
在C++中bool是一个独立的类型,与之无关unsigned char.在C++语言中,下面的表达式if确实是隐式地转换为bool类型.注意:bool具体而言,不是int.对于除标量以外的标量类型bool,隐式转换bool基本上是通过与文字的非等式比较来定义的0.即比较不相等的值将转换为true,而比较相等的值则转换为false.
换句话说,在C++语句中
if (a)
Run Code Online (Sandbox Code Playgroud)
被解释为
bool tmp = (bool) a;
// `tmp` is either `true` or `false`
if (tmp)
Run Code Online (Sandbox Code Playgroud)
标量类型的解释为
bool tmp = a != 0;
if (tmp)
Run Code Online (Sandbox Code Playgroud)
请注意,这也适用于指针类型"按预期".但是它不是将指针转换为int类型,而是实际上反过来:它转换为文字0为正确的指针类型.
对于其他类型,它可能是不同的,例如对用户定义的转换运算符的调用operator bool().
在C语言中,表达式if必须具有标量类型.它隐含地与常数进行比较0.请注意,这不涉及将控制表达式转换为int.对常量的比较0是针对所有标量类型单独定义的.例如,int它具有其自然含义,而对于指针类型,它被解释为与空指针的比较.现在,C中这种比较的结果有类型int并且评估为0或者1.那个0或1什么控制着什么if分支.
换句话说,在C语句中
if (a)
Run Code Online (Sandbox Code Playgroud)
立即被解释为
int tmp = a != 0;
// `tmp` is either `0` or `1`
if (tmp)
Run Code Online (Sandbox Code Playgroud)
此外,您int在转换为int类型时假设空指针生成零值是不正确的.两种语言都没有这样的保证.空指针不保证由零地址值表示,并且在转换为时不保证产生零值int.