逻辑 AND、OR:是否保证从左到右求值? [复制]

2023-12-07

是从左到右计算逻辑运算符 (&& ||)有保证吗?

假设我有这个:

SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}

这保证和这个一样吗?

SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}

这也可能非常重要,假设我们有两个要求,a and b。要求a那么失败的可能性就大得多b。那么这样说就更有效率了if (a && b) than if (b && a).


是的,这是有保证的,否则这样的运算符将失去很多用处。

重要的提醒: 这是有效的only对于内置的&& and ||;如果某些犯罪分子重载它们,它们将被视为“常规”重载二元运算符,因此在这种情况下both操作数是always评估,并像往常一样按未指定的顺序进行。因此,永远不要让它们过载——它破坏了关于程序控制流的一个非常重要的假设。


相关标准报价

Builtin && and ||有保证的短路行为

§5.14 ¶1

Unlike &, &&保证从左到右求值:如果第一个操作数是,则不求值第二个操作数false.

§5.15 ¶1

Unlike |, ||保证从左到右的评估;此外,如果第一个操作数的计算结果为,则不会计算第二个操作数true.

如果重载,它们的行为就像“常规”二元运算符(没有短路或保证评估顺序)

§13.5 ¶9

第 13.5.3 至 13.5.7 款中未明确提及的运算符充当遵守 13.5.1 或 13.5.2 规则的普通一元和二元运算符。

and && and ||这些子条款中没有明确提及,因此常规 §13.5.2 成立:

§13.5.2 ¶1

二元运算符应由具有一个参数的非静态成员函数 (9.3) 或具有两个参数的非成员函数来实现。因此,对于任何二元运算符@, x@y可以解释为 作为任一x.operator@(y) or operator@(x,y).

没有专门规定仅评估一侧或按特定顺序评估。

(所有引用均来自 C++11 标准)

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

逻辑 AND、OR:是否保证从左到右求值? [复制] 的相关文章

