2016-08-05 6 views
2
int a[2][4] = {........}; 

В приведенном выше коде a является идентификатором типа массива. Но мне любопытно, является ли a[2], который является массивом из 4 элементов int, также является идентификатором?Является ли выражение, включающее в себя подстроку массива, идентификатором?

ответ

3

a[2] не является идентификатором.

Определение идентификаторов в N1570 6.4.2 является

identifier: 
    identifier-nondigit 
    identifier identifier-nondigit 
    identifier digit 

identifier-nondigit: 
    nondigit 
    universal-character-name 
    other implementation-defined characters 

nondigit: one of 
    _ a b c d e f g h i j k l m 
     n o p q r s t u v w x y z 
     A B C D E F G H I J K L M 
     N O P Q R S T U V W X Y Z 

digit: one of 
    0 1 2 3 4 5 6 7 8 9 

Я не думаю, что [ и ] включены в «реализации определенных символов» для типичных компиляторов C, потому что они (N1570 6.5.2.1)

2

№ Идентификатор - это, например, имя переменной или функции. Как писал @WhozCraig в комментарии, это не только переменная или функция. Термин происходит от синтаксиса анализаторов:

function ::= identifier '(' parameter (',' parameters)* ')' 

В примере a[2][4]a является идентификатором и значение. Также a[2] и a[2][4] оба значения, но не идентификаторы. Все они также являются L-значения, то вы можете написать a, a[2] и a[2][4] слева от знака Назначают =:

a[2][4] = 100; 
+2

Примечание: языковой стандарт не ограничивает термин * идентификатор * только функциями и переменными. В § 6.2.1 «Идентификатор может обозначать объект: функцию, тег или член структуры, объединения или перечисления, имя typedef, имя метки, имя макроса или параметр макроса». – WhozCraig

+0

@WhozCraig Исправил ответ. –

+0

Это не r-значения, а lvalues ​​(объекты с выделенным пространством памяти) и * могут быть преобразованы в rvalues ​​*. – MikeCAT

0

Нет, a[2] элемент массива объекта. Цитирование C11, глава §6.5.2.1/2, индексация массивов

постфиксного выражение, за которым следует выражение в квадратных скобках [] является индексируются обозначения элемента объекта массива.

Чтобы добавить, из §6.4.2.1, Идентификаторы

Идентификатор представляет собой последовательность нецифровой символов (включая символ подчеркивания _, в строчных и заглавных букв латинского алфавита и другие символы) и цифры, которая обозначает один или более объектов, как описано в разделе 6.2.1 [..]

и, в §6.2.1, прицелы идентификаторов

Идентификатор может обозначать объект; функция; тег или член структуры, объединения или перечисление; имя typedef; имя ярлыка; имя макроса; или макропараметр.

Таким образом, элемент массива не идентификатор.

2

Нет, «идентификатор» строго относится к имени, созданному из буквенно-цифровых символов и символов подчеркивания.

Однако a, a[2] и a[2][4] все declarators здесь.

+0

Да, внутри декларации они являются деклараторами. После объявления 'a',' a [i] '(где 0 ≤' i' <2) и 'a [i] [j]' (где 0 ≤ 'i' <2, 0 ≤' j' <4) - все * lvalues ​​*, но только 'a [i] [j]' является * изменяемым значением l *. –

2

a[2] - постфиксное выражение, которое построено из идентификатора первичного выражения a и оператора индекса [].

Если рассматривать в одиночку декларацию

int a[2][4]; 

, то эта декларация объявляет идентификатор a как имеющий тип int[2][4].

Вы можете отделить идентификатор от других элементов объявления с помощью typedef. Например,

typedef int T[2][4]; 

T a; 

Теперь более ясно, что является идентификатором. Таким образом, a является идентификатором, который имеет тип T, который, в свою очередь, эквивалентен int[2][4].

В грамматике C есть такое понятие, как декларатор. Например, идентификатор является декларатором. В объявлении ниже я вложил все объявления в круглые скобки.

int (((a)[2])[4]); 

Это действует декларация, хотя выглядит запутанным. :) То есть в данном объявлении a, a[2] и a[2][4] являются declarators, которые строятся начиная с идентификатором a.

+0

'a [2]', как используется в примере кода, не является синтаксически выражением. – aschepler

+0

@aschepler Я добавил свой пост, чтобы было более понятно. –

 Смежные вопросы

  • Нет связанных вопросов^_^