它将在布尔表达中评估
What it is going to be evaluated in a boolean expression?
假设我有以下变量
bool b;
int i;
T* ptr;
当我放置 b
, i
或 ptr
或其他任何其他变量时,
var1 && var2
将要评估什么以解决此表达?C 11标准说明了有助于确定布尔结果的var1
和var2
的部分?有隐式铸造?
我不清楚标准对此有何评论。
编辑
我对如何将通用T
类型转换为bool
以及如何根据标准
我不清楚您要问什么。如果变量为非零,则在C和C 中为true。& amp;操作员仅在左操作数为True时才评估右操作数。除非有转换函数,否则不存在类T类实例的真实价值。这全都在标准中。
§5.14/1
,则未评估第二操作数。
&&
操作员组从左到右。操作数既可以上下文转换为类型bool
(第4条)...与&
不同,&&
可保证从左到右 评估:如果第一操作数为false
。
§4/2
[注意:带有给定类型的表达式将在多种情况下隐式转换为其他类型:
- 用作操作员的操作数。操作数对操作数的要求决定目标类型(第5条)。
...
这与标准的清晰度一样清晰。第一个var1
将隐式转换为bool
,然后,如果是true
,则var2
将被隐式转换为bool
。
编辑:我也会引用§4.12/1
可以将算术,未枚举,指针或指向成员类型的指针转换为
bool
类型的Prvalue。零值,空指针值或NULL成员指针值转换为false
; 任何其他值都转换为true
。std::nullptr_t
型的贵族可以转换为 类型bool
;结果值是false
。
编辑2:有关某些任意类型的T
,请参见§4/3,
...某些语言结构要求表达式 转换为布尔值。在这种情况下出现的表达式
e
被认为是上下文 转换为bool
,并且仅当声明bool t(e);
是正确的 发明的临时变量t
(8.5)。
有关此初始化的含义,请参见§8.5/16
- 否则,如果源类型是(可能是CV符号的)类类型,则考虑转换功能。 列举了适用的转换功能(13.3.1.5),最好的转换功能是通过 超载分辨率(13.3)。用户定义的转换,因此被调用以转换初始化器 表达在初始化的对象中。如果无法完成或模棱两可, 初始化是不形成的。
§13.3.1.5和§13.3中有更多细节,但是您将整夜阅读,然后阅读一些。但最重要的是,如果T
是类类型,则必须有一个转换功能。最好的做法是为全班定义explicit operator bool
。但是,您也可以执行诸如operator void*
之类的操作,这是std::ios
及其派生类定义的操作,因为然后可以将void*
通过标准转换序列转换为bool
。(这应该被视为C 11中的不弃用成语。)
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- std::condition_variable::wait()如何评估给定的谓词
- 布尔真值表 C++
- 布尔值始终评估为真
- C++ 动态评估变量类型布尔值
- 布尔表达式的奇怪评估
- 如何从文件显示布尔值表
- 我在使用布尔函数时遇到问题,其中用户输入两个字母并输出字母表中最高的字母
- 将流运算符>>评估为布尔值
- 在C 中使用两个CHAR变量评估布尔值
- 它将在布尔表达中评估
- 我的代码中的错误 - 布尔真值表
- 将地址和布尔值存储在一个单词中,以实现无锁双链表
- 内部评估的布尔条件以获得循环性能
- 在C++中将字符串评估为布尔值
- 布尔函数始终为真,单向链表中的尾节点删除创建无限循环
- 在MFC中实现一个布尔表结构