为什么不能在 do while 循环的表达式部分内声明变量?

2024-02-06

以下语法有效:

while (int i = get_data())
{
}

但以下情况则不然:

do
{
} while (int i = get_data());

我们可以通过标准草案了解原因N4140部分6.4:

1 [...]


condition:
     expression
     attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
     attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list  

2 条件规则同时适用于选择语句和 到for and while声明(6.5)。 [...]

和部分6.5

1 迭代语句指定循环。

      iteration-statement: 
             while ( condition ) statement
             do statement while ( expression ) ;

相反,你被迫做一些丑陋的事情,比如:

int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic

这样做的理由是什么?


范围界定似乎是个问题,范围是什么i声明于while的一部分do while陈述?当声明实际上位于循环本身下方时,在循环中使用变量似乎很不自然。对于其他循环,您不会遇到此问题,因为声明位于循环体之前。

如果我们看一下C++ 标准草案 https://github.com/cplusplus/draft/blob/master/papers/n4140.pdf部分[stmt.while]p2 https://timsong-cpp.github.io/cppwp/n4140/stmt.while#2我们看到对于while 语句 that:

while (T t = x) statement

相当于:

label:
{ // start of condition scope
    T t = x;
    if (t) {
        statement
    goto label;
    }
} // end of condition scope

and:

在条件中创建的变量将在循环的每次迭代中被销毁和创建。

我们将如何制定这个do while case?

正如 cdhowie 指出的,如果我们看一下部分[stmt.do]p2 https://timsong-cpp.github.io/cppwp/n4140/stmt.do#2它说 (强调我的):

在 do 语句中,子语句被重复执行,直到 表达式的值变为 false。测试在每次之后进行 语句的执行。

这意味着循环体在我们到达声明之前就被评估了。

虽然我们可以为这种情况创建一个例外,但这会违反我们的直觉,即通常名称的声明点是在我们看到完整的声明之后(有一些例外,例如类成员变量)带来的好处不明确。申报点已在章节中介绍3.3.2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不能在 do while 循环的表达式部分内声明变量? 的相关文章

