首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这段代码定义清楚吗?

这段代码定义清楚吗?
EN

Stack Overflow用户
提问于 2011-01-16 19:17:37
回答 6查看 2K关注 0票数 27

这段代码摘自对这里的讨论。

代码语言:javascript
运行
AI代码解释
复制
someInstance.Fun(++k).Gun(10).Sun(k).Tun();

这段代码定义清楚吗?在Sun()中,++kk之前评估过吗?

如果k是用户定义的类型,而不是内置类型呢?上述函数调用order的方式与此不同:

代码语言:javascript
运行
AI代码解释
复制
eat(++k);drink(10);sleep(k);

据我所知,在这两种情况下,在每个函数调用之后都存在一个序列点。如果是这样的话,为什么第一种情况也不能像第二种一样被很好地定义呢?

C++ ISO标准的第1.9.17节提到了顺序点和功能评估:

当调用一个函数(不管函数是否内联)时,在计算所有函数参数(如果有的话)之后有一个序列点(如果有的话),它发生在函数体中的任何表达式或语句执行之前。在复制返回的值之后还有一个序列点,在函数之外的任何表达式执行之前有一个

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-17 05:16:35

这取决于如何定义Sun。以下是明确的定义:

代码语言:javascript
运行
AI代码解释
复制
struct A {
  A &Fun(int);
  A &Gun(int);
  A &Sun(int&);
  A &Tun();
};

void g() {
  A someInstance;
  int k = 0;
  someInstance.Fun(++k).Gun(10).Sun(k).Tun();
}

如果将Sun的参数类型更改为int,则会出现未定义的情况。让我们把画一棵树的版本取一个int

代码语言:javascript
运行
AI代码解释
复制
                     <eval body of Fun>
                             |
                             % // pre-call sequence point
                             | 
 { S(increment, k) }  <-  E(++x) 
                             |     
                      E(Fun(++k).Gun(10))
                             |
                      .------+-----.       .-- V(k)--%--<eval body of Sun>
                     /              \     /
                   E(Fun(++k).Gun(10).Sun(k))
                              |
                    .---------+---------. 
                   /                     \ 
                 E(Fun(++k).Gun(10).Sun(k).Tun())
                              |
                              % // full-expression sequence point

可以看到,我们读到了k (由V(k)指定)和一个对k的副作用(在最上面),它们不被序列点分隔:在这个表达式中,相对于其他子表达式,根本没有序列点。最底层的%表示完整的表达式序列点。

票数 12
EN

Stack Overflow用户

发布于 2011-01-16 19:51:19

我认为,如果你准确地读到了这句标准的话,第一种情况就不会得到很好的界定:

当调用一个函数时(不管函数是否内联),在计算所有函数参数(如果有的话)之后会出现一个序列点,它发生在函数体中的任何表达式或语句执行之前。

这告诉我们的不是“在对函数的参数进行了计算之后可以发生的唯一事情是实际的函数调用”,而仅仅是在参数计算结束后的某个点和函数调用之前有一个序列点。

但如果你想象这样的情况:

代码语言:javascript
运行
AI代码解释
复制
foo(X).bar(Y)

这给我们的唯一保证是:

  • 在调用X之前对foo进行评估,并且
  • 在调用Y之前对bar进行评估。

但是,这样的命令仍然是可能的:

  1. 评估X
  2. 评价Y
  3. (将Xfoo调用分离的序列点)
  4. 调用foo
  5. (将Ybar调用分离的序列点)
  6. 调用bar

当然,我们也可以交换前两项,在X之前评估X。为什么不行?标准只要求在函数体的第一条语句之前对函数的参数进行完全评估,而上面的序列满足这一要求。

至少这是我的解释。它似乎并没有说在参数评估和函数体之间没有其他的事情发生--只是这两者被一个序列点分开。

票数 22
EN

Stack Overflow用户

发布于 2011-01-16 19:27:45

这是未定义的行为,因为k的值在相同的表达式中被修改和读取,没有中间的序列点。请看对这个问题的极好的长篇回答。

1.9.17的引号告诉您,所有函数参数都是在调用函数体之前计算的,但是没有提到参数与同一表达式中不同函数调用的相对顺序--不能保证"++k Fun()在Sun()中的k之前计算“。

