2017-01-07 7 views
3

私はプログラミングテストの準備をしていますが、このlong long A[(10,10)]宣言を読んでいます。私がそれについて知っている他のことは、が可能でないということですA[5][1]=somethingを呼び出すことで、このように宣言された変数を初期化することができます。そうでなければ、私はそれが何らかの2D配列であると仮定します。
comma operatorでも構いませんが、gccコンパイラは実際にそれを認識しません。C言語でlong long [(、)]宣言をどうにかして使うことができますか?

abc.c:3:16: error: expected ']'
long long A[10,10];
^abc.c:3:13: note: to match this '['
long long A[10,10];

あなたは何か、または何かナンセンスであれば、何か手掛かりはありますか? (私はそれをGoogleにしようとしていましたが、これらのことは簡単に見つかりません...)
ありがとうございます。

+0

ソースを引用してください。 –

+0

どこからこの宣言を得ましたか? – ForceBru

+0

@ForceBru私たちのコースのいくつかの以前のテストにあった。 – TGar

答えて

2

あなたの質問に答えるには、経験のあるプログラマがcppリファレンスを参照しなければならない直感的でない宣言は、はっきりナンセンスです。

私はApple LLVM 8.0コンパイラとC99言語の方言で式long long A[(10,10)]をテストし、うまくいきました。 cpp reference concerning comma operatorに相談すると、1は次のように見つけることができます:

Top-level comma operator is also disallowed in array bounds

// int a[2,3]; // error

int a[(2,3)]; // OK, VLA array of size 3 (VLA because (2,3) is not a constant expression)

のでlong long A[(10,10)]縫い目が10が非トップレベルのコンマ式(10,10)の2番目の部分ですlong long A[10]、と等価であることを。興味深いことに、このように宣言された配列は、VLA(実行時にサイズが決定される可変長配列)として扱われることがあります。

4

配列の宣言では、constant-expressionが期待されます。これはexpressionのサブセットです。具体的には、コンマ演算子と代入式はセットの一部ではありません。

配列宣言子はdirect-declaratorの一種である:

direct-declarator: ... | 
    direct-declarator "[" constant-expression? "]"; 

constant-expression: conditional-expression; 

expression: assignment-expression | expression "," assignment-expression; 

assignment-expression: conditional-expression | 
    unary-expression assignment-operator assignment-expression; 

ので、文法はここにカンマを許可しません。

+0

ですから、基本的に宣言は間違っていますか? – TGar

+3

@SimonRichter式(10,10)は、括弧でグループ化された通常のコンマ演算子であるC99以降の可変長配列である可能性があります。 – nos

+0

はい、少なくともC言語仕様の文法に従います。文法ではA [(10,10)]またはA [(j = 5)]は許されますが、C99より前のモードでは後のステップで意味評価に失敗します。 –

関連する問題