2012-06-21 24 views
2

可能重複:
In C++ books, array bound must be constant expression, but why the following code works?根據C++的規則是否合法?

看到這個代碼

#include<iostream> 
int main 
{ 
using namespace std; 
int a=7; 
char arr[a]; 
return 0; 
} 

在我的書上寫着的是ARRAY_SIZE必須是恆定的,但是代碼塊是不是在它給錯誤...

它不是唯一的案例..還有其他幾個例子。

誰是錯誤的IDE,編譯器或其他東西?

確實使用較新或較舊的書籍會導致此類問題?

+0

我非常肯定,你不能這樣做,除非是const。 – mathematician1975

+2

@KenWhite:不,「a」不是一個常量表達式。編譯器*可以確定該值爲「7」,但不是必需的。語言標準的*常數表達式*的定義被設計爲不要求編譯器執行數據流分析。 –

+0

雖然這是偷偷摸摸的 - 顯然它有效,但實際上是正確的?正確的意義在於有效的C++。 – mathematician1975

回答

8

代碼格式不正確。數組的範圍必須是常量表達式,並且i不是常量表達式(它未聲明const)。

如果a被聲明爲const int,並且使用常量表達式(如7)進行初始化,則代碼將是格式良好的,因爲該範圍將是一個常量表達式。例如,下面是合式:

int main() 
{ 
    int const a = 7; 
    char arr[a]; 
} 

某些C++編譯器(包括gcc,在一些編譯模式)支持可變長度數組,這是從C的功能,並且允許本地陣列具有非恆定大小。但是,提供此功能的編譯器可以作爲語言擴展;它不是C++的一個功能。

+0

感謝您的回覆.. 我使用的是GNU GCC編譯器。 初學者我需要一個編譯器,可以告訴我關於我在所有點上的錯誤,以便我可以瞭解我在哪裏犯錯誤。 所以你知道任何好的IDE /編譯器.. – chandola

+0

使用gcc與'-std = C++ 11'(也許是'-pedantic')。 –

+0

更不用說' - 錯誤'和'-Wall'。 –

1

由於C99ISO/IEC 9899:1999,節6.7.5.2),這是在Ç法律:arr是可變長度陣列(VLA)。但是,there is no VLA in C++。接受的答案here解釋了原因。

+2

C++不是c http://stackoverflow.com/questions/8593643/does-c-support-variable-length-arrays – jfs

+0

@ J.F.Sebastian謝謝,我修改我的答案。 – kol

0

它在C++ 98,C++ 03,C++ 11,C89和C90(可能還在C11中)中是非法的。

它只在C99合法。

0

它根據標準,這裏是不合法的:

C++ 03 8.3.4/1 [dcl.array]

在declarationT d其中d具有形式D1 [constant-expressionopt] 並且聲明T D1中的標識符的類型是 「派生聲明者類型列表T」,那麼D 的標識符的類型是數組類型。 T稱爲數組元素類型;這種類型 不是引用類型,(可能是cv-qualified)類型void,一個 函數類型或抽象類類型。如果存在常量表達式 (5.19),則它應該是一個積分常數表達式,其值應大於零。 [...]

積分常量表達式在5.19/1進一步定義:

[...]的積分常數表達式可以只涉及文字 (2.13),統計員,常量變量或靜態數據 用常量表達式 (8.5),積分或枚舉類型的非類型模板參數, 和sizeof表達式初始化的整數或枚舉類型的成員。