未排序的值计算(也称为序列点)

2023-12-08

抱歉再次打开这个主题,但是思考这个主题本身已经开始给我一种未定义的行为。想要进入行为明确的区域。

Given

int i = 0;
int v[10];
i = ++i;     //Expr1
i = i++;     //Expr2
++ ++i;      //Expr3
i = v[i++];  //Expr4

我认为上述表达式(按顺序)为

operator=(i, operator++(i))    ; //Expr1 equivalent
operator=(i, operator++(i, 0)) ; //Expr2 equivalent
operator++(operator++(i))      ; //Expr3 equivalent
operator=(i, operator[](operator++(i, 0)); //Expr4 equivalent

现在来谈谈行为,这里有重要的引述C++ 0x.

$1.9/12-“表达式的求值 (或子表达式)一般情况 包括两个值计算 (包括确定身份 左值评估的对象和 获取先前分配给的值 右值评估的对象)和 副作用的开始。”

$1.9/15-“如果标量上有副作用 对象相对于而言是无序的 相同的另一个副作用 标量对象or一个值 使用的值进行计算 相同的标量对象,行为是 不明确的。”

[注:值计算和边 与不同相关的影响 参数表达式是无序的。 ——尾注]

$3.9/9-“算术类型(3.9.1), 枚举类型、指针类型、 指向成员类型的指针(3.9.2), std::nullptr_t 和 cv 限定 这些类型的版本(3.9.3)是 统称为标量类型。”

  • 在 Expr1 中,表达式的求值i(第一个参数)对于表达式的求值而言是无序的operator++(i)(这有副作用)。

    因此 Expr1 具有未定义的行为。

  • 在 Expr2 中,表达式的求值i(第一个参数)对于表达式的求值而言是无序的operator++(i, 0)(有副作用)'。

    因此 Expr2 具有未定义的行为。

  • 在 Expr3 中,对孤立参数的求值operator++(i)需要在外部之前完成operator++叫做。

    因此 Expr3 具有明确定义的行为。

  • 在 Expr4 中,表达式的求值i(第一个参数)对于评估而言是无序的operator[](operator++(i, 0)(这有副作用)。

    因此 Expr4 具有未定义的行为。

这种理解正确吗?


附: OP中的分析表达式的方法是不正确的。这是因为,正如 @Potatoswatter 所指出的,“第 13.6 条不适用。请参阅 13.6/1 中的免责声明,“这些候选函数参与 13.3.1.2 中描述的运算符重载解析过程,并且不用于其他目的。 “它们只是虚拟声明;对于内置运算符不存在函数调用语义。”


本机运算符表达式不等同于重载运算符表达式。在值与函数参数的绑定处有一个序列点,这使得operator++()版本定义明确。但对于本机类型的情况而言,这种情况不存在。

在所有四种情况下,i在完整表达式中改变两次。既然没有,, ||, or &&出现在表情里,那就是即时UB。

§5/4:

在上一个和下一个序列点之间,标量对象的存储值最多应通过表达式的求值修改一次。

编辑 C++0x(已更新)

§1.9/15:

运算符操作数的值计算在运算符结果的值计算之前排序。如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值的值计算是无序的,则该行为是未定义的。

但请注意,值计算和副作用是两个不同的东西。如果++i相当于i = i+1, then +是值计算和=是副作用。从 1.9/12 开始:

表达式(或子表达式)的求值通常包括值计算(包括确定用于左值求值的对象的身份以及获取先前分配给对象用于纯右值求值的值)和副作用的启动。

So although the value computations are more strongly sequenced in C++0x than C++03, the side effects are not. Two side effects in the same expression, unless otherwise sequenced, produce UB.

Value computations are ordered by their data dependencies anyway and, side effects absent, their order of evaluation is unobservable, so I'm not sure why C++0x goes to the trouble of saying anything, but that just means I need to read more of the papers by Boehm and friends wrote.

Edit #3:

感谢 Johannes 解决了我在 PDF 阅读器搜索栏中输入“sequenced”的懒惰问题。无论如何,我要去睡觉并起床进行最后两个编辑……对;v) 。

§5.17/1 定义赋值运算符说

在所有情况下,赋值都在右操作数和左操作数的值计算之后、赋值表达式的值计算之前排序。

关于预自增运算符的§5.3.2/1 还说

如果 x 不是 bool 类型,则表达式 ++x 等价于 x+=1 [注:参见…加法 (5.7) 和赋值运算符 (5.17)…]。

凭借这个身份,++ ++ x是简写(x +=1) +=1。那么,让我们解释一下。

  • 评估1在远处的 RHS 上并下降到括号中。
  • 评价内在1以及值(prvalue)和地址(glvalue)x.
  • Now we need the value of the += subexpression.
    • 我们已经完成了该子表达式的值计算。
    • 在赋值可用之前,必须对赋值副作用进行排序!
  • 将新值分配给x,与子表达式的左值和纯右值结果相同。
  • 我们现在已经走出困境了。整个表达式现在已简化为x +=1.

So, then

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

未排序的值计算(也称为序列点) 的相关文章

  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • R 包与 Rcpp 的链接错误:“未定义符号:LAPACKE_dgels”

    我正在创建一个 R 包 lapacker 以使用 R API 头文件 R ext Lapack h 为 R 提供和使用的内部 LAPACK 库 仅具有双精度和双复数 提供 C 接口 源代码 https github com ypan1988
  • 仅使用一个 #include 表达式一次包含多个头文件?

    是否有任何表达式可以使语法一次包含多个标头 而无需为每个新文件编写 include 表达式 例如 include
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 绑定集合的子集

    我有一个ObservableCollection
  • 来自同一基模板类的 C++ 重写函数,具有多重继承不明确的函数调用

    我需要打电话init int iNumber 从基类派生的函数 基类 h pragma once include stdafx h template
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 现代编译器的 C++ 中“memset”功能的状态

    Context 不久前 我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章 http www ddj com cpp 184403799 http www ddj com cpp 184403799 它是关于比较将
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐

  • 对于画布,.drawImage 函数抛出“TypeError:预期图像或画布”

    我正在尝试在我的不和谐机器人中添加排名卡 为了做到这一点 我正在尝试使用画布 但是当我使用画布时 一切正常 直到我点击 drawImage方法 它给我一个错误 提示 TypeError 需要图像或画布 虽然我已经要求了canvas在全球范围
  • Python if any() 不起作用

    我想检查列表中是否有任何字符串元素phrases包含一组中的某些关键字phd words 我想用any但它不起作用 In 19 import pandas as pd import psycopg2 as pg def test phd w
  • 由 pywin32 生成的 python 可执行文件中的 dll 加载错误

    我使用 py2exe 使用 64 位 python 解释器和 32 位 python 解释器创建了 python 可执行文件 在我的程序中 我使用该模块pywin32 com 因此我在创建可执行文件之前下载并安装了该程序的 64 位和 32
  • Android sqlite,限制数据库中的行数[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我一直有新数据进入应用程序 因此我想将表中的行数限制为 100 条记录 我将其描述为 FIFO 队列 每当有新数据 一次只有几行 进来时 表 底部 的旧数据就会被刷新并删除 由于它是
  • 用汇编语言定义“变量”

    我知道这是一个非常愚蠢的问题 但我有一段时间无法找到答案如何在 GAS AT T 汇编语言中正确声明和定义 变量 例如 我想要 5 个字节的缓冲区 两个 1 字节变量 最初值为 0 2 字节变量为 0 和 2 字节变量为 10 这段代码不能
  • 通过Java访问谷歌照片API

    我对 google API 很陌生 并且遇到了麻烦 我红色文档适用于 Java 的 Google 照片 API 然后我在 google API 控制台中创建了 OAuth 凭据并下载了它 credentials json 文件 之后我尝试访
  • 链接 .so 文件中的旧符号版本

    在 x86 64 linux 上使用 gcc 和 ld 我需要链接到较新版本的库 glibc 2 14 但可执行文件需要在旧版本 2 5 的系统上运行 由于唯一不兼容的符号是 memcpy 需要 memcpy GLIBC 2 2 5 但提供
  • Meteor 的 标签建议

    各位流星用户 在搜索教程和示例应用程序时 我发现了一个使用独特头部结构的教程和示例应用程序 这个特定的示例应用程序甚至没有标记任何地方 只是一个名为head html其中包含上述代码 我还了解到
  • C#同时更新两个文本框?

    假设我有两个文本框 一个包含二进制数据 另一个包含 ASCII 等效数据 如果用户更改其中任何一个 我如何同时更新另一个文本框 而无需按按钮 你必须防止无限循环 asciiTextBox变化binaryTextBox Text这改变了asc
  • 获取或插入 PostgreSQL

    我有一个对象表 其中包含多个属性的列和一个具有唯一 SERIAL 标识符的列 例如 CREATE TABLE person id SERIAL NOT NULL name VARCHAR 16 NOT NULL age INT NOT NU
  • 如何防止Android中移动网站的深度链接?

    我已经为我的所有活动添加了这样的深层链接
  • Android 字符串比较不起作用

    我很难使用 Java 比较 Android 中的两个字符串 我所做的是运行 HTTP get 请求 该请求返回 yes 或 no 并根据该请求决定是否启动新活动 我正在 Async onPostExecute 方法中执行字符串比较 尽管 H
  • 如何检查iframe是否加载失败? jquery?

    我现在有这个 jquery 代码并且工作正常 当用户单击提交按钮时 它会隐藏表单 显示加载器 然后将数据提交到链接并在 iframe 中加载输出 document ready function xxx form validate submi
  • 如何在html代码中使用json文件

    我有 json 文件mydata json 这个文件中是一些 json 编码的数据 我想在文件中获取这些数据index html并在 JavaScript 中处理这些数据 但不知道如何在 html 文件中连接 json 文件 请告诉我 这是
  • Android 自定义按钮状态选择器 XML 文件导致 Resource$NotFoundException

    由于 Resource NotFoundException 我的活动随机崩溃 并且总是由于我的自定义按钮的状态选择器文件之一而导致 而且崩溃是完全随机的 我将多次检查整个应用程序而不会发生崩溃 然后第 n 次转到 Activity 然后它会
  • 使用 jQuery 自定义下拉面板

    我正在尝试为以下问题找到 jQuery 解决方案 通用下拉控件 折叠时看起来像一个普通的选择框 下拉一个自定义面板 您可以在其中放置任何内容 I m not寻找菜单控件 或者可设置样式的选择或列表控件 我需要一个下拉面板可以容纳任何内容的控
  • Group by 模糊字符串与 fuzzywuzzy 和 groupby 匹配

    我有一个随机单词和名称的数据集 我正在尝试对所有相似的单词和名称进行分组 因此给出下面的数据框 Name ID Value 0 James 1 10 1 James 2 2 142 2 Bike 3 1 3 Bicycle 4 1197 4
  • Android中的调用方法

    我正在尝试调用我编写的方法 它编译除了一行 public class http extends Activity httpMethod will not compile public void httpMethod HttpClient h
  • 表中的 ZEND 表单元素还包含数据库中的数据

    你好 我有一个装饰器和表单的问题 它会在表中 并且在这个表中还希望有来自数据库的数据 我不知道如何做到这一点以获得如下所示的结构 可以说 table tr td and here input from zend form td td td
  • 未排序的值计算(也称为序列点)

    抱歉再次打开这个主题 但是思考这个主题本身已经开始给我一种未定义的行为 想要进入行为明确的区域 Given int i 0 int v 10 i i Expr1 i i Expr2 i Expr3 i v i Expr4 我认为上述表达式