可以长久[(,)]"声明以某种方式在C中工作?

时间:2017-01-07 19:26:18

标签: c declaration

我正在准备我们的编程测试,并且我读了这个long long A[(10,10)]声明(它在我们课程中的一些先前的测试中),我没有更多的信息。只有我知道的其他事情是,通过调用A[5][1]=something初始化以这种方式声明的变量不可能。否则,我会认为它是某种2D阵列 它也可能是comma operator,但gcc编译器实际上并没有识别它。

  

abc.c:3:16:错误:预期']'
          长期A [10,10];
                       ^ abc.c:3:13:注意:要匹配这个' ['
          长长的A [10,10];

你有任何线索,如果它是一个东西,或只是一些废话? (我试图谷歌它,但这些东西都不容易找到......)
谢谢。

2 个答案:

答案 0 :(得分: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;

所以这里的语法不允许使用逗号。

答案 1 :(得分:2)

回答你的问题"你有任何线索,如果它是一个东西,或只是一些废话?":任何非直观的,有经验的程序员必须咨询cpp参考的声明是恕我直言显然是无稽之谈。

我用Apple LLVM 8.0编译器和C99语言方言测试了表达式long long A[(10,10)],并且它有效。在咨询cpp reference concerning comma operator时,可以找到以下内容:

  

顶级逗号运算符也不允许在数组边界

中使用      

// int a [2,3]; //错误

     

int a [(2,3)]; // OK,大小为3的VLA数组(VLA因为(2,3)不是常量表达式)

因此long long A[(10,10)]接缝等同于long long A[10],其中10是非顶级逗号表达式(10,10)的第二部分。有趣的是,以这种方式声明的数组被视为VLA(可变长度数组,其大小在运行时确定)。