sequence-points相关内容
#include 诠释主要(无效){诠释 i = 0;i = i++ + ++i;printf("%d\n", i);//3我 = 1;我 = (i++);printf("%d\n", i);//2 应该是 1,不是吗?易失性int u = 0;u = u++ + ++u;printf("%d\n", u);//1你 = 1;u = (u++);printf("%d\n", u)
..
在我对问题的回答中 这里我解释了在与 return 语句在同一行的全局变量上使用后缀 ++ 时发生的情况. C11 的信息性附录 C 指出,在 return 之后有一个序列点,并参考规范性章节 6.8.6.4,其中没有关于序列点的文本. 我在 C 标准的哪里可以找到规范文本,说明在 return 语句之后有一个序列点? (我只在 7.1.4/3 找到了说明库函数的规范文本,作为一
..
命令式编程中的序列点定义了计算机程序执行中的任何点,在该点上可以保证先前评估的所有副作用都已执行,并且后续评估的副作用尚未执行. 这是什么意思?谁能用简单的语言解释一下? 解决方案 当一个序列点出现时,基本上意味着你保证之前的所有操作都完成了. 在没有中间序列点的情况下更改变量两次是未定义行为的一个示例. 例如,i = i++; 是未定义的,因为 i 的两次更改之间没有序
..
#include int main(void){int i = 0;i = i++ + ++i;printf("%d\n", i);//3我 = 1;i = (i++);printf("%d\n", i);//2 应该是 1,不是吗?易失性 int u = 0;u = u++ + ++u;printf("%d\n", u);//1u = 1;u = (u++);printf("%d\n", u);
..
维基百科说: 在计算机科学中,如果操作、函数或表达式在其本地环境之外修改某些状态变量值,则称其具有副作用,也就是说具有除了向操作的调用者返回一个值(主要效果)之外,还有一个可观察的效果. 但是我们如何访问一个变量在其本地环境之外,有没有人能通俗地解释一下这种情况、副作用、主效应和序列点? 解决方案 一个函数是(应该)一个黑盒子,其中返回值,或者通过引用传递的变量的值,应该是唯一
..
在最近的问题中,某些代码显示为具有未定义的行为: a [++ i] = foo(a [i-1],a [i]); 因为即使 foo()的实际 call 是一个序列点,所以赋值是未排序,因此您不知道该函数是在 ++ i 发生副作用之后还是在此之前被调用的. 对此有进一步的考虑,函数调用中的顺序点仅保证在输入函数后执行副作用来评估函数自变量,例如 int y = 1;int func1
..
什么是“序列点"? 未定义行为与序列点之间是什么关系? 我经常使用诸如 a [++ i] = i; 之类的有趣而令人费解的表达式,以使自己感觉更好.为什么我应该停止使用它们? 如果您已阅读此书,请确保访问后续问题 未定义的行为和顺序点已重新加载. (注意:这是 Stack Overflow的C ++常见问题解答的条目.如果您要批评以这种形式提供FAQ的想法,然后在开始所有这些操
..
main(){ int a = 5; int b = 6; printf("%d %d %d",a==b,a=b,a
..
我有这段代码可以采用bla_2形式的字符串并将其分开: void separate(char* str, char* word, int* n) { int i = 0; while(str[i] != '_') { word[i] = str[i++]; } *n = str[++i] - '0'; } 我得到了: warning:
..
我已经实现了循环缓冲区,并且我希望有一种简洁的方法来更新缓冲区指针,同时适当地处理环绕. 假设数组的大小为10,我的第一个响应是这样的: size_t ptr = 0; // do some work... p = ++p % 10; 静态分析以及 gcc -Wall -Wextra 正确地拍了拍我的手腕,以防由于序列点冲突而导致未指定的行为.显而易见的解决方法是: p+
..
我对整个序列点事物的理解是基本的.我所拥有的只是一个粗略的直观想法,即“一旦遇到序列点,我们就可以确保先前评估的所有副作用都是完整的".我还读到,在类似printf("%d",a++,++a,a++)的语句中,行为未定义,因为逗号不表示序列点,而分号则表示序列点.因此,我觉得这是一个非常严格和结论性的答案,而不是凭直觉进行猜测,将对我有很大帮助. 以下类型的语句也是安全的& ;;肯定在
..
最近,对于一些疯狂但在语法上允许的代码语句(如i = ++i + 1和i=(i,i++,i)+1;),我已经看到很多关于输出的问题. 坦白地说,几乎没有人会在实际编程中编写任何这样的代码.坦率地说,我在专业经验中从未遇到过这样的代码.因此,我通常最终会在SO上跳过此类问题.但是最近被问到这样的Q的庞大数量使我思考是否通过跳过这样的Q来漏掉一些重要的理论.我发现这样的Q围绕Sequence poin
..
可能重复: 未定义的行为和序列点 #include using namespace std; int main() { int x[3] = {}; int i=0; x[i] = i++; cout
..
我了解这是未定义的行为: int i = 0; int a[4]; a[i] = i++; //
..
以下代码中的两个赋值之间是否有一个序列点: f(f(x=1,1),x=2); 解决方案 来自 功能指示符的求值顺序, 实际的参数和 实际参数未指定,但是有一个序列 在实际通话之前指向. 因此对于您的表达式,第一个参数(尤其是对f的调用)可能是 在第二个参数之前求值;例如: (x = 1, 1), f call, (x = 2), f call 或者
..
在C/C ++中,第二个语句 int i = 0; int j = i++ + i++ + ++i; 同时调用 未指定行为,因为操作数的评估顺序 未指定,并且 未定义的行为,因为相同对象i上的副作用相对于彼此没有顺序. 例如参见 为什么这些结构(使用++)具有不确定的行为? 未定义的行为和序列点 现在,鉴于Swift被设计为 safe 语言,那么什么是 这里对
..
想象一下,我们有下面的代码: int i = 1; int j = i++ + ++i; 我知道这是一个未定义的行为,因为在分号(它是一个序列点)之前,i的值已多次更改.这意味着即使运算符plus的优先级是从左到右,编译器也可能有两种可能性: 案例1) 取i++的值--- i的值为1 取++i的值--- i的值为2 将运算符加,并将结果3分配给j,并产生i++的副作用(此
..
我很好奇,为什么链静态函数和成员函数之间的参数评估顺序有所不同.从此问题的答案中,我看到它是未指定的在这些链接函数调用之间,参数评估顺序是什么.以下面的代码段为例: #include class test { public: static test& chain_s(test& t, int i) { std::cout
..
此处当代码可以调用UB时,c0> comiplation标志将弹出警告.我在 之类的语句上尝试过 int x = 1; int y = x+ ++x; ,效果很好.到目前为止,我仅使用-ansi -pedantic -Wall来使用gcc或g++进行编译.您还有其他有用的标志来使代码更安全,更可靠吗? 解决方案 对alk进行总结时,请使用以下标志: -pedantic -Wa
..
我在此处读到有一个序列点: 与输入/输出转换格式说明符关联的动作之后.例如,在表达式printf("foo %n %d", &a, 42)中,在打印42之前在评估%n之后会有一个序列点. 但是,当我运行此代码时: int your_function(int a, int b) { return a - b; } int main(void) { int i =
..