2015-07-07 5 views
0

Каково количество токенов в следующем заявлении C?Количество токенов C

printf("i = %d, &i = %x", i, &i); 

Ответ 10, пожалуйста, объясните, почему это так?

Я искал из http://www.c4learn.com/c-programming/c-tokens-keywords-identifiers/ и от https://msdn.microsoft.com/en-us/library/c6sb2c6b.aspx и от моего мнения его 9.

printf - 1
() - 2
"i = %d, &i = %x" - 1
, - 2
i,&i - 2
; - 1

всего = 1 + 2 + 1 + 2 + 2 + 1 = 9

Я совершенно новой для C поэтому, пожалуйста, помогите мне

+0

'i' - это один токен,' & i' - два токена. – ace

+2

Я не согласен, что этот вопрос заслуживает 6 downvotes. * Редактировать: * Теперь это 7. Обычно я не буду выдвигать этот вопрос, но в этом случае я думаю, что должен. – ace

+0

@Olaf; Хммм. Я превосхожу на 1. – haccks

ответ

4

Просто поставить пробел между все так, что ничего не меняется в семантике:

printf ("i = %d, &i = %x" , i , & i) ; 

Затем посчитать части между пространствами: 10 токенов! Обратите внимание, что токены - это что-то вроде слов, точек и т. Д. На естественном языке. Они не имеют ничего общего с семантикой (которая является частью анализатора).

Обратите внимание, что это не относится исключительно к C только (за исключением того, что маркеры действительны), но вообще для обработки любого языка. Читайте о компилятор. Есть несколько хороших книг (например, классика Н. Вирта доступна для бесплатной загрузки)

2

В этом утверждении действительно невозможно указать правильное количество токенов, не имея лексической спецификации языка C перед нами , но с быстрой оценки вы могли бы получить что-то вроде этого:

printf("i = %d, &i = %x", i, &i); 

1. printf - Identifier 
2. (  - Left Parenthesis 
3. "  - String start (all subtokens count as one) 
3.1 i  
3.2 =  
3.3 %  
3.4 d  
3.5 &  
3.6 i 
3.7 equals 
3.8 % 
3.9 x 
3.10 "  - string termination 
4. ,   - comma (arguments separator) 
5. i   - Identifier 
6. ,   - comma (arguments separator) 
7. &   - address of operator 
8. i   - Identifier 
9.)   - Right Parenthesis 
10. ;   - Statement delimiter 

Все под 3 отмечает одну строку, я просто укладывать его для того, чтобы сделать его немного более ясно.

Чтобы получить еще более авторитетный ответ чем наше предположение, вы можете написать все это, что вы хотите в файле, скажем experiment.c и затем clang выводится один лексемы с clang --cc1 -dump-tokens experiment.c

+0

3) Делает один токен, так же как и «subtoken» для 'printf'. – Olaf

+0

@ Олаф Да, действительно, поэтому я выложил их с помощью субиндекса. Я просто подумал, что выложить его, как поток символов минус пробел, может быть полезно для op. – NlightNFotis

0

Ниже приведены лексемы ->

  1. Printf
  2. (
  3. "я =% d, I = &% х"
  4. ,
  5. я
  6. ,
  7. &
  8. я
  9. )
  10. ;
Смежные вопросы