int main()
{
const int size = 10;        //const 量
int size2 = 10;

int iarray [size];          // ok,编译时能确定元素个数
int iarray2 [size2];        // error,编译时不能确定
iarray;
iarray2;

return 0;
}
请教:
    1. 请概括性地说明什么是编译时相关的(能确定的),譬如上述编译时就能确
       定表达式的值一样,    2. 请概括性地说明什么是编译时不相关的(不能确定的),而是直到运行时才
       能确定的,譬如上述编译时不能确定表达式的值一样,

解决方案 »

  1.   

    主要是因为定义数组的时候不能用变量
    除非你new出来
      

  2.   

    从来没有琢磨过这个问题
    只是知道int iarray2 [size2]; 这样写肯定编译通不过今天来听讲座
     
    up
      

  3.   

    谢谢cwanter,可否总结一下其它还有哪些情况
      

  4.   

    这是语言设计实现的问题,主要是编译时,决定数据的存储。c、c++就是这样设计的,对于所有的类型,必须先静态检查,指在编译时。也就是说c++是静态类型的语言。这是规定,没有什么道理。其他的一些面向对象的语言就有动态类型检查的,则不需要在编译时就确定所有类型的大小,比如smalltalk,不过,动态类型检查的语言,一般主要是解释执行的。有一本e书《程序设计语言及实现》(记不太清了),讲的比较好。我看楼主可以去看看,如果有了这样的疑问。
      

  5.   

    对于const int size = 10;是静态的常量,编译器是记录下size的值,下次遇到使用的地方直接用这个值来代替,这里是10,int iarray [size];就是int iarray [10]。编译器看到数组是10,就分配40个字节给数组。
    而int size2 = 10;是一个变量,编译器会给他分配一个四个字节的空间,值赋为10,下次使用时把这个空间里的值拿过来用,int iarray2 [size2];编译器不能确定数组的大小所以不能通过。
      

  6.   

    很艳羡CaptainIII(山上人)能有一套清晰的理论,我还想多听一些指教
      

  7.   

    我们不能在程序执行中定义新的数据结构、不能动态继承而产生一个新的对象、不能动态的加入一个类。一切数据结构(包括类),都必须在编程时定义好,这就是“静态类型检查”语言的限制,包括c++。在面向对象中,虚函数和多态很好,是吗,不过那只能是你已经定义好的灵活。我在看“设计模式”,其实,设计模式的思想,倒像一本书名一样,是一朵“看起来很美的花”。c#和com(组件对象模型)中,关于版本的设计,就是想提供一些动态数据建立的方法,不过,实现起来更麻烦好在m$不怕。
        强烈推荐microsoft的“三重思想”:
            重试--功能出错后
            重装--程序出错后
            重编--以上二重无法搞定时^_^
      

  8.   

    使用vector就没有这样的问题了
      

  9.   

    强烈推荐microsoft的“三重思想”:
            重试--功能出错后
            重装--程序出错后
            重编--以上二重无法搞定时///////////////////////////////////
    感谢 CaptainIII(山上人)所开的讲座学习up 
      

  10.   

    int iarray [size];          // ok,编译时能确定元素个数
    int iarray2 [size2];        // error,编译时不能确定
    1 可以通过,是因为size是常量,可以在编译直接作为数组的大小使用
    2 不可以编译通过,是因为size2是变量,编译时不能确定具体数据,只能在连接的时候确定。
      

  11.   

    强烈推荐microsoft的“三重思想”:
            重试--功能出错后
            重装--程序出错后
            重编--以上二重无法搞定时:)
      

  12.   

    DEV C++支持这个而且还可以这样做:
    int i;
    cin >> i;
    int array[i];
    cout << sizeof(array) << endl;
    不相, 你可以试试的. (用的是Dev - C++ 4.9.7.0) 
    :)
      

  13.   

    int iarray [size]; 是静态分配的内存,就是说在你的.exe载入时就分配好内存,内存的大小是在编译时确定的,所以分配的空间是一定的,所以C++的语法规则要求size的值必须为常量
      

  14.   

    如果使用c++来写程序,总是应该用vector deque这些容器来替代传统的c数组,这才是问题的解决之道。
      

  15.   

    to tony1978,使用vector或许会损失少许效率,但是,vector带来的好处要远远大于他在效率上的那一点点损失。因为,首先,一个系统应该是正确的,稳定的,然后才是效率:)
      

  16.   

    to everandforever:
    强,稳定从来不是问题,难道你写的程序就一个bug也没有?
      

  17.   

    haw-haw liu_feng_fly, pls don't argue here,
      

  18.   

    我没有想争论什么,不过,如果你决定使用c++,那么,越早熟悉stl越好,使用vector,deque等等这些容器,可以避免下标越界,数组溢出等等常见的问题,使用string,可以比字符数组有更好的安全性,曾经,我写的一段数组就是因为字符数组溢出导致了一个bug,找了好久才找出来。所以后来下决心使用std;;string或者CString表示字符串。而且,stl里面还有各种算法,比如sort等等。
    像你这个程序,只要
    vector<int> vecINT;
    vecINT.push_back(0);
    ...
    根本不用关心数组有多大,只要你的内存足够,那么,有多少int你都可以push_back进去而不用担心会有什么内存问题,溢出问题等等。
      

  19.   

    是啊,这是标准库与stl的目的。我个人与你的观点一致。我在这个帖子里提出了一些小(菜)问题,很高兴得到这么多帮助。
      

  20.   

    “这是标准库与stl的目的”我觉得这是stl的目的“之一”,再有就是泛形思维,我也在学习。