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

这段代码定义清楚吗?
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

复制
相关文章
使用 Typescript 对多个版本号序列排序
例如现在存在一组版本号,[{version: "0.12.0.2"}, {version: "0.1.0.2"}],按 version 排序后的结果为 [{version: "0.1.0.2"}, {version: "0.12.0.2"}]。
Yorkyu
2022/03/22
9660
centos7开机界面出现多个选项
第一个选项正常启动,第二个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统)
全栈程序员站长
2022/06/29
1.6K0
centos7开机界面出现多个选项
springMvc 对多个视图后缀解析
springMvc 对多个视图后缀解析 如何配置? 代码如下:可以参考: <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="1"> <property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="org.sprin
爱明依
2019/03/12
1.2K0
centos7开机界面出现多个选项
第一个选项正常启动,第二个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统)
用户1685462
2021/07/23
8590
ios开发中使用Masonry对多个视图进行均匀布局
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/80595105
用户1451823
2018/09/13
1.8K0
ios开发中使用Masonry对多个视图进行均匀布局
mybatis 使用tips - 使用多个参数
执行如下命令: mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate 可以使用mybatis generator mybatis 使用多个参数 自定义方法需要根据多个查询条件去查询: SELECT * FROM `db_demo`.`hot_topic` WHERE lang='english' AND category='017' AND topic_type='video' ORDER BY score DESC; 推荐使用
千往
2018/01/24
1.7K0
使用VIM搜索多个文件[通俗易懂]
使用vim可以方便的搜索多个文件,这个时侯需要使用的命令是:vimgrep。vimgrep的命令格式是:
全栈程序员站长
2022/11/09
2.1K0
使用mysqldump备份多个库
一个数据库实例中有20+个库,本次备份需要备份其中的10+个库,使用mysqldump直接进行备份踩到一个warning和一个error。
阿dai学长
2020/05/27
4.1K0
批量对多个测序文件进行fastqc
现在一共是728*2=1456个测序文件,需要全部进行质控。 fastqc的命令很简单,直接跟文件即可,参数里面主要用-o(输出路径)和-t(线程,一般用2或4)
Y大宽
2019/05/29
3.9K0
python字典批量删除多个键值对(连续)
  搜不到字典批量删除多个键值对的方法,换了个搜索姿势,批量取N个元素,那么组合一下,就出来了!
逆向小白
2023/10/16
2130
python字典批量删除多个键值对(连续)
Arduino如何同时使用多个串口
如果想要给Arduino UNO R3同时接上WiFi模块和蓝牙模块时,但是Arduino的串口只有一个,怎样才能让Arduino同时使用多个串口呢?
小雨coding
2020/06/09
4.8K0
Arduino如何同时使用多个串口
Swift 使用lexicographicallyprecedes 多个参数排序
版权声明:转载请标明出处 https://blog.csdn.net/ZY_FlyWay/article/details/89184264
星宇大前端
2019/04/18
1.2K0
Swift  使用lexicographicallyprecedes 多个参数排序
多个php版本的composer使用
因为项目中使用swoole开发,一直使用win10 ubuntu子系统开发,随着代码量的增加,每次启动越来越慢。swoole官方提供了一个windows版swoole,启动速度特别快。但是由于其使用cgwin编译,所以无法正常使用composer,每次都需要切换php的环境变量。于是就想能不能让composer 识别我原来的php版本。打开composer的根文件试试真的可以。
高久峰
2023/06/29
6190
msyql多个or,and,
where (`to`= 2 and `from`= 8) or (`to`= 8 and `from`= 2) and from_unixtime(a.time,’%Y-%m-%d’) =’2017-05-31′ order by a.time desc
全栈程序员站长
2022/07/20
2990
使用shell并行执行多个脚本
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53906996
用户1148526
2019/05/25
3.4K0
VisualStudio 使用多个环境进行调试
在 VisualStudio 2017 支持使用 launchSettings.json 文件定义多个不同的环境进行调试
林德熙
2018/09/19
7340
VisualStudio 使用多个环境进行调试
使用python给outlook多个联系
如果报错:com_error: (-2147221008, '\xc9\xd0\xce\xb4\xb5\xf7\xd3\xc3 CoInitialize\xa1\xa3', None, None)
py3study
2020/01/08
7000
使用python合并多个pdf文件
今天需要整理一份资料,需要把多个pdf合并为一个,wps这些软件自然是有这个功能,但一般都是收费的,百度上也有很多网站,但资料上传到别人的网站,始终觉得还是不太可靠,故自己搜索了一下使用python来处理pdf文件,故此分享这个方法
用户9925864
2022/07/27
2.1K0
使用python合并多个pdf文件
多个FeignClient使用相同的name
FeignClient标签默认使用name属性作为bean name,name属性同时为服务名。 如果指定了contextId属性,则使用contextId作为bean name。 如此可为一个服务创建多个FeignClient: @FeignClient(name = "my-service-id", contextId = "my-service-id-api1") public interface Api1FeignClient { } @FeignClient(name = "my-service
路过君
2020/12/17
3.5K0
点击加载更多

相似问题

如何在phpMyAdmin中建立表之间的关系

10

如何在表Axapta之间建立关系

12

如何在MySQL表之间建立关系

116

在表之间建立关系

23

如何在ASP.Net MembershipServices用户和其他表之间建立关系?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文