【发布时间】:2015-06-13 08:20:25
【问题描述】:
今天我遇到了一些在 clang++ (3.7-git), g++ (4.9.2) 和 Visual Studio 2013。经过一些缩减 我想出了这个突出问题的 sn-p:
#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;
}
g++ (4.9.2) 给出这个输出:
len_: -1
len_: 10
所以 g++ 将参数计算为缓冲区,然后是 buffer(..) 本身,然后将索引参数计算为数组运算符。直觉上这对我来说很有意义。
clang (3.7-git) 和 Visual Studio 2013 都给出:
len_: 10
len_: 10
我想 clang 和 VS2013 在它下降到缓冲区(..)之前评估所有可能的东西。这对我来说不太直观。
我想我的问题的要点是这是否是未定义行为的明显案例。
编辑:感谢您澄清这一点,未指明的行为是我应该使用的术语。
【问题讨论】:
-
如果有人做了“buffer(len+1)[len_ = len] = '\0';”我会告诉他们改变它:)