2016-10-25 4 views
0

printf("Some string here",++i++&&&i***a);Каково количество токенов в следующем фрагменте кода?

Я смущен, как подсчитать количество маркеров для этого фрагмента кода. В принципе, я не понимаю, как будут учитываться &&& и ***.

Я думаю, что && - это один токен, а & - один, а *** - это всего 3 жетона, но я не уверен, что это правильно.

Я отредактировал код с пробелами, чтобы разделить токены.

Может кто-нибудь объяснить любой техникой, чтобы я мог подать заявку на любой фрагмент кода?

Любая помощь будет принята с благодарностью!

+0

@WeatherVane, отредактирован !! Не могли бы вы проверить сейчас – Garrick

+0

Как объявляется '' '? – imreal

+0

Почему имеет значение, как объявляется 'a'? Речь идет о токенизации. 'a' - это один токен. – itsme86

ответ

1

C tokenization является «жадным» - он пытается создать самый длинный юридический токен. См. Раздел 6.4.6 (пунктуаторы) online C 2011 draft standard, в котором перечислены токены легального акцента (&&, ++ и т. Д.).

Последовательность ++i++&&&i***a будет лексемы, как ++, i, ++, &&, &, i, *, *, *, a. Это будет проанализировано как (++(i++)) && ((&i) * (**a)), что не является юридическим выражением (результат i++ не является значением lvalue, поэтому он не может быть операндом унарного оператора ++).

+0

Не говоря уже о том, что вы не можете умножить значение указателя на что угодно. – aschepler

+0

@aschepler: это тоже. –

+0

@JohnBode, 8 отличных лексем есть, правильно? – Garrick

1

Ваш анализ корректен. Токенизация в C является жадным, что означает, что когда встречается &&&, сначала сканируется самый длинный токен &&. Нет токена **, поэтому каждый символ * является его собственным токеном.

Лексемы являются:

  1. printf
  2. (
  3. "Some string here"
  4. ,
  5. ++
  6. i
  7. ++
  8. &&
  9. &
  10. i
  11. *
  12. *
  13. *
  14. a
  15. )
  16. ;
+0

Кроме того, есть 11 лексем, правда? – Garrick

+0

Я не уверен, как вы определяете/считаете лексемы. – aschepler

+0

printf является lexeme, ++, && все предопределены внутри компилятора, поэтому называются lexemes. Примечание: я не говорю о разных лексемах. Я говорю об общем количестве лексем. – Garrick

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