我想知道下面给出的声明中的令牌数量
a+++b---c
请告诉我令牌的数量 我告诉我的viva老师,有7个令牌,但他说这是错的。
答案 0 :(得分:2)
你是对的。有七个令牌:(在C中)
a
++
+
b
--
-
c
答案 1 :(得分:0)
根据C标准(C11前草案):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf
6.4词汇元素
3令牌是翻译阶段7和8中语言的最小词汇元素。令牌的类别包括:关键字,标识符,常量,字符串文字和标点符号。 ...
4如果输入流已被解析为预处理标记,直到给定字符,则下一个预处理标记是可构成预处理标记的最长字符序列。 ... 6示例2程序片段
x+++++y
被解析为x ++ ++ + y
,这违反了增量运算符的约束,即使解析x ++ + ++ y
可能产生正确的表达式6.4.6标点符号:标点符号:
++
--
之一...+
-
因此,我使用了https://en.wikipedia.org/wiki/Maximal_munch中的https://stackoverflow.com/a/7485174规则以及a+++b
片段的评论:What does the operation c=a+++b mean? Shahbaz 2011年9月20日:“ C的词法分子和C ++一样,尝试匹配他们看到的东西时最大的字符串。...因此,当词法分析器看到第一个加号时,它会尝试下一个字符,它会发现它可以将两个字符都匹配为++
,然后继续查看下一个+
。因此,解析器看到a ++ + b
“
虽然gcc和clang具有复杂的代码,并且可能在单个代码示例(so they are not best guides to the language, as rici said)中混合标准的不同转换阶段,但我们可能会检查++
和--
的解析实现。当它看到char +
时,它可能会根据下一个char生成不同的标记,如果是+
,则发出plusplus标记,否则发出加号:
http://code.metager.de/source/xref/llvm/clang/lib/Lex/Lexer.cpp#3264
3264 case '+':
3265 Char = getCharAndSize(CurPtr, SizeTmp);
3266 if (Char == '+') {
3267 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
3268 Kind = tok::plusplus;
3269 } else if (Char == '=') {
3270 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
3271 Kind = tok::plusequal;
3272 } else {
3273 Kind = tok::plus;
3274 }
3275 break;
http://code.metager.de/source/xref/gnu/gcc/libcpp/lex.c#2633
2633 case '+':
2634 result->type = CPP_PLUS;
2635 if (*buffer->cur == '+')
2636 buffer->cur++, result->type = CPP_PLUS_PLUS;
2637 else if (*buffer->cur == '=')
2638 buffer->cur++, result->type = CPP_PLUS_EQ;
2639 break;
因此,a+++b---c
表达式的标记为a
++
+
b
--
-
c
。顾问可能会说你错了,但只是想让你解释为什么你认为你算了7。而且如果问题与给定的任务相同并且它是根据C标准(或C ++解析)对于这个例子,你可以解释你的答案并向他展示语言标准的相关部分。