代码语言:javascript
运行
AI代码解释
复制
eat(++k);drink(10);sleep(k);

因为;是一个序列点,所以计算的顺序是明确的。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4709727

复制
相关文章
矩阵范数的等价性(原创)[通俗易懂]
设 F=R F = R \mathbb F=\mathbb R 或 C, C , \mathbb C, 对于任意两个 Fn×n F n × n \mathbb F^{n \times n} 上的范数 ∥⋅∥α ‖ ⋅ ‖ α \Vert \cdot\Vert_{\alpha} 与 ∥⋅∥β, ‖ ⋅ ‖ β , \Vert \cdot\Vert_{\beta}, 若存在常数 C1>0,C2>0, C 1 > 0 , C 2 > 0 , C_1 \gt 0, C_2 \gt 0, 使得 ∀X∈Fn×n, ∀ X ∈ F n × n , \forall \mathbf {X} \in \mathbb F^{n \times n},
全栈程序员站长
2022/09/29
1.3K0
Python中表达式与语句
Python中我暂时并未发现谁对着两个名词的明确定义;我对这两个名词的理解就是,表达式就是你想要执行的对象,语句就是你的具体执行操作。
py3study
2020/02/10
5720
门控时钟和逻辑等价性检查
每当问到“怎么降低动态功耗”,一般的答案就是插门控时钟。那为什么插门控时钟就能降低动态功耗呢?门控时钟一定能插得进去吗?对逻辑等价性检查(LEC)有什么影响?
ExASIC
2021/11/02
1.3K0
门控时钟和逻辑等价性检查
C++语言的表达式模板:表达式模板的入门性介绍
原标题:C++ Expression Templates: An Introduction to the Principles of Expression Templates 原作者:Klaus Kreft与Angelika Langer 原文链接: http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm 翻译:Magi Su 翻译已经过原作者许可,转载请先征求原作者的许可。图片均取自原文,如果有水印为CSDN所打和老子没关系。出于清晰起见,文章中所有模板中的class都被改为typename。 模板(template)最早是以将类型(type)参数化为目的引入C++语言的。(译注1)链表 (list)是一个典型的例子。实际编码的时候,人们并不希望为保存不同类型变量的链表 分别编码,而是希望在编写的时候能够使用一个占位符(placeholder)来代替具体的类型 (即是模板参数),而让编译器来生成不同的链表类(模板的实例化)。 时至今日,模板的使用已经远远超过C++模板的发明者所预期的范畴。模板的使用已经涵盖 了泛型编程,编译时求值,表达式模板库,模板元编程,产生式编程(generative programming)等诸多领域。在这篇文章中,我们仅限于探讨一些表达式模板的编程知识, 侧重于编写表达式模板程序库这个方面。 我们必须指出:表达式模板库是相当复杂的。出于这个原因,我们读到过的关于表达式模 板的介绍都不是很容易理解的。因此,本文的作者希望能够通过本文为表达式模板提供一 个通俗的介绍,同时又不失对具体实现细节的阐述,从而对读者阅读模板库的代码能够起 到帮助。作者希望提取出表达式模板编码的一些原则性知识。有关于此领域的更多细节可 以参考其他著作。
sofu456
2019/07/09
2.6K0
C++语言的表达式模板:表达式模板的入门性介绍
C.163: 重载只用于基本等价的操作
Having the same name for logically different functions is confusing and leads to errors when using generic programming.
面向对象思考
2020/03/25
2910
【C语言笔记】数组与指针不等价
数组遍历方式一:使用指针遍历数组元素,p++等价于(p++),即指针指向的地址每次后移一个单位,然后再取地址上的值。这里的一个单位是sizeof(int)个字节。
正念君
2019/06/26
8090
对for循环中表达式和循环体的执行顺序详解
由上面的执行结果不难看出for循环中除了表达式1为了初始化变量,其的循环是表达式2——循环体——表达式3——表达式2这样的循环。
PHP开发工程师
2021/06/02
1K0
【集合论】等价类 ( 等价类概念 | 等价类示例 | 等价类性质 | 商集 | 商集示例 )★
商集的本质 : 商集 本质是一个 集合 , 集合中的元素是 等价类 , 该等价类是基于
韩曙亮
2023/03/28
1.3K0
【集合论】等价类 ( 等价类概念 | 等价类示例 | 等价类性质 | 商集 | 商集示例 )★
Python中表达式int(&#39;0x10, 36)的值是。。。
在Python中,int()可用来把实数转换为整数,或者把数字字符串按指定进制转换为十进制数,详见文末的相关阅读。 然而,下面的代码又应该如何解释呢? >>> int('0x10', 36) 42804 按照传统意义的解释,0x开头表示十六进制,而试图把十六进制数看作36进制数并转换为十进制数,上面的代码应该出错,但是却又没有出错。把'0x10'当作36进制,那么x又表示什么呢?执行下面的代码试试: >>> import string >>> for ch in string.ascii_lowercase
Python小屋屋主
2018/04/16
1K0
C++ 自由存储区是否等价于堆?
“free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。 如果我接着问你自由存储区与堆有什么区别,你或许这样回答: “malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。” 这样听起来似乎也没错,但如果我接着问: 自由存储区与堆是两块不同的内存区域吗?它们有可能相同吗? 你可能就懵了。 事实上,我在网上
Tencent JCoder
2018/07/02
3.6K0
机器学习中的基本问题——log损失与交叉熵的等价性
log\left ( 1+exp\left ( -m \right ) \right )
felixzhao
2019/01/31
1.3K0
等价域名
如果一个服务有多个域名入口,通过这些入口访问得到的内容一样,那么称这些域名为等价域名。 比如,通过等价域名,可以提供 3 个一模一样的文件或者接口服务。
陈少文
2022/07/17
3150
等价域名
【集合论】等价关系 ( 等价关系概念 | 等价关系示例 | 等价关系与闭包 )
由上边可以看出 , 等价关系是用于分类的 , 同一年出生的人可以划分到一个等价类中 ;
韩曙亮
2023/03/28
1.2K0
机器学习中的基本问题——log损失与交叉熵的等价性
1、log损失 image.png 2、交叉熵 image.png
felixzhao
2018/03/20
1.2K0
机器学习中的基本问题——log损失与交叉熵的等价性
黑盒测试的等价类划分法_黑盒测试等价类输出
等价类划分是一种典型的黑盒测试方法,这一设计方法完全不用考虑程序的内部结构,也就是说其只根据需求规格说明书。
全栈程序员站长
2022/11/10
7370
黑盒测试的等价类划分法_黑盒测试等价类输出
java OJ题目判断输入结束(与C语言的EOF结束等价)
/* * java 作Oj题目是会有输入若干数据的情况,不好判断输入结束符, * 类似于C语言中的EOF符号 * 在这里提供了一种方法 * */
用户3030674
2018/09/14
2.5K0
企业面试题: javascript中表达式parseInt("9")+parseFloat('7')的结果是什么?
parseFloat() 所解析的字符串中第一个小数点是有效的,而parseInt() 遇到小数点会停止解析,因为小数点并不是有效的数字字符。
舒克
2019/08/09
8960
html中表单提交
表单提交代码 1、源代码分析 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body
bamboo
2019/01/29
1.7K0
html中表单提交
论强化学习和概率推断的等价性:一种全新概率模型
选自arXiv 作者:Sergey Levine 机器之心编译 参与:张倩、刘晓坤 虽然强化学习问题的一般形式可以有效地推理不确定性,但强化学习和概率推断的联系并不是很明显。在本文中,UC Berkeley EECS 助理教授 Sergey Levine 提出了一种新的概率模型和理论框架,证明了强化学习的一般形式即最大熵强化学习与概率推断的等价性。在原则上,将问题形式化为概率推断,可以应用多种近似推断工具,将模型以灵活、强大的方式进行扩展。 概率图模型(PGM)为机器学习研究者提供了一种广泛适用的工具(K
机器之心
2018/06/08
7840
C++的lambda表达式
从C++11开始,C++也支持使用lambda表达式(匿名函数)。Lambda表达式是一种便捷的方式,可以定义一个函数对象,而无需使用显式的函数对象类型或函数指针语法。
叶茂林
2023/07/30
1950

相似问题

布尔表达式的等价性

23

正则表达式等价性

40

C中wstring的等价性

22

C std的等价性::查找

12

比较rpn (后缀)表达式的等价性

214
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档