问题标签 [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++ - 为什么 gcc 不对内部代码中的未定义行为发出警告?
我刚刚阅读了关于未定义行为和序列点的 SO C++ FAQ 并进行了一些实验。在下面的代码gcc-4.5.2
中,仅在代码注释中提到的行中给了我一个警告,尽管前面的一行也显示了未定义的行为,不是吗?您不能说首先执行哪个加法操作数(因为+
没有序列点)。为什么 gcc 在这一行也没有给我警告?
谢谢你的帮忙。
c - C中的关联性和序列点
由于 '?' 的结合性 是从右到左,任意 2 个连续的“?” 运营商必须这样对待,对吧?
现在,
我希望这将被执行为:
现在由于它是从右到左执行的,当遇到第一个'?' 在语句中,x 的值为 0,表达式为
因此我希望 y 为 1,但它在我的 dev-cpp 上显示为零。我错在哪里?
c++ - 链式静态函数调用之间的参数评估顺序
我很好奇为什么链式静态函数和成员函数之间的参数评估顺序有所不同。从这个问题的答案中,我可以看到在这种链式函数调用之间的参数评估顺序是未指定的。以下面的代码片段为例:
在 GCC 4.6.2 和 CL 15.00.30729.01 (MSVC 9) 的情况下,结果输出适合我
但是,我想知道规范中是否有任何原因,或者是否知道为什么静态函数从左到右(使用它们的参数)进行评估,而对于非静态函数,所有参数首先(右-从我在其他测试中看到的向左)。
我问这个的原因是因为我在尝试在 C 中获得类似行为(使用结构和函数指针)并失败时首先注意到这种行为差异。我强烈怀疑这是在 GCC 和 MSVC 中针对成员函数实现的一些优化,但我希望这里有人能对此有所了解。
编辑:
我忘了提到一个让我觉得奇怪的关键信息:GCC 只会警告链式非静态函数的未指定行为,而不是静态函数:
GCC 没有义务提供这样的警告,所以它可能会错过第二个表达式,但这就是让我相信一些有趣的事情正在发生的原因。
c - 位域和序列点
对于打包f0
并f1
放入同一字节的实现,是否定义了以下程序?
如果有理由认为它在那里不同,我对 C99 和 C11 的答案很感兴趣。
在 C99 中,我发现的只是 6.5:2:
在前一个序列点和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。[...]
我不清楚这一段对上述程序有什么影响。
基于大量随机测试,大多数编译器似乎生成了两个分配不干扰的代码。
c++ - 是否存在代码在 c++11 中具有序列点但在 c++03 中没有的情况?
既然新的 c++11 标准已经对序列点的描述方式进行了更改,我正试图找出 c++03 和 c++11 之间到底发生了什么变化。
特别是,在任何情况下,看起来相同的代码在 c++11 中会有序列点,但在 c++03 中没有?
c++ - 初始化列表中的序列点警告
我有一个 Parent 类,它接受两个引用,这些引用可能实际上是对同一事物的引用,也可能不是。在这种情况下,当它们相同时,我会在 Child 类的初始化程序列表中收到序列点警告:
我猜这是因为在分配内存后不能保证该行上的取消引用。无论如何,我的问题是,在不更改父级或 A 的情况下,是否存在这种情况?
c - 这个操作有什么不合法的
即与此类似的代码,使打印输出未定义。
我不知道这个操作到底叫什么。
c++ - 可变参数扩展之间的排序
对于这个非可变示例:
没有指定是否先计算Func1()
or Func2()
,只是两者都必须在MyFunc()
调用之前完成。
这种排序如何与可变参数的扩展一起工作?
假设这f
是一个函数对象,它在第一次调用后改变了它的状态。将按f
顺序调用? a
换句话说,将f
在a
's 列表中的第一项上调用,然后是第二项,第三项等,而不是随机跳过扩展列表?每个项目之间是否有我们过去所说的序列点?
c# - 相同的代码,C# 和 C++ 中的不同输出
C#:
输出:27
C++:
输出:76
相同的代码有不同的输出,有人能说出为什么会这样吗?帮助赞赏!
c - C中的三元运算符和序列点
我有如下所示形式的表达式:-
现在三元运算符是 C 中的序列点,但我相信序列点在测试部分结束。
这种理解是否正确,因此这种说法会导致未定义的行为吗?