随机推荐

  • IPython 笔记本到幻灯片:Reveal 未定义

    我正在使用 nbconvert 从我的笔记本制作一个 Reveal js 幻灯片 具体来说 我正在运行 ipython nbconvert to slides analysis ipynb 这将创建 analysis slides html
  • 发送带有数据库的应用程序

    如果您的应用程序需要数据库并且它带有内置数据 那么发布该应用程序的最佳方式是什么 我是不是该 预先创建 SQLite 数据库并将其包含在 apk 在应用程序中包含 SQL 命令并让它创建数据库并在首次使用时插入数据 我看到的缺点是 可能的
  • 如何将所有路由重定向到 gatsby 索引

    我正在尝试创建一个只有一页来处理所有路线的 Gatsby 项目 我有这样的索引页面 const App gt return
  • 如何将作业放入詹金斯的文件夹中?

    我正在尝试使用 jenkins DSL 脚本将作业放入文件夹中 现在我创建一个 listView 并将我正在使用的代码放入我的工作中 listView MyJobsList jobs map each name it key trim co
  • 如何将一个存储库的公共子文件夹与另一个存储库同步?

    我有一个软件项目foo在我公司托管的内部 GitLab 存储库上 并希望将其部分发布为开源项目baa在 GitHub 上 假设我将公共部分放在 public 文件夹中 foo public 以及文件夹 private 中的私有部分 foo
  • 在列表中查找因素的最有效方法是什么?

    我想要做什么 我需要创建一个函数 给定一个正整数列表 可以有重复的整数 计算所有三元组 列表中 其中第三个数字是第二个数字的倍数 第二个数字是第一个数字的倍数 同一个数字不能在一个三元组中使用两次 但可以被所有其他三元组使用 例如 3 6
  • Bugzilla 如何在本地 PC 上运行?

    我已在本地系统上安装了 bugzilla 版本 3 6 3 当我点击 开设新帐户 按钮 链接并输入有效电子邮件后 我收到以下错误 从 bugzilla daemon 发送邮件到 电子邮件受保护 cdn cgi l email protect
  • 我们是否仍然受制于 Visual Studio 2013 中的安装程序项目 .vdrpoj 或 WiX?

    有没有更好的Installer项目视觉工作室2013 https en wikipedia org wiki Microsoft Visual Studio Visual Studio 2013比安装项目或WiX https en wiki
  • 使用 grep 在多个文件中查找字符串

    我有一个文件夹 里面有子文件夹 所有子文件夹都有多种类型的文件 我想在里面搜索一个单词 css 文件 我正在使用 Windows 7 并且我有grep 我如何使用grep to 找到图案并打印 如果找到模式 请提供文件名 和路径 其实你不需
  • “主要”java.lang.NoClassDefFoundError:org / apache / http / HttpEntity

    我正在尝试在我的项目中使用 apache http 库 我在我的项目中导入了库https i stack imgur com Cm9ck jpg https i stack imgur com Cm9ck jpg 当我运行我的程序时 我收到
  • 在 Razor 组件 (Blazor) 中渲染 Razor 部分视图

    我最近发现了 Blazor 并且一直在尝试一些测试项目 以更好地评估如何将其包含在未来的项目中 由于具有 MVC 背景 我从一个 MVC 项目开始 并向其中添加了 Razor 组件 并将其嵌套在标准 MVC razor 页面中 反过来可能吗
  • Windows 会清除内存页吗?

    我知道 Windows 有一个选项可以清除页面文件当它关闭时 当实际物理 虚拟内存进入或超出范围时 Windows 是否会对实际物理 虚拟内存执行任何特殊操作 例如 假设我运行应用程序 A 它将可识别的字符串写入内存中的变量 然后关闭该应用
  • 使用参数调用事件处理程序

    Visual Studio 2008 C 3 0 我有一个调用事件处理程序的方法 我想将该方法接收到的两个参数传递给事件处理程序 我想做这样的事情 wc DownloadDataCompleted wc DownloadedDataComp
  • 计算进行时显示进度条

    我正在编写代码来计算 Pi 的值 有时可能需要很长时间才能计算 我添加了一个进度条来显示进度 但代码完全按照我的指示执行 它在计算后打开进度条 然后立即关闭它 当值达到 100 时它会关闭 我试图将进度条的代码粘贴到循环中 但很快我意识到这
  • HighcharteR:绘图带和绘图线不起作用

    我正在尝试在 highcharteR 中绘制每日值系列 在图表中标记垂直线 绘图线 和日期周期 绘图带 我研究了几个SO问题并达到了这个脚本 但我发现了以下问题 1 未绘制绘图区 2 未绘制情节 3 x轴应该是以我不理解的方式转换的日期 我
  • FormControl uniqueUntilChanged() 不起作用

    我很难做distinctUntilChanged在下一个场景中工作 我制作了一个异步验证器 它使用服务来检查给定用户名的用户是否存在 该验证器作为指令绑定到输入 class ValidateUniqueUsernameDirective i
  • 可以配置 Tmux 加载 ~/.bashrc 而不是 ~/.bash_profile 吗?

    现在 当我登录 Tmux 时 仅 bash profile被加载 我想要 bashrc改为被呼叫 那可能吗 这个问题与以下无关tmux 要解决它 请确保添加source bashrc to bash profile就是这样 您可以了解更多有
  • dynamoDB - 通过主键数组从数据库获取多个项目

    我有一个用户 id 数组 我想从 dynamoDB 表中获取具有该 id 的所有用户 文档里没找到 有任何想法吗 我最终使用了batchGet 这是一个操作AWS DynamoDB DocumentClient http docs aws
  • ORG指令后设置段寄存器

    我目前正在关注操作系统开发教程 http brokenthorn com Resources OSDev4 html 其中包括有关引导加载程序的讨论 我的引导加载程序当前处于 16 位实模式 因此 我能够使用提供的 BIOS 中断 例如 V
  • 为什么不能在 do while 循环的表达式部分内声明变量?

    以下语法有效 while int i get data 但以下情况则不然 do while int i get data 我们可以通过标准草案了解原因N4140部分6 4 1 condition expression attribute s