C++ C++;,以下代码的计算顺序

C++ C++;,以下代码的计算顺序,c++,arrays,C++,Arrays,在下面的代码中,我尝试构建2个数组。第一个是用户给定的数组,第二个是已排序的数组,尽管由于实际实现不是必需的,所以保持简短: int main() { int size = 0; cout << "Please enter size: "; cin >> size; int array[size]; int newArray[size] = doSomething(array,&size); return 0; }

在下面的代码中,我尝试构建2个数组。第一个是用户给定的数组,第二个是已排序的数组,尽管由于实际实现不是必需的,所以保持简短:

int main()
{
    int size = 0;
    cout << "Please enter size: ";
    cin >> size;
    int array[size];
    int newArray[size] = doSomething(array,&size);
    return 0;
}
int* doSomething(int array[],int *size)
{
    *size+=1;
    int newArray[size];
    //do something with the array and store it in the newArray
    return newArray;
}
intmain()
{
int size=0;
大小;
int数组[大小];
int newArray[size]=doSomething(数组和大小);
返回0;
}
int*doSomething(int数组[],int*size)
{
*大小+=1;
int newArray[size];
//对数组执行一些操作并将其存储在新数组中
返回新数组;
}
所以我的问题是:

我的老师告诉我,大多数编译器的工作方式不同,有些操作的顺序也可能不同

在int newArray[size]=doSomething(array,&size)行;我希望在doSomething中更改size变量,然后再将其用于初始化newArray。一旦doSomething方法完成运行,它应该返回一个数组(我假设它只是返回数组的第一个元素的地址,如果这是错误的,请纠正我)。一旦它返回,我想将该地址存储到我的新数组中,其中变量size用于初始化数组的大小。此变量应符合我的逻辑,等于用户输入的原始大小+1。因此,如果用户输入的大小为4,则newArray的大小应为5。这是一种很好的方法,还是会为不同的编译器产生不可靠的结果

在本练习中,我只能使用内置数组和指针。所以我不能使用向量。此外,在本例中,newArray大一个元素,但实际代码的大小是动态的,因此每次都可能不同。因此,我无法在声明中硬编码+1

如果这是错误的,是否有人可以为我指出正确的方向,并帮助我找到一种方法,在这种方法中,我可以传递一个内置数组(没有向量或数组),修改它的内容和大小,然后返回该数组并将其存储在调用者方法中的变量中


非常感谢

< P>第一,标准C++不允许所谓的可变长度数组(VLAS);声明中数组的大小必须是编译时常量。标准C允许它们,gcc和clang都将它们作为扩展实现。从技术上讲,您的代码是不正确的C++。 为了争论,让我们接受这个扩展。现在我们有另一个问题,那就是数组不能用作数组的初始值设定项。(数组可用于初始化指针,因为数组将在该上下文中衰减为指针,但指针根本没有大小。但是,如果您进行tgat,则会引入另一个问题:返回的数组具有自动存储持续时间,这意味着它将立即被销毁和释放。因此,它是一个“悬空指针”并使用它是未定义的行为。)通过将数组包装在
结构中,可以稍微笨拙地绕过该限制


所有这些都不涉及您所好奇的评估问题的顺序。答案是,顺序未明;编译器可能在为数组分配空间之前或之后计算函数调用。因此,即使编译器允许VLAs,这个大小也不明确。

< P>第一,标准C++不允许所谓的可变长度数组(VLAS);声明中数组的大小必须是编译时常量。标准C允许它们,gcc和clang都将它们作为扩展实现。从技术上讲,您的代码是不正确的C++。 为了争论,让我们接受这个扩展。现在我们有另一个问题,那就是数组不能用作数组的初始值设定项。(数组可用于初始化指针,因为数组将在该上下文中衰减为指针,但指针根本没有大小。但是,如果您进行tgat,则会引入另一个问题:返回的数组具有自动存储持续时间,这意味着它将立即被销毁和释放。因此,它是一个“悬空指针”并使用它是未定义的行为。)通过将数组包装在
结构中,可以稍微笨拙地绕过该限制


所有这些都不涉及您所好奇的评估问题的顺序。答案是,顺序未明;编译器可能在为数组分配空间之前或之后计算函数调用。因此,即使您的编译器允许VLA,此编译器的大小也未指定。

您在这里遇到了一个问题:

 cin >> size; 
 int array[size];
除非您使用
new
,否则您不能这样做。编译器在程序运行之前创建数组容器,因此在程序运行后不能为其指定自定义大小

必须将数组作为堆上的新对象分配:

cin >> size;
int* array = new int[size];
也许这将为您指明正确的方向,但我不知道您正试图调用什么类,因为您没有包含所有的源代码

我编辑了我之前的答案,因为我相信您只是试图调用一个int数组,而不是一个名为“array”的类。如果您只需要一个C样式的整数数组,上面的示例就是如何正确地实现它

记住,一旦你使用完你应该调用的数据

delete[] array;

您在这里遇到了一个问题:

 cin >> size; 
 int array[size];
除非您使用
new
,否则您不能这样做。编译器在程序运行之前创建数组容器,因此在程序运行后不能为其指定自定义大小

必须将数组作为堆上的新对象分配:

cin >> size;
int* array = new int[size];
也许这将为您指明正确的方向,但我不知道您正试图调用什么类,因为您没有包含所有的源代码

我编辑了我之前的答案,因为我相信您只是试图调用一个int数组,而不是一个名为“array”的类。如果您只需要一个C样式的整数数组,那么上面的e