sequence-points相关内容

return 语句后的序列点?

在我对问题的回答中 这里我解释了在与 return 语句在同一行的全局变量上使用后缀 ++ 时发生的情况. C11 的信息性附录 C 指出,在 return 之后有一个序列点,并参考规范性章节 6.8.6.4,其中没有关于序列点的文本. 我在 C 标准的哪里可以找到规范文本,说明在 return 语句之后有一个序列点? (我只在 7.1.4/3 找到了说明库函数的规范文本,作为一 ..
发布时间:2022-01-19 14:49:55 其他开发

c中的序列点

命令式编程中的序列点定义了计算机程序执行中的任何点,在该点上可以保证先前评估的所有副作用都已执行,并且后续评估的副作用尚未执行. 这是什么意思?谁能用简单的语言解释一下? 解决方案 当一个序列点出现时,基本上意味着你保证之前的所有操作都完成了. 在没有中间序列点的情况下更改变量两次是未定义行为的一个示例. 例如,i = i++; 是未定义的,因为 i 的两次更改之间没有序 ..
发布时间:2021-12-02 08:17:38 其他开发

C中的副作用是什么?

维基百科说: 在计算机科学中,如果操作、函数或表达式在其本地环境之外修改某些状态变量值,则称其具有副作用,也就是说具有除了向操作的调用者返回一个值(主要效果)之外,还有一个可观察的效果. 但是我们如何访问一个变量在其本地环境之外,有没有人能通俗地解释一下这种情况、副作用、主效应和序列点? 解决方案 一个函数是(应该)一个黑盒子,其中返回值,或者通过引用传递的变量的值,应该是唯一 ..
发布时间:2021-07-16 21:39:26 其他开发

“立即在库函数返回之前"序列点的结果是什么?

在最近的问题中,某些代码显示为具有未定义的行为: a [++ i] = foo(a [i-1],a [i]); 因为即使 foo()的实际 call 是一个序列点,所以赋值是未排序,因此您不知道该函数是在 ++ i 发生副作用之后还是在此之前被调用的. 对此有进一步的考虑,函数调用中的顺序点仅保证在输入函数后执行副作用来评估函数自变量,例如 int y = 1;int func1 ..
发布时间:2021-05-28 20:18:10 其他开发

什么是“序列点"?以及它们如何影响未定义的行为?

什么是“序列点"? 未定义行为与序列点之间是什么关系? 我经常使用诸如 a [++ i] = i; 之类的有趣而令人费解的表达式,以使自己感觉更好.为什么我应该停止使用它们? 如果您已阅读此书,请确保访问后续问题 未定义的行为和顺序点已重新加载. (注意:这是 Stack Overflow的C ++常见问题解答的条目.如果您要批评以这种形式提供FAQ的想法,然后在开始所有这些操 ..
发布时间:2021-04-19 18:36:04 C/C++开发

关于在循环缓冲区中进行简洁索引处理的建议

我已经实现了循环缓冲区,并且我希望有一种简洁的方法来更新缓冲区指针,同时适当地处理环绕. 假设数组的大小为10,我的第一个响应是这样的: size_t ptr = 0; // do some work... p = ++p % 10; 静态分析以及 gcc -Wall -Wextra 正确地拍了拍我的手腕,以防由于序列点冲突而导致未指定的行为.显而易见的解决方法是: p+ ..
发布时间:2020-07-06 23:32:19 其他开发

是否有“顺序点"?像"int a = 4,* ptr =& a;"这样的语句会出现问题或"x + = 4,y = x * 2;"?

我对整个序列点事物的理解是基本的.我所拥有的只是一个粗略的直观想法,即“一旦遇到序列点,我们就可以确保先前评估的所有副作用都是完整的".我还读到,在类似printf("%d",a++,++a,a++)的语句中,行为未定义,因为逗号不表示序列点,而分号则表示序列点.因此,我觉得这是一个非常严格和结论性的答案,而不是凭直觉进行猜测,将对我有很大帮助. 以下类型的语句也是安全的& ;;肯定在 ..
发布时间:2020-07-06 23:31:13 其他开发

关于序列点的说明

最近,对于一些疯狂但在语法上允许的代码语句(如i = ++i + 1和i=(i,i++,i)+1;),我已经看到很多关于输出的问题. 坦白地说,几乎没有人会在实际编程中编写任何这样的代码.坦率地说,我在专业经验中从未遇到过这样的代码.因此,我通常最终会在SO上跳过此类问题.但是最近被问到这样的Q的庞大数量使我思考是否通过跳过这样的Q来漏掉一些重要的理论.我发现这样的Q围绕Sequence poin ..
发布时间:2020-07-06 23:31:09 C/C++开发

这些分配之间是否有顺序点?

以下代码中的两个赋值之间是否有一个序列点: f(f(x=1,1),x=2); 解决方案 来自 功能指示符的求值顺序, 实际的参数和 实际参数未指定,但是有一个序列 在实际通话之前指向. 因此对于您的表达式,第一个参数(尤其是对f的调用)可能是 在第二个参数之前求值;例如: (x = 1, 1), f call, (x = 2), f call 或者 ..
发布时间:2020-07-06 23:30:49 其他开发

未定义的行为,或者:Swift是否具有序列点?

在C/C ++中,第二个语句 int i = 0; int j = i++ + i++ + ++i; 同时调用 未指定行为,因为操作数的评估顺序 未指定,并且 未定义的行为,因为相同对象i上的副作用相对于彼此没有顺序. 例如参见 为什么这些结构(使用++)具有不确定的行为? 未定义的行为和序列点 现在,鉴于Swift被设计为 safe 语言,那么什么是 这里对 ..
发布时间:2020-07-06 23:29:43 移动开发

C/C ++中的未定义行为:i ++ + ++ i与++ i + i ++

想象一下,我们有下面的代码: int i = 1; int j = i++ + ++i; 我知道这是一个未定义的行为,因为在分号(它是一个序列点)之前,i的值已多次更改.这意味着即使运算符plus的优先级是从左到右,编译器也可能有两种可能性: 案例1) 取i++的值--- i的值为1 取++i的值--- i的值为2 将运算符加,并将结果3分配给j,并产生i++的副作用(此 ..
发布时间:2020-07-06 23:29:41 C/C++开发

我应该使用哪些编译标志来避免运行时错误

此处当代码可以调用UB时,c0> comiplation标志将弹出警告.我在 之类的语句上尝试过 int x = 1; int y = x+ ++x; ,效果很好.到目前为止,我仅使用-ansi -pedantic -Wall来使用gcc或g++进行编译.您还有其他有用的标志来使代码更安全,更可靠吗? 解决方案 对alk进行总结时,请使用以下标志: -pedantic -Wa ..
发布时间:2020-07-06 23:29:30 C/C++开发