相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

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

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

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

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

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

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

序列点歧义,未定义的行为?

今天我遇到了一些代码,这些代码在clang ++(3.7-git),g ++(4.9.2)和Visual Studio 2013上表现出不同的行为.经过一些减少,我想出了这个代码片段,突出了这个问题:

#include <iostream>
using namespace std;

int len_ = -1;

char *buffer(int size_)
{
    cout << "len_: " << len_ << endl;
    return new char[size_];
}

int main(int argc, char *argv[])
{
    int len = 10;
    buffer(len+1)[len_ = len] = '\0';
    cout << "len_: " << len_ << endl;
}
Run Code Online (Sandbox Code Playgroud)

g ++(4.9.2)给出了这个输出:

len_: -1
len_: 10
Run Code Online (Sandbox Code Playgroud)

因此g ++将参数计算为缓冲区,然后缓冲区(..)本身,然后评估数组运算符的索引参数.直观地说,这对我来说很有意义.

clang(3.7-git)和Visual Studio 2013都给出:

len_: 10
len_: 10
Run Code Online (Sandbox Code Playgroud)

我想clang和VS2013会在它降到缓冲区(..)之前评估所有可能的东西.这对我来说不太直观.

我想我的问题的要点是这是否是未定义行为的明显案例.

编辑:感谢您清除此问题,未指明的行为是我应该使用的术语.

c++ unspecified-behavior

20
推荐指数
2
解决办法
834
查看次数