问题标签 [sequence-points]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - (++i)++ 是未定义的行为吗?
是(++i)++
未定义的行为吗?在检索增量对象以进行后缀增量操作后,前缀增量的副作用是否可能发生?这对我来说似乎很奇怪。
我的直觉说这在 C++03 中是未定义的,在 C++11 中是明确定义的。我对吗?
java - java中的序列点
以下java代码的执行顺序是否有保证:
正如任何普通人所期望的那样,总是getA()
在之前执行?getB()
c++ - 赋值运算符不是序列点的任何充分理由?
operator =
不是序列点有什么好的理由吗?在 C 和 C++ 中。
我很难想出一个反例。
c++ - C++ 中的序列点和异常
throw()
编译器可以在 C++ 中重新排序变量设置和操作吗?或者,标准 C++ 14882-1998 是否允许或禁止此转换的编译器?
对于代码:
输出可以是
标准说:“[intro.execution]#7”:
修改一个对象..都是副作用,是执行环境状态的变化
在被称为序列点的执行序列中的某些指定点,之前评估的所有副作用都应该是完整的,并且后续评估的副作用应该没有发生
throw
语句是序列点吗?
c++ - C/C++ 编译器可以在 pthread 库调用中合法地将变量缓存在寄存器中吗?
假设我们有以下代码:
符合标准的 C/C++ 编译器是否可以do_shutdown
在调用时将 的值缓存在寄存器中pthread_cond_wait()
?如果不是,哪些标准/条款可以保证这一点?
编译器可以假设知道pthread_cond_wait()
不修改do_shutdown
. 这似乎不太可能,但我知道没有标准可以阻止它。
实际上,是否有任何 C/C++ 编译器do_shutdown
在调用 ? 时将 的值缓存在寄存器中pthread_cond_wait()
?
编译器保证哪些函数调用不会缓存cross的值do_shutdown
?很明显,如果函数是在外部声明的并且编译器无法访问它的定义,它就不能对其行为做出任何假设,因此它无法证明它没有访问do_shutdown
. 如果编译器可以内联函数并证明它不能访问,那么即使在多线程设置中do_shutdown
它也可以缓存吗?do_shutdown
同一个编译单元中的非内联函数怎么样?
c++ - 重新加载未定义的行为和序列点
将此主题视为以下主题的续集:
上一部分
未定义的行为和序列点
让我们重温一下这个有趣而复杂的表达方式(斜体词组取自上述主题 *smile* ):
我们说这调用了未定义的行为。我假设当这样说时,我们隐含地假设type ofi
是内置类型之一。
如果类型是i
用户定义的类型怎么办?说它的类型是Index
本文后面定义的类型(见下文)。它还会调用未定义的行为吗?
如果是,为什么?它不等同于写作i.operator+=(i.operator++());
甚至语法上更简单 i.add(i.inc());
吗?或者,他们是否也调用了未定义的行为?
如果没有,为什么不呢?毕竟,对象在连续序列点之间i
被修改了两次。请回忆一下经验法则:一个表达式只能在连续的“序列点”之间修改一个对象的值。如果 i += ++i
是一个表达式,那么它必须调用 undefined-behavior。如果是这样,那么它的等价物i.operator+=(i.operator++());
也 i.add(i.inc());
必须调用 undefined-behavior似乎是不真实的!(据我了解)
或者,i += ++i
不是一个表达式开始吗?如果是这样,那么它是什么,表达的定义是什么?
如果它是一个表达式,同时它的行为也是明确定义的,那么它意味着与表达式关联的序列点的数量在某种程度上取决于表达式中涉及的操作数的类型。我是否正确(甚至部分正确)?
顺便问一下,这个表情怎么样?
您也必须在回复中考虑到这一点(如果您确定知道它的行为)。:-)
是
在 C++03 中定义良好?毕竟是这个,
side-effects - 从左到右评估顺序的语言中的序列点?
当评估顺序指定为“从左到右”并且语言是(伪)类 C时,以下示例中的序列点是什么?
c++ - 这段代码定义明确吗?
此代码取自此处正在进行的讨论。
这段代码定义明确吗?之前在 Sun( ) 中++k
评估过 Fun( )吗?k
如果k
是用户定义类型而不是内置类型怎么办?以及上述函数调用 order 的方式与此不同:
据我所知,在这两种情况下,每个函数调用之后都存在一个序列点。如果是这样,那么为什么第一种情况不能像第二种情况一样定义明确?
C++ ISO 标准的第 1.9.17 节对序列点和函数求值进行了说明:
调用函数时(无论该函数是否内联), 在对所有函数参数(如果有的话) 求值之后都会有一个序列点,该序列点发生在函数体中的任何表达式或语句执行之前。在复制返回值之后和执行函数外的任何表达式之前还有一个 序列点。
c - 关于序列点的后增量
后自增运算符何时影响自增?我遇到了两种意见:
1)来自http://gd.tuwien.ac.at/languages/c/programming-bbrown/c_015.htm:
POST 表示在任何赋值操作之后执行操作。
2)更近一点,关于 SO(尽管是 C++)的答案说:
...延迟增量直到表达式结束(下一个序列点)。
后增量操作也是如此...
A)等到一个序列点到达或
B)发生赋值运算符或
C)发生在序列点之前的任何时间?
c++ - 序列点和方法链
以下表达式通常用于演示未定义的未指定行为:
如果f()
和g()
两者都对某些共享对象有副作用,则行为未定义未指定,因为执行顺序未知。f()
可以在之前进行评估,g()
反之亦然。
现在我想知道当你在一个对象上链接成员函数时会发生什么。假设我有一个类的实例,该实例被调用obj
并且它有两个成员函数,foo()
它们bar()
都修改了对象。这些函数的执行顺序不可交换。在另一个之前调用它们的效果与反过来调用它们的效果不同。这两种方法都返回一个引用,*this
以便可以像这样链接它们:
但这是未指明的行为吗?我在标准中找不到任何东西(诚然只是浏览)可以区分这个表达式和我在帖子顶部给出的表达式。两个函数调用都是完整表达式的子表达式,因此它们的执行顺序是未指定的。但肯定foo()
必须首先评估,以便bar()
知道要修改哪个对象。
也许我遗漏了一些明显的东西,但我看不到序列点的创建位置。