随机推荐

  • 在请求中传递标头的效果?

    我想知道当你传递标题时会有什么不同requests get即之间的差异requests get url headers and requests get url 我有这两段代码 from lxml import html from lxml
  • 我的 Spring Security 应用程序不会超出登录页面

    我刚刚启动了一个使用 Spring Security 进行身份验证的项目 该项目使用 Java 配置而不是 XML 这是我的 SecurityConfig java 类 Configuration EnableWebSecurity pub
  • 将 .txt 文件中的双精度数读入双精度数组 C++

    我正在尝试创建一个需要大量股票价格的程序 我将这些价格存储在 txt 文件中 每行一个双精度 数量未知 可能有数千 我无法将数据放入我可以操作的数组中 我已经几个小时无法解决这个问题了 每当我尝试从文件中读取数据然后将其转换为双精度时 我都
  • 使用 babel ES6 创建注释

    我实际上正在使用 babeljs 和 ES6 带有 js 文件 开发一个应用程序 我想知道是否可以创建注释 就像我们可以使用 typescript 一样 使用 babeljs 和 ES6 JavaScript 没有与 TypeScript
  • 来自用户输入的Python调用函数[重复]

    这个问题在这里已经有答案了 可以根据用户输入调用函数吗 像这样的东西 def testfunction function function a raw input fill in function name testfunction a 因
  • 如何确认多个 AJAX 调用已完成?

    document ready function list1 jqGrid url example1 php balabala gridComplete function list2 jqGrid url example2 php balab
  • 如何在 JMeter 中将变量从一个线程组传递到另一个线程组

    我有一个包含 2 个线程组的 JMeter 测试 第一个是单个线程 创建一些库存 第二个有多个线程 购买所有库存 我使用 BeanShell Assertions 和 XPath Extractors 来解析返回值 XML 并存储变量 例如
  • 删除 datagridview 标题中的排序箭头并将文本放在框的中心

    我正在开发一个项目 需要标题文本位于中心 当单击标题时它将进行排序 但问题是 有一个排序箭头图标 即使它没有显示 它也会将文本推到左侧 我想要实现的是 删除排序箭头并将文本置于中心但仍保留排序功能 p s 我尝试处理单元格事件绘制并重新绘制
  • 替换字符串中特定索引处的字符?

    我正在尝试替换字符串中特定索引处的字符 我正在做的是 String myName domanokz myName charAt 4 x 这会产生错误 有什么方法可以做到这一点吗 Java 中的字符串是不可变的 你无法改变它们 您需要创建一个
  • Java枚举和迭代器的区别

    这两个接口的具体区别是什么 做Enumeration比使用有好处Iterator 如果有人能详细说明 参考文章将不胜感激 查看 Java API 规范Iterator界面上 有关于之间差异的解释Enumeration 迭代器不同于 枚举有两
  • python asyncio 无法同时运行两个无限函数

    我一直在尝试同时运行两个功能 但一个功能似乎永远无法工作 除非我停止另一个功能 第一个函数每 30 秒发送一封电子邮件 而第二个函数每 5 秒打印一条简单的语句 组合起来 每 6 个 Hello Worlds 输出应发送一封电子邮件 然而
  • 如何在 AChartEngine 中禁用显示缩放窗格

    任何人都可以帮助我了解 AChartEngine 在这里 我需要的第一件事是不要在图表中显示缩放图标 也不显示 x y 标签 但我找不到任何解决方案 您可以使用XYMultipleSeriesRenderer方法 启用或禁用缩放和平移 如下
  • 使用Python的词云库时,为什么停用词没有被排除在词云之外?

    我想排除 The they 和 My 在我的词云中显示 我正在使用 python 库 wordcloud 如下所示 并使用这 3 个附加停用词更新停用词列表 但 wordcloud 仍然包含它们 我需要更改什么才能排除这 3 个单词 我导入
  • Angular 2:将 *ngFor 加 2 或在 Pagination 中实现两个分页

    我对 Angular 还很陌生 我想知道是否有任何方法可以将 ngFor 循环增加 2 而不是 1 我正在尝试在一个分页中实现两个分页 为此需要将循环增加 2 我正在获取包含带有 in 的对象的对象 假设用户及其地址列表 第一个NgFor是
  • 如何在 ASP.NET MVC 模型中保存选定的 DropDownList 值以进行 POST?

    我的模型中有一个属性 如下所示 public IList
  • Shell 脚本中的字符小写到大写

    我的价值在于 詹姆斯 亚当 约翰我正在努力做到詹姆斯 亚当 约翰 每个名称的第一个字符应大写 根据 kev 下 echo 詹姆斯 亚当 约翰 sed s 我无法在不同的系统中执行相同的操作 我正在使用 ksh 但我不知道是否是因为 ksh
  • 如何从我的全局热键粘贴其他应用程序

    我编写了一个小型生产力工具 可以通过剪贴板进行一些字符串操作 它当前正在注册一个热键 在其中提取剪贴板文本 对其进行处理 然后将结果转储回剪贴板上 我已将其安装在 CMD SHIFT V 上 目前 您需要从另一个应用程序执行的操作是复制 C
  • 如何在 VisualForce 页面中实现“保存并新建”功能

    我知道这就是保存记录的方法
  • 识别常见模式[重复]

    这个问题在这里已经有答案了 是否有 简单 可能识别两个字符串共享的公共模式 这是一个小例子来阐明我的意思 我有两个包含字符串的变量 两者都包含相同的模式 ABC 以及一些 噪音 a lt xxxxxxxxxxxABCxxxxxxxxxxxx
  • 逻辑 AND、OR:是否保证从左到右求值? [复制]

    这个问题在这里已经有答案了 是从左到右计算逻辑运算符 有保证吗 假设我有这个 SDL Event event if SDL PollEvent event if event type SDL QUIT do stuff 这保证和这个一样吗