今天我遇到了一些代码,这些代码在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会在它降到缓冲区(..)之前评估所有可能的东西.这对我来说不太直观.
我想我的问题的要点是这是否是未定义行为的明显案例.
编辑:感谢您清除此问题,未指明的行为是我应该使用的术语.