什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我有这个代码来获取表单的字符串bla_2并将其分开:
void separate(char* str, char* word, int* n) {
int i = 0;
while(str[i] != '_') {
word[i] = str[i++];
}
*n = str[++i] - '0';
}
Run Code Online (Sandbox Code Playgroud)
我有:
warning: operation on ‘i’ may be undefined [-Wsequence-point]
Run Code Online (Sandbox Code Playgroud)
但我只是i通过++运营商改变,我没有分配任何东西。
那么,为什么是 UB,如果是的话?如果没有,如何摆脱警告?
请注意,在我看来,这个问题处理了一个不同的问题。
这是代码片段:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>
std::vector<int> vec(5);
int produce_seq()
{
static int value = 0;
return (value*value++);
}
int main()
{
std::generate_n(vec.begin(),5, produce_seq);
for(auto val:vec)
{
std::cout << val <<std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码会输出
0
2
6
12
20
Run Code Online (Sandbox Code Playgroud)
以外
0
1
4
9
16
Run Code Online (Sandbox Code Playgroud)
我认为value*value++;相当于value*value; value++;。
更新:
不应该value++在整个表达式已经求值之后再求值吗?例如,如果存在类似 的表达式sum=a+b++;,sum=a+b;则始终在 之前求值b++。