2015-08-16 93 views
0

请不要粗略地判断我,我只是用C++编写的新代码 但是我的问题是下一个:为什么我们不能声明一个具有参数大小的数组,其参数是我们进入自己吗?例如:C++中数组的参数大小

int mas[i*]; 
cin>>i*; 

+0

您是否打算按该顺序键入这些说明*? –

+0

不,我不打算按顺序输入这些说明! – Dmitrii

+0

但是我认为拥有一个编译器可以告诉计算机我将是一个非常棒的参数,它是我们自己进入的数组大小的实际含义的一个形式参数! – Dmitrii

回答

0

在C++中,数组是一个对象,其类型为数组类型,所有变量和所有表达式的类型都是(静态)程序的一部分,并且在编译时必须知道。换句话说,编译时必须知道mas的类型。

可以创建一个对象,其类型是在编译时未知的是与阵列-new表达式,new T[n],但唯一的方式,即使在这种情况下,不存在该类型的值:你的唯一值可以从该表达式恢复的是类型为T *的值,其中包含数组对象的第一个元素子对象的地址。

0

因为当你创建一个数组时,程序需要为它的元素分配足够的内存。在你的例子中,数组元素的数量在声明数组的时候仍然是未知的。

+0

是的,但为什么人们不能改进编译器以便在输入形式参数i *的实际含义后保留内存呢?在我们的例子中,它只需要将i *的实际含义乘以4即可,因为数组的类型是int。 – Dmitrii

+0

@Dmitrii因为C++不能这样工作。做你想做的事情需要额外的基础设施,语言从来没有设计过。当然,人们可以尝试添加这样的事情。但是由此产生的语言在那时不再是标准的C++。 (当然,这个提议的特性的好处是否值得实现也是值得的。) – TheUndeadFish

+0

在这种情况下,编译器必须为从0到EOF-1的元素分配内存。 – Dmitrii

2

你可以这样做:

int i; 
if (!(std::cin >> i)) 
    throw std::runtime_error("input failed"); 

std::vector<int> mas(i); 

请注意:vector是用C写一个运行时大小的数组++的方式。 C风格的阵列大多存在历史兼容性,应该避免。