相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

'i' 上的操作可能未定义

我有这个代码来获取表单的字符串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,如果是的话?如果没有,如何摆脱警告?

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

c undefined-behavior sequence-points

4
推荐指数
1
解决办法
3336
查看次数

关于自增/自减运算符

这是代码片段

#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++

c++

1
推荐指数
1
解决办法
138
查看次数

标签 统计

c++ ×2

sequence-points ×2

undefined-behavior ×2

c ×1

c++-faq ×1