算术赋值运算符 - 左侧仅计算一次

2023-11-29

正如标题所说,我在一些C讲义中发现了这样一句话。

我无法发明任何例子来证明这句话。

在我看来,每个赋值操作都会被评估一次,因为当我们希望它被评估多次时,我们会放入一个循环中。那我还缺少什么呢?

我已经搜索过,但在这里找不到答案。


C says:

(C99, 6.5.16.2p3) “E1 op= E2 形式的复合赋值与简单赋值表达式 E1 = E1 op (E2) 的不同之处仅在于左值 E1 仅计算一次。”

以下是一些例子来说明为什么它很重要:

示例1:

 a[i++] += 1;

是相同的:

 a[i] = a[i] + 1; i++;

因为左操作数+=被评估一次。

如果不评估一次,则与以下内容相同:

a[i++] = a[i++] + 1;

这当然是不同的(顺便说一句,也是未定义的行为)。

示例2:

*foo() += 1;

假设foo这里返回一个指向标量类型对象的指针并产生副作用(例如,它在终端上打印一个字符串)。使用复合赋值运算符,它只会打印字符串一次,而不是两次。

Example 3:

REG |= 0x01;

假设REG这是一个 IO 寄存器(类似于#define REG (*(volatile uint8_t *) 0x42))并且每次读取该特定 IO 寄存器都会触发硬件事件。使用复合赋值运算符只能读取寄存器一次,而不是两次。

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

算术赋值运算符 - 左侧仅计算一次 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • Selenium 测试在本地工作但在 Jenkins 中失败

    在工作中 我们为我们的一个应用程序提供了一个自动化套件 该套件设置为在每次提交到 master 部署到产品时运行 并且很长一段时间以来 我们一直在尝试使其足够可靠 测试在 Jenkins 中运行 使用 Selenium webDriver
  • 如何在 Android Canvas 上制作路径动画

    是否可以将动画师附加到路径上 还有其他方法可以在画布上绘制动画线条吗 我在发布之前搜索过此内容 但找不到任何内容 在另外两篇文章中在 Android 的 Canvas 上绘制路径作为动画 and 如何在 Android Canvas 上用动
  • 使用JS或Jquery读取css比例值

    我有这个div div div 我如何获得 transform scale x y 使用 JS 或 jQuery 的元素 id css transform 给我矩阵 但我需要元素的实际比例值 或者 如果我无法直接获得比例 那么将矩阵 转换为
  • Fortran 中不区分大小写的字符串比较

    尽管 Fortran 不区分大小写 但我观察到使用以下命令比较字符串时情况并非如此if查看 当然 用户应该意识到这一点 然而 Fortran 不区分大小写 我潜意识里希望同样适用于字符串检查 实现不区分大小写的字符串比较的有效方法是什么 这
  • ld 在 OSX Leopard 上找不到 X11 库

    我有一个在 Linux 上运行的非常基本的 X11 应用程序 我试图在 OSX 10 5 8 下编译它 我已经安装了X11和X11 SDK 并修改了makefile如下 CFLAGS L usr X11 lib I usr X11 incl
  • 如何从DataFrame中获取Array[Seq[String]]?

    如何通过DataFrame cc into Array Seq String val factors ccCols split val cc dataset select factors head factors tail 我尝试过这种方式
  • 扩展 Typescript 中的内置类型

    我有以下结构 project types global d ts string d ts wdio d ts src Models Resources Components Extensions string ts tsconfig jso
  • 使用 CURRENT_TIMESTAMP 的 Rails 5.2 和 Active Record 迁移

    我有一些属性需要有默认值 我已经设置了迁移以在数据库中设置默认值 如下所示 class AddDefaultsToModel lt ActiveRecord Migration 5 2 def change change column po
  • 如何使用 Perl 动态获取 Web 内容?

    这有点棘手 我猜这个网页使用某种 AJAX 来根据搜索查询提取内容 当我在 Perl 中使用 get 获取页面时 它会获取 php html 后面的脚本代码 但不会获取手动搜索查询时显示的结果 我需要能够获取结果页面的内容 无论如何 在 P
  • iOS 中的视频编辑问题

    我目前正在开发一个 iOS 应用程序 它可以合并所需数量的视频 一旦用户点击按钮来合并视频 视频就会被合并 然后使用 AVPlayer 进行播放 如下所示 CMTime nextClipStartTime kCMTimeZero NSInt
  • fetchUuidWithSdp 始终给出缓存的 UUID

    我正在编写一个应用程序 其中我必须在选定的设备上进行服务发现 但每当我执行 fetchUuid 时 它总是为我提供远程设备上缓存的 UUID 这就是我正在尝试的 public boolean UUIDsearch BluetoothDevi
  • Google Cloud Storage Python list_blobs() 不打印对象列表

    我是 Python 和 Google Cloud Storage 新手 我正在编写一个 python 脚本 以使用 Google Cloud Python 客户端库从 Google Cloud Storage 存储桶获取文件列表 而 Buc
  • MvvmCross UITextField 自定义绑定

    所以我试图在 MvvmCross 中实现 UITextField 的自定义绑定 几乎遵循以下方式绑定软件键盘上的 GO 键 即尝试绑定一个文本字段 以便在点击键盘上的 完成 按钮时自动触发事件 因此绑定到ShouldReturn 我还需要绑
  • Neo4j“没有依赖项满足类型类 org.neo4j.kernel.api.index.SchemaIndexProvider”

    Neo4j 社区 2 3 3 Linux Ubuntu 14 04 尝试运行一个使用 Kafka 主题的 Java 应用程序 在查询 Neo4j 时处理其消息 并将它们写入另一个 Kafka 主题 hduser ubuntu java ja
  • GridView - 在空数据源上显示标题

    在 C 中 即使数据源为空 如何仍然显示 gridview 的标题 我不会自动生成列 因为它们都是预定义的 目前我正在做的事情如下 从存储过程中获取 DataTable 然后设置 gridview 的 DataSource 然后调用 Dat
  • 将 css、js 或其他内容从部分视图添加到视图头

    我发现了一些与此相关的问题 但通常有很多不同的答案 而且它们看起来都非常混乱和复杂 如果这就是需要做的 那么好吧 我最好坐下来解决它 我想知道最简单 最有效的方法是将内容从部分视图添加到您的头脑中 我需要这样做的原因是我需要在每个页面上使用
  • 当所有 Readline on('line') 回调完成时退出流程

    我有一个 Node v10 14 1 程序 它使用以下命令逐行读取 CSV 文件读取线接口 My on line is an async回调执行一些从数据库读 写的操作 因此我使用async await来处理承诺 该程序感兴趣的代码块的简短
  • 更新oracle中的json值

    我在表中有一个列以 json 格式存储数据 例如 柱子 select jsoncol from table 它给 y 4 n 0 default 4 当我尝试时 select json value jsoncol n from table
  • 记录集过滤器的问题

    我在旧版 ASP Classic 代码中的 ADO 记录集上使用筛选器时遇到问题 并且我试图了解我想要执行的操作是否不受支持 或者我是否只是做错了 我有一个项目记录集 它们的状态为 1 活动 或 0 非活动 以及一个可选的 End Date
  • 算术赋值运算符 - 左侧仅计算一次

    正如标题所说 我在一些C讲义中发现了这样一句话 我无法发明任何例子来证明这句话 在我看来 每个赋值操作都会被评估一次 因为当我们希望它被评估多次时 我们会放入一个循环中 那我还缺少什么呢 我已经搜索过 但在这里找不到答案 C says C9