1
62
你犯了一个错误
这个
结果
属于
由于代码违反了“在上一个序列点和下一个序列点之间,标量对象的存储值应通过表达式的计算最多修改一次”的规则,因此行为是未定义的。
实际
不过,很可能
|
2
37
这是未定义的行为,而不是(只是)未指定的行为,因为有两个写入
该标准允许编译器生成延迟回写到存储器的代码,或者从另一个角度,对实现副作用的指令重新排序,只要它符合序列点的要求就可以选择任何方式。
这个语句表达式的问题是它意味着两次写入
一次写入的值等于
|
3
15
C/C++定义了一个概念
sequence points
这是指执行中的一个点,在这个点上可以保证先前评估的所有效果都已经执行。说
|
4
10
C++ 11(09/30/2011)的更新停止 ,这是 定义良好的 在C++ 11中。它仅在C++ 03中是未定义的,但是C++ 11更灵活。
在那条线之后,
直接从马嘴里http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#637 |
5
9
有两个选择:定义的还是未定义的,您会做什么选择?标准的作者有两个选择:定义行为或将其指定为未定义。 考虑到最初编写此类代码显然是不明智的,为其指定结果毫无意义。人们会想阻止这样的代码,而不是鼓励它。它对任何事情都没有用处或必要。 此外,标准委员会没有任何方法强迫编译器编写人员做任何事情。如果他们需要一个特定的行为,这个要求可能会被忽略。 也有实际的原因,但我怀疑他们服从于上述的一般考虑。但是对于记录而言,这种表达式和相关类型所需的任何类型的行为都将限制编译器生成代码、分解公共子表达式、在寄存器和内存之间移动对象等的能力。C已经受到弱可见性限制的限制。像Fortran这样的语言早就意识到别名参数和全局参数是一个优化杀手,我相信它们只是禁止它们。 我知道你对一个特定的表达式很感兴趣,但是任何给定构造的确切性质都不重要。预测一个复杂的代码生成器将要做什么并不容易,在愚蠢的情况下,语言试图不需要这些预测。 |
6
8
本标准的重要部分是:
您可以修改值两次,一次使用+运算符,一次使用赋值 |
7
7
请注意,您的标准副本已过时,仅在示例的第1行和第3行中包含一个已知(且已修复)错误,请参见: C++ Standard Core Language Issue Table of Contents, Revision 67, #351 和 Andrew Koenig: Sequence point error: unspecified or undefined? 这个主题不容易仅仅阅读标准(这个标准非常模糊:(在本例中)。 例如,它是否定义良好(或未定义)、未指定或一般情况下,实际上不仅取决于语句结构,而且取决于执行时的内存内容(具体来说,变量值),另一个示例:
请看一看(全部清楚、准确): JTC1/SC22/WG14 N926 "Sequence Point Analysis" 此外,安吉丽卡·兰格也有一篇关于这个主题的文章(尽管不像前一篇那么清楚): "Sequence Points and Expression Evaluation in C++" 还有俄语的讨论(尽管评论和帖子本身有一些明显错误的陈述): |
8
4
以下代码演示了如何获得错误(意外)结果:
结果将打印1。 |
9
4
假设你问“为什么语言是这样设计的?”.
你说
|
10
3
类比论证:
如果你把操作符看作是函数的类型,那么它就有点意义了。如果有一个类
(第一个参数实际上是通过
对于纯函数调用,这显然是未定义的。第一个参数的值取决于第二个参数的计算时间。但是,对于基元类型,您可以忽略它,因为
简而言之:所有的操作符都像函数一样,因此应该按照相同的概念进行操作。如果
|
11
2
怎么样,我们都同意永远不要,永远不要,写这样的代码?如果编译器不知道您想做什么,您如何期望后面的糟糕的SAP理解您想要做什么?把我放在自己的线上 不 杀了你。 |
12
1
根本原因是编译器处理值读写的方式。编译器可以在内存中存储一个中间值,并且只在表达式的末尾提交该值。我们读了这个表达
在特定情况下
类似的情况是所谓的严格混叠规则。不能指定值(例如,
|
13
1
这里的问题是,标准允许编译器在执行语句时完全重新排序。但是,不允许对语句重新排序(只要任何这样的重新排序都会导致程序行为发生变化)。因此,表达式
或
或
当您在混合中抛出用户定义的类型时,情况会更糟,在这种情况下,++运算符可以对类型的作者想要的类型产生任何影响,在这种情况下,计算中使用的顺序非常重要。 |
14
1
以上所有表达式都调用未定义的行为。
这很好。 阅读Steve Summit的C-FAQ。 |
15
0
从
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |