2016-10-25 6 views
0

printf("Some string here",++i++&&&i***a);次のコードスニペットのトークンの数はいくつですか?

私はこのコードスニペット用のトークンの数をカウントする方法、混乱しています。基本的には、&&&***がどのようにカウントされるのか分かりません。

私は&&が1トークンであり、&が1である一方、***は合計3トークンだと思いますが、それが正しいかどうかはわかりません。

トークンを分離するために空白でコードを編集しました。

誰かが何らかの手法で説明できるので、私はどのコードスニペットにも申し込むことができますか?

ご協力いただければ幸いです!

+0

@WeatherVane、編集済み! – Garrick

+0

'a'はどのように宣言されていますか? – imreal

+0

'a'がどのように宣言されるのが大事なのですか?質問はトークン化についてです。 'a'は一つのトークンです。 – itsme86

答えて

1

Cのトークン化「貪欲」である - それは最初最長法的トークンを構築しようとします。有効な句読子トークンのリストについては、online C 2011 draft standardのセクション6.4.6(句読器)を参照してください(&&++など)。

配列++i++&&&i***a++i++&&&i***aとしてトークン化されるであろう。 が解析され、として(++(i++)) && ((&i) * (**a))となります。これは正当な式ではありません(i++の結果は左辺値ではないため、単項演算子++のオペランドにはなりません)。

+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は字句であり、++、&&はすべてコンパイラ内で事前に定義されているため、字句と呼ばれます。注:私は別個の語彙素について話しているわけではありません。私は語彙の総数を言っています。 – Garrick

関連する問題