C++中【数组的界】必须是编译时可以求出的【常量表达式】???

本人自学C++。

书上说:“数组的界,必须是在编译时就可求出的常量表达式,其值必须为正整数”

貌似书上的意思是:如果数组的界在编译时不确定,就必须用【动态数组】,也就是:

int *pointer = new int [variable] ();
pointer[0] = constant;

可是我用的Windows上的devcpp,和Mac上的Xcode开发环境都允许以下代码成功编译:

#include <iostream>
using namespace std;

int main() {
int n;
cin >> n;
int x[n];
for (int i = 0 ; i < n; i++) {
x[i] = i;
cout << x[i] << " ";
}

system("pause"); //mac上不用
return 0;
}

这是怎么回事?是编译器太高级了?

谢谢!

Mac上用的是Object c 。很像C#,有额外的内存优化机制,只用new不用delete的,,不行你用vc试试看,,
传统c/c++在编译函数体时,如果函数中遇到局部数组,编译器会会将ESP向下移动相应长度,这个长度如果编译器无法算出,将无法编译,
假设当前进入了某个函数体,这个函数体中有一个数组char[12];
esp会向下多移动12,,
如果12不能确定,将无法形成汇编代码追问

我是在Xcode上用的C++,没有用Objective-C也没有用AppleScript。。谢谢。。

追答

即使不是Object c,更具上述原理,一定是编译器有类似于object c的功能,要看过究竟,请在调试中切换到反汇编窗口,一看就什么都明白了,比如他怎么替换你的变量,怎么插入其他函数

追问

devcpp也有支持类似于Objective-C的功能?。。。我看不懂汇编语言。。。。。。

追答

那devcpp编译器文档上一定有说明的,这种货色都是这样,综合上搞不过vc编译器,就爱在写小问题上搞点突破传统的东西。上述代码中,栈指针下压空间一定是运行时计算的,那么他的效率一定敌不过传统的方法,但是硬件总是比软件升级快的,,这点性能损失在大多数情况下可以忽略

追问

相当于编译器自动把普通数组换成动态数组了对吧

追答

差球不多

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-21
千万不要依赖这些极个别编译器提供的特性。一定要记住C/C++标准。在这个问题上,数组的界,必须是在编译时就可求出的常量表达式,其值必须为正整数!
第2个回答  2011-03-19
在FOR循环里break

为什么有的C++编译器里数组的大小是变量时不会出错,有的会出错.
C++标准里明确规定:数组的初始化必须是常量、或者常量表达式。所以上面的代码只在一部分编译器里面能够编译通过,如:MinGW 微软的编译器是不能编译通过这个的,因为微软的编译器没有在标准的基础上进行扩展,但是MinGW编译器却扩展了数组中的初始化方式,所以如果楼主想要编译一个跨平台的程序,就不要使用...

关于C++语言中数组越界的问题
这种应该不算是异常,是程序的bug,用C++的异常处理也比较难捕捉,越界读写都可能导致错误的结果,甚至导致程序崩溃,要处理这种情况只能靠平时写代码时多积累,在有可能发生越界的地方做相应的判断处理。另外,可以用一些静态代码检查工具来帮助发现问题,但是并不能保证所有问题都能发现,关键还是要靠程序...

c++中怎样声明数组
printf("%lf", b[3]); \/\/ 输出数组b的第4个元素(数组下标从0开始)

为什么在c++中定义数组时数组的常量表达式不能包含变量?
你是指常量表示数组大小,还是初始值?但不管是什么,都原理一样,以数组大小为例,在C++中,有些变量是在编译期间,编译器就给分配空间的,有的是运行时候才分配空间,对于编译期间就分配空间的变量,编译器一定要知道它是多少长度的,才能分配适合那个长度的空间,静态数组,临时变量,全局变量之类都是...

在VC++中常量和变量有什么区别?
4、布尔常量boolean:true或false5、字符串常量:比较特殊的一种类型,它不是内置或基本的数据类型,实际上就是字符常量数组,它由字符串文字本身以及编译器加上的表示结束的空(NULL)字符组成。字符串常量“Ab”在内存中的实际格式是’A’’b’’\\0’如果程序中”two””Some”紧邻,C++编译器会把它们连在一起,并...

C++语言编程概念:常量、常量表达式和常量初始化
C++11引入的constexpr关键字,为编程者提供了编译时求值的可能。通过constexpr声明的变量和函数,可以在编译期间得到其值,为需要常量表达式的场景带来了便利。初始化的艺术 初始化非局部变量时,静态变量会优先进行常量初始化。例如,结构体中的静态常量c在main函数前就被赋值为5,而constexpr变量d则依赖于...

什么叫常量表达式
地址常量:虽然看起来像是可以改变,但C++中的地址通常在编译时就被确定,不随运行时变化。符号常量:预定义的标识符,如PI或MAX,它们代表预定义的固定值,不会在程序中改变。常量表达式的用途广泛,如在代码中作为数组大小、循环次数等,它们提供了一种确定性和稳定性,增强了代码的可读性和可靠性。

C++ 红线提示:表达式必须含有常量值
c++数组定义的基本要求,必须是常量 你可以用动态数组

...c++二维数组定义的问题,为啥程序说表达式必须含有常量值呀,明明是形...
因为在这个函数里,n是参数,作为变量处理了。你要把a改成动态分配,new或者malloc

常量表达式是什么?
在多种编程语言中,如C、C++、Java等,都有对常量表达式的支持。常量表达式的特点主要有以下几点:1. 固定值:常量表达式的值在编译时就已经确定,并且在程序运行过程中保持不变。这使得它们成为程序中稳定的参考点。2. 提高效率:由于常量的值不会改变,编译器可以对使用常量表达式的代码进行优化,从而...

相似回答