while(i--) s+= a[i]; 是吗?包含 C 和 C++ 中未定义的行为?

2023-12-20

考虑简单的代码:

#include "stdio.h"

#define N 10U

int main() {
    int a[N] = {0};
    unsigned int i = N;
    int s = 0;

    // Fill a

    while(i--)
        s += a[i];

    printf("Sum is %d\n", s);

    return 0;
}

Does while由于整数下溢,循环包含未定义的行为?编译器是否有权假设while因此循环条件始终为真并以无限循环结束?

What if i is signed int?它不包含与数组访问相关的陷阱吗?

Update

我多次运行此代码和类似的代码,并且运行良好。此外,它是向后迭代数组和向量的流行方法。我问这个问题是为了确保从标准的角度来看这种方式是可以的。

乍一看,显然不是无限的。另一方面,有时编译器可以“优化”一些条件和代码,假设代码不包含未定义的行为。它可能会导致无限循环和其他不良后果。看this https://stackoverflow.com/questions/28631378/function-optimized-to-infinite-loop-at-gcc-o2.


此代码不会调用未定义的行为。循环将终止一次i变成0.

For unsigned int,没有整数上溢/下溢。效果将与以下相同i as signed除非在这种情况下不会有包装。

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

while(i--) s+= a[i]; 是吗?包含 C 和 C++ 中未定义的行为? 的相关文章

随机推荐

  • Rails 新建与创建

    为什么需要在 RESTful 控制器中定义一个新方法 并在其后面添加一个 create 方法 谷歌搜索没有为我提供我正在寻找的答案 我理解其中的区别 但需要知道为什么要这样使用它们 Rails 的 REST 实现new and create
  • 将多个域名映射到 Rails 应用程序中的不同资源

    我的 Rails 应用程序允许用户管理度假屋 每个属性都有自己的属性 我的应用程序中的 网站 主页 用户可以调整内容 效果很好 到目前为止很高兴 典型的 Rails 资源方法 因此特定属性的 URL 类似于特定属性的 主页 localhos
  • 具体来说,编译器会做什么来积极优化生成的字节码?

    我一直在阅读各种编译器的功能 并且遇到了许多编译器报告执行的术语 积极优化 例如 LLVM 引用了以下编译时优化功能 内存 指针特定 循环变换 数据流 算术 消除死代码 Inlining 这具体是什么意思呢 假设您有以下代码片段 如何优化生
  • Indexeddb:使用通配符搜索

    我想知道是否可以使用通配符对 indexeddb 对象存储执行搜索 例如 查找键以 555 开头的所有对象会很方便 使用复合键或键片段可以开箱即用地实现这一点 键在 IndexedDB 中的工作方式是生成一个 keyRange 对象并将其传
  • 当任何线程完成任务时终止多个线程

    我对 python 和线程都很陌生 我编写了 python 代码 它充当网络爬虫并在网站中搜索特定关键字 我的问题是 如何使用线程同时运行类的三个不同实例 当其中一个实例找到关键字时 所有三个实例都必须关闭并停止抓取网络 这是一些代码 cl
  • 为什么我的 Visual Studio Win32 项目需要安装 .NET 3.5 SP1?

    使用 Visual Studio 2008 我创建了一个 C Win32 http en wikipedia org wiki Windows API项目 为了发布该程序 我在同一解决方案中创建了一个 Visual Studio 安装项目
  • 删除 FASTA 文件中的换行符

    我有一个 fasta 文件 其中序列用换行符分隔 我想删除换行符 这是我的文件的示例 gt accession1 ATGGCCCATG GGATCCTAGC gt accession2 GATATCCATG AAACGGCTTA 我想把它转
  • PHP - 访客在线计数器

    我有以下代码来统计我的 PHP 网站上的访问者数量 它在使用 WampServer 的本地开发计算机上运行良好 但当我将文件上传到我的托管帐户进行测试时 我意识到它无法正常工作 我得到的数字非常高 并且还注意到会话永远不会被删除 因此它们只
  • Asp.net MVC Razor 页面上有多个表单

    Yo 我的网站上有一个注册页面 页面顶部是现有用户的登录表单 主区域有登记表 登录区域是部分视图 model ViewModels LoginViewModel注册区域也是部分的 model ViewModels RegViewModel
  • StreamProvider 与 RiverPod 无法正常工作(尝试从 Provider 迁移)

    我试图通过将简单的 FireStore auth Provider 示例迁移到 RiverPod 来了解 RiverPod 这是我的身份验证服务 import package firebase auth firebase auth dart
  • JSONP 长轮询始终加载

    我正在使用 JSONP 进行长轮询 而 Firefox 不断弹出 正在加载 微调器 使页面看起来像是尚未完成加载 有办法抑制这种情况吗 我被告知 Orbited 团队有一些技巧可以抑制这种情况 但浏览 Orbited js 代码我无法弄清楚
  • Pymongo 批量插入不起作用

    我正在按照教程进行操作http api mongodb org python current tutorial html http api mongodb org python current tutorial html用于批量插入 但是
  • 更改 ggplot 中的线宽,而不是大小

    我看到几篇关于改变线宽 https stackoverflow com questions 14794599 how to change line width in ggplot在 ggplot 中 这些答案虽然对OP来说内容丰富且有效 但
  • 使用引用字段值进行聚合中的 Mongodb 正则表达式

    注意 我使用的是 Mongodb 4 我必须使用聚合 因为这是更大聚合的一步 Problem 如何在集合文档中查找包含以同一文档中另一个字段的值开头的字段 让我们从这个集合开始 db regextest insert first Pizza
  • VBA Excel 中的弹出图表

    我想知道是否有一种方法可以根据特定工作表中找到的值 通过按按钮在 Excel 中创建弹出图表 最好的方法是能够在 VBA 中完成它 我一直在研究但找不到任何真正的解决方案 有什么建议么 你 你这个幸运儿 p 由于我有空 我为您创建了一个基本
  • 字符串文字:它们去了哪里?

    我对字符串文字的分配 存储位置感兴趣 我确实找到了一个有趣的答案here https stackoverflow com questions 51592 is there a need to destroy char string or c
  • 自托管 Azure DevOps Agents 卷映射

    在执行容器化任务时 在 K8s 中运行自托管 docker 构建代理时 出现以下错误 我已按照文档进行操作here https learn microsoft com en us azure devops pipelines agents
  • UILabel 优于 UIProgressView,具有多种颜色

    所以我还没有这样做 我正在尝试弄清楚如何做到这一点 所以我制作了一个 UITableView 每个单元格都有一个关联的 NSTimer 现在 在每个自定义 UITableViewCell 中 我都有一个 UIProgressView 作为背
  • 一旦这些容器执行的脚本调用 exit() ,如何退出“docker run”容器

    我有一个 docker compose 设置 分三步部署 构建所有容器并dc up d dc是一个别名docker compose 创建数据库 dc run web usr local bin python create db py 使用以
  • while(i--) s+= a[i]; 是吗?包含 C 和 C++ 中未定义的行为?

    考虑简单的代码 include stdio h define N 10U int main int a N 0 unsigned int i N int s 0 Fill a while i s a i printf Sum is d n