考虑以下代码:
#include <iostream>
int main()
{
int iTemp = 0;
iTemp += 1; // Valid
iTemp + = 1; // This gives an error ( note the space between '+' and '=')
return 0;
}
解析器是否应该自动消耗此空间并检查是否存在'=',因为'+ ='也是一个有效的令牌,而不是抛出错误?
同样地,我得到一个错误&lt; iostream&gt;
有人可以解释一下。
答案 0 :(得分:12)
不,解析器不应该。语言的规范要求这种行为,这就是故事的结束。
答案 1 :(得分:8)
不起作用。
C编译的第一步是标记化 - 打破字符序列以分离语言元素。例如:
int x=333;
成为列表int
,x
,=
,333
和;
'。
完成后,编译器可以确定哪个令牌意味着什么以及如何组合它们。
如果标记化看到序列+=
,它会生成一个标记。如果它看到空格,则会生成两个:+
和=
。
答案 2 :(得分:4)
不,不应该。解析器非常好但不会读取思想。它无法知道加号或等号是错误还是间距是错误。无论如何,整件事都是错误的。
答案 3 :(得分:3)
没有。 +=
是一个令牌。 +
和=
也分别是单个令牌。
答案 4 :(得分:3)
规范指定了+=
运算符,而不是+ =
运算符。所以答案是否定的。 while
关键字不能替换为whi le
,+ =
答案 5 :(得分:3)
我记得,在黑暗时代,当op=
代币具有替代变体=op
时。因此x =+ 5
与x += 5
的含义相同。当然,这是灾难性的,因为x=-5
意味着x -= 5
而不是x = -5
。但即使在早期,这些复合代币也不允许包含空白区域。
答案 6 :(得分:3)
+,=和+ =是不同的运算符。因此,如果在+和=之间给出空格,则scan会将这些运算符标记为不同的运算符。因此,语法分析器(Parser)将产生语法错误。
答案 7 :(得分:0)
为什么会起作用?
如果您尝试增加a = a+ +
,它也将无效。