变量定义到C++布尔值转换
Variable definition to boolean value conversion in C++
我发现下面的代码在 C++98 及以上版本中有效:
if (int x = 7) { // int x; if (x = 7) makes sense
std::cout << x << 'n'; // 7 is printed
}
问题:控制变量定义到布尔表达式转换的规则是什么?
如果如下所示,则 b/c if 条件是一个计算结果为整数的赋值表达式是有意义的:
int x;
if (x = 7) {
std::cout << x << 'n';
}
赋值表达式的结果是赋值目标,在本例中为x
。 由于bool(7)
为真,因此条件为真。
这个更有用的功能的常见用法是这样的:
if (auto* x = get_some_pointer())
// use x, which is known to be not null
声明变量的位置与它无关。 按照您的示例,这将执行相同的操作:
int x;
if (x = 7)
// ...
管理这部分语法的规则在[stmt.pre] 中。
1
个条件: 表达 attribute-specifier-seqoptdecl-specifier-seq declarator brace-or-equal-initializer4 不是表达式的条件是声明 声明符不得指定函数或数组。 decl-specifier-seq 不应定义类或枚举。如果 自动类型说明符出现在 decl-specifier-seq 中,类型 声明的标识符是从初始值设定项推导的,如下所述 在 [dcl.spec.auto] 中。
6 作为初始化声明的条件的值 switch 语句以外的语句是声明的值 变量上下文转换为布尔值。如果该转换是 格式不正确,程序格式不正确。条件的值 是 switch 语句中的初始化声明 是 的值 声明的变量(如果它具有整型或枚举类型),或 隐式转换为整型或枚举类型的变量 否则。作为表达式的条件的值是值 的表达式,在上下文中转换为布尔值以表示语句其他 比开关;如果该转换格式不正确,则程序是 格式不正确。条件的值将简称为简单 用法明确的"条件"。
7 如果条件可以在语法上解析为 表达式或块范围名称的声明,它被解释 作为声明。
8 在条件的 decl-说明符-seq 中,每个 decl-说明符 应为类型说明符或
constexpr
。
在上面的文本中,condition
是出现在if (condition)
、while (condition)
和switch (condition)
的语法作品中的语法元素。[stmt.stmt]中大多数其他提及的condition
都涉及转换为布尔值或整数值(在开关中)后的值。基于值的行为是人们所期望的。
在其他地方提到的唯一另一件值得注意的事情是声明相对于其声明区域的行为。例如,在 if 语句中
if(auto handle = getHandle())
handle->foo();
else
handle->bar();
该名称在两个分支中都可用。但这在[basic.scope.block]中提到过。
3 在 init 语句、for-range 声明中声明的名称,以及 在 if、while、for 和 switch 语句是本地 if、while、for 或 switch 语句(包括受控 声明),并且不得在随后的条件下重新声明 该语句也不在最外层的块中(或者,对于 if 语句, 任何最外层的块)的受控语句。[ 示例:
if (int x = f()) { int x; // error: redeclaration of x } else { int x; // error: redeclaration of x }
— 结束示例 ]
与 C 一样,C++布尔值被视为值为 0 或 1 的整数。从其他值转换时,如果值为零,它将布尔值解析为 false,则每隔一个数字变为 true。
这样可以轻松检查指针(也可以解释为数字),其中值为 0 的指针是空指针。
任何赋值语句的结果都是赋值后左操作数的值。
值零(对于整型枚举、浮点枚举和无作用域枚举)以及空指针和空指针指向成员的值变为 false。所有其他值都变为 true。
所以这里 int x 的值为 7 变为 true。
- 变量定义到C++布尔值转换
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- 在目标 c++ 中将 CFTypeRef 转换为布尔值
- isspace 函数的性能警告,从 int 转换为布尔值
- 将返回表达式隐式转换为布尔值
- 将结构转换为布尔值
- 整数在 C++ 中没有被类型转换为布尔值
- 为什么我的变体将 std::string 转换为布尔值
- 为什么使用 int 的转换,而不是布尔值
- lambda 转换为布尔值,而不是推导函数指针类型
- 从常量字符串到布尔值的隐式强制转换
- 我无法将'2D array whit bool'转换为"空 2D 数组布尔值"(用于生命游戏)
- 尝试将字符串变量转换为布尔值会导致 "true" 和 "false" 都等于 0
- Typedef shared_ptr转换为<T>布尔值
- 将8个布尔值转换为一个字节的最佳方式
- 将布尔值转换为字符会产生错误和代码中断
- 如何习惯性地将布尔值转换为布尔值
- 布尔值转换为字符串,并将boolalpha与一个方法组合在一起,而不是在打印时单独键入它
- 用户定义的布尔值转换的优先级