【问题标题】:What conversion happens when we use "while" in C++?当我们在 C++ 中使用“while”时会发生什么转换?
【发布时间】:2021-11-06 05:45:35
【问题描述】:

我使用Microsoft documentationcppreference 作为背景。微软的网站说,while 中要评估的表达式必须是整数类型、pointer 类型或与这些类型可转换的类型。 Cppreference 的网站虽然说虽然需要 bool 类型表达式。

真正发生了什么?表达式是否必须转换为bool?如果我在一段时间内使用例如char类型的表达式,是否需要转换为bool

【问题讨论】:

  • 听起来你可以使用good C++ book
  • C(表达式具有整数类型)和 C++(表达式为 bool)之间可能会混淆?
  • bool 一个整数类型,因此 MS 文档是正确的。 cppreference 也是正确的,因为它们声明“任何可在上下文中转换为布尔值的表达式...”.
  • 顺便说一句:cppreference 到底是什么?是https://en.cppreference.com/吗?
  • Microsoft 的 C++ 文档非常受欢迎;有些部分非常好,有些部分似乎是由对语言知之甚少的实习生或志愿者写的。

标签: c++ while-loop boolean implicit-conversion boolean-expression


【解决方案1】:

例如根据 C++ 14 标准(6.4 选择语句)

2 条件规则既适用于选择语句,也适用于 for 和 while 语句

  1. ...作为表达式的条件的值是 表达式,上下文转换为布尔语句,而不是 转变;如果该转换格式不正确,则程序格式错误。

这是一个演示程序。

#include <iostream>

struct A
{
    operator int() const { return 1; };
};

int main() 
{
    A a;

    while ( a ) break;
    
    return 0;
}

首先使用用户定义的转换运算符将对象a 转换为int 类型

operator int() const { return 1; };

之后应用从int 类型到bool 类型的标准转换。

来自 C++ 14 标准(4 次标准转换)

7 [注意:对于类类型,用户定义的转换被视为 好吧;见 12.3。通常,隐式转换序列 (13.3.3.1) 由一个标准的转换序列和一个用户定义的序列组成 转换后跟另一个标准转换序列。 - 结尾 注意]

【讨论】:

  • 我不习惯直接在官方文档中搜索,但似乎总是最好的选择。
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2011-11-07
  • 2014-05-25
相关资源
最近更新 更多