使用返回整数的函数和(可能)修改基本指针会导致返回数组的预期成员时出现不良行为。
这涉及相当古老的遗留代码;使用容器的现代选项将解决问题(无需告诉我!),但我想指出这一点,并询问在C ++ 17下行为是否是故意的,与C ++ 14及以下版本相反。 。
代码如下:
// dosomething() returns an integer.
// ArrayPointer is a class member
somememberfunction(args)
{
...
return ArrayPointer[dosomething()];
}
Run Code Online (Sandbox Code Playgroud)
问题来自于以下事实:dosomething()将更改ArrayPointer,并且使用ArrayPointer的旧值代替新值(在C ++ 17中,而不在C ++ 14中)。解决方法是定义一个中间变量:
const int index=dosomething();
return ArrayPointer[index];
Run Code Online (Sandbox Code Playgroud)
问题是:是否有解释(取决于标准),或者将其视为错误,而不是我认为仅是不良行为?
PS:根据要求完成(er C)代码,注意非必要部分,省略变量声明:
struct BKPRArray // struct for applying meteocorrection
{
double *findprarray(const char *bks)
{
// check earlier allocations (NR)
for (int n = 0; n < arrays; n++)
if (!_stricmp(this->bk[n], bks))
{
if (!PRarray[n]) PRarray[n] = (NUMTYPE*)calloc(FL_alloced, sizeof(NUMTYPE));
return PRarray[n];
}
// combined …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些Python listbrrehension像语法一样放入我的C++中.我正在使用Visual Studio 2013.
举个例子,假设我想模拟(python):for i in [1,5]: sum+=i
假设之前初始化的和为零.
到目前为止我能做的最好的是:
int a[]={1,5}, sum=0;
for each (int i in a) sum+=i;
Run Code Online (Sandbox Code Playgroud)
我会喜欢这样的东西:
for each (int i in {1,5}) sum+=i;
Run Code Online (Sandbox Code Playgroud)
但显然,这不会编译; 尝试在{1,5}处插入int或int []对我来说无济于事.
使用{1,5}来初始化矢量:std::vector<int>{1,5}有效,但有点刮风; 而且我不需要构造和销毁矢量的开销.
我错过了什么,或者这在C++ 11(以及可能是C++ 14)中是不可能的?