问题标签 [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.

0 投票
1 回答
1915 浏览

c - C中的打印顺序

它打印输出为

为什么第一个 printf 中的顺序是相反的,为什么不是第二个 printf 语句? 我在一本书中发现C使用反向打印顺序。

0 投票
0 回答
257 浏览

glsl - GLSL 中的表达测序:后增量会发生什么

在 C/C++ 中有明确的规则定义“序列点”/“序列之前”关系,例如以下表达式

调用未定义的行为。

现在,我想知道在 GLSL 中管理此类表达式的规则是什么。我在 OpenGL 着色语言 (4.40) 规范中找不到任何定义类似于序列点/在关系之前排序的概念的东西。

在“5.9 表达式”部分它只说

预增量和预减量将它们操作的表达式的内容加或减 1 或 1.0,并且预增量或预减量表达式的值是该修改的结果值。后自增和后自减表达式对其操作的表达式的内容加或减 1 或 1.0,但结果表达式具有执行后自增或后自减之前的表达式值。

但是没有提到后增量何时应该与其他子表达式相关。

1/ 是否有关于如何在 GLSL 中定义表达式排序的规范或协议?

2/ 是i-- * ++i有效/定义明确的 GLSL 表达式吗?如果是,那么一开始我们有它的价值是i=1多少?

0 投票
3 回答
192 浏览

c - 交换两个变量的值而不使用C中的第三个变量?

我找到了以下代码片段:

它实际上交换了变量

谁能解释一下代码如何交换变量?

我认为括号会先执行,然后表达式导致

0 投票
1 回答
376 浏览

c++ - C 和 C++ 与序列点和 UB 的区别

我使用这篇文章Undefined Behavior and Sequence Points来记录C程序中的未定义行为(UB),它指向我。那么在序列点和相关的UB方面, CC++之间有什么区别?我不能用一篇关于C++序列的帖子来分析C代码中发生的事情吗?C and C++ have their own divergent rules for this [sequence points]

* 当然我不是在谈论C++不适用于C.

0 投票
3 回答
110 浏览

c - Microsoft C 与标准的偏差

以下异常的任何原因?

考虑以下 C 程序(名为 PstFixInc.c)

如果编译为gcc 4.8.1

gcc -o PstFix.exe PstFixInc.c

然后执行,得到结果:

数量:0

如果使用 Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86 编译

cl PstFixInc.c

然后执行,得到结果:

数量:1

0 投票
2 回答
1114 浏览

c++ - C++ cout side-effect sequencing

Suppose following piece of code:

execution of lines marked as 1 and 2, being compiled with ideone does the same, it prints following:

From my point of view, what we observe here is unspecified behaviour, as order in which function arguments are resolved is unspecified.

This was a question at an interview, printing above given sequence (without any alternatives) was supposed to be correct answer, but is it really correct?

0 投票
2 回答
87 浏览

c - 无限循环的原因

我读了这个。明确指出,while 语句和语句的结尾(;)是序列点。

所以我不明白为什么上面的运行无限时间并打印相同的值[5]。

0 投票
2 回答
1583 浏览

c - c - 为什么 i = ++i 调用未定义的行为?

我了解 C 使用序列点的概念来识别模棱两可的计算,并且该=运算符不是序列点。但是,我在执行该语句时看不到任何歧义

i = ++i

根据我的理解,这仅相当于评估 at 的任何内容&i,将其递增并将其存储回同一位置。然而,GCC 将其标记为:

[警告] 'i' 上的操作可能未定义 [-Wsequence-point]

我是否遗漏了一些有关=功能的信息?

编辑:在标记为重复之前,请注意我已经浏览过其他关于序列点和未定义行为的帖子。它们都没有专门解决表达式i=++i(注意增量)。提到的表达式通常是i=i++,a=b++ + ++b等。我对其中任何一个都没有疑问。

0 投票
1 回答
495 浏览

c++ - C++11 中的安全短路评估

在 C++11 之前,我们知道运算符需要短路和求值顺序,&&因为:

1.9.18

在以下表达式的评估中

使用这些表达式中运算符的内置含义,在对第一个表达式(12) 求值之后有一个序列点。

但是 C++11 中不再存在序列点,那么标准部分在哪里说:

是安全的?

0 投票
2 回答
3653 浏览

c - 对“i”的操作可能未定义

我有这个代码来获取表单的字符串bla_2并将其分隔:

我有:

但我只是i通过++操作员进行更改,我没有分配任何东西。

那么,为什么是UB,如果是的话?如果没有,如何摆脱警告?

请注意,在我看来,这个问题处理了一个不同的问题。