user-0 提问: 数组维数，是常量表达式？

回复:
user: user-0
content: mymtom： 引用注意C++里const variables是常量表达式，在C里不是。 const variables C语言当作什么了？

user: user-1
content: 引用 13 楼 mymtom 的回复:[quote=引用 11 楼 q3733353520 的回复:] 跟编译器有关   variable-sized object may not be initialized  变长数组不可在定义的时候初始化 编译器无关，C语言中是不能对变长数组初始化的。[/quote] 其实C++也不允许对变长数组初始化； 再进一步，事实上C++98是不支持变长数组的 (g++支持变长数组，但是可以用g++ -std=c++98 -Wall -pedantic让g++ 对变长数组输出警告) 楼主的程序用C++可以正确编译，其实是由于C++和C对于常量表达式的规定有细微差别。 注意C++里const variables是常量表达式，在C里不是。 所以就楼主的程序来说： 用C编译的话，a[n]是变长数组。 用C++编译的话，a[n]是普通数组。  C99的整型常量表达式    An integral constant expression shall have integral type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions, and floating constants that are the immediate operands of casts.  Cast operators in an integral constant expression shall only convert arithmetic types to integral types, except as part of an operand to the sizeof operator.  C++98的整型常量表达式  1 In several places, C++ requires expressions that evaluate to an integral or enumeration constant: as array bounds (8.3.4, 5.3.4), as case expressions (6.4.2), as bitfield lengths (9.6), as enumerator initializers (7.2), as static member initializers (9.4.2), and as integral or enumeration nontype template arguments (14.3). constantexpression: conditionalexpression An integral constantexpression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions (8.5), nontype template parameters of integral or enumeration types, and sizeof expressions. Floating literals (2.13.3) can appear only if they are cast to integral or enumeration types. Only type conversions to integral or enumeration types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or references shall not be used, and assignment, increment, decrement, functioncall, or comma operators shall not be used.

user: user-1
content: 引用 11 楼 q3733353520 的回复:跟编译器有关   variable-sized object may not be initialized  变长数组不可在定义的时候初始化 编译器无关，C语言中是不能对变长数组初始化的。

user: user-1
content: C语言中不能对变长数组初始化 3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

user: user-2
content: 跟编译器有关   variable-sized object may not be initialized  变长数组不可在定义的时候初始化

user: user-3
content: 数组的大小，在编译的时候必须是确定的，这只跟编译器有关！

user: user-4
content: 这种栈中的要常量，new的可以用变量

user: user-5
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-6
content: 很多才开始编程的人总是想要做变长数组，其实是没考虑到内存分配的问题。所有的程序员其实都要首先考虑数据结构和程序逻辑，数据结构就是说数据如何存储。对于变长的情况，一般可考虑给定一个最大值，总是有上限的吧。看起来是浪费了点内存，其实是节省了CPU和程序员的时间。实在要变长的数据结构，首先考虑的是链表。链表才是动态内存分配的基本结构。不然动态分配了放哪里呢？

user: user-1
content: 引用 15 楼 Daffodiles 的回复:mymtom： 引用注意C++里const variables是常量表达式，在C里不是。 const variables C语言当作什么了？ 举例说明。 下面的程序作为C++编译是正确的。 但是作为C程序编译会报错。  #include <stdio.h> int main() {     int ch;     const int n = 3;      switch (ch) {     case n:         break;     case 1:         break;     default:         break;     }      return 0; }

user: user-2
content: 引用 14 楼 mymtom 的回复:[quote=引用 13 楼 mymtom 的回复:] [quote=引用 11 楼 q3733353520 的回复:] 跟编译器有关   variable-sized object may not be initialized  变长数组不可在定义的时候初始化 编译器无关，C语言中是不能对变长数组初始化的。[/quote] 其实C++也不允许对变长数组初始化； 再进一步，事实上C++98是不支持变长数组的 (g++支持变长数组，但是可以用g++ -std=c++98 -Wall -pedantic让g++ 对变长数组输出警告) 楼主的程序用C++可以正确编译，其实是由于C++和C对于常量表达式的规定有细微差别。 注意C++里const variables是常量表达式，在C里不是。 所以就楼主的程序来说： 用C编译的话，a[n]是变长数组。 用C++编译的话，a[n]是普通数组。  C99的整型常量表达式    An integral constant expression shall have integral type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions, and floating constants that are the immediate operands of casts.  Cast operators in an integral constant expression shall only convert arithmetic types to integral types, except as part of an operand to the sizeof operator.  C++98的整型常量表达式  1 In several places, C++ requires expressions that evaluate to an integral or enumeration constant: as array bounds (8.3.4, 5.3.4), as case expressions (6.4.2), as bitfield lengths (9.6), as enumerator initializers (7.2), as static member initializers (9.4.2), and as integral or enumeration nontype template arguments (14.3). constantexpression: conditionalexpression An integral constantexpression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions (8.5), nontype template parameters of integral or enumeration types, and sizeof expressions. Floating literals (2.13.3) can appear only if they are cast to integral or enumeration types. Only type conversions to integral or enumeration types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or references shall not be used, and assignment, increment, decrement, functioncall, or comma operators shall not be used. [/quote]

user: user-7
content: 认真看看编译器的错误提示...

user: user-0
content: #include <stdio.h> #define n 3 int main()  {       int a[n]={1,2,3};  }   这样，就没错了！ 为什么，用const就错呢？ 编译器会很老么？

user: user-8
content: 引用 4 楼 u013163178 的回复: //这个也是对的哦 int main() {     int n;     scanf("%d",&n);     a[n];     return 0; }  这怎么可能是对的............

user: user-8
content: 引用 2 楼 Daffodiles 的回复:引用c++ 应该不会错 c有可能会错  编译器太老了？ 矮，C为什么老错呢？  c和c++在处理const上是不同的   没什么为什么

user: user-9
content: //这个也是对的哦 int main() {     int n;     scanf("%d",&n);     a[n];     return 0; }

user: user-9
content: 我的编译没有问题,我的编译环境是: gcc version 4.8.1 (Ubuntu 4.8.1-2ubuntu1~12.04)/*************************************************************************     > File Name: t.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月23日 星期日 20时44分06秒  ************************************************************************/  #include<stdio.h> int main() { 	int const a =9; 	int b[a]; 	b[0] = 22; 	printf("%d",b[0]); 	return 0; }

user: user-0
content: 引用c++ 应该不会错 c有可能会错  编译器太老了？ 矮，C为什么老错呢？

user: user-8
content: c++ 应该不会错 c有可能会错  编译器太老了？