C ++是一种白色空间,独立的语言,例外(c++ is a white space independ

2019-10-17 04:40发布

这wikepedia页面定义C ++作为一个“空白独立的语言”。 虽然与所有的语言大多真有例外的规则。 唯一一个我可以在那一刻想到的是这样的:

vector<vector<double> >

必须有一个空格,否则编译器解释>>作为流运算符。 有什么其他的都是身边。 这将是有趣编译例外列表。

Answer 1:

下面这个逻辑,你可以使用任何两个字符语义产生这种“例外”的规则。 例如, +=+ =将被不同地解释。 我不会,虽然给他们打电话例外。 在很多情况下C ++“没有空间可言”是从“一个或多个空格”完全不同。 当有人说C ++是空间独立,他们通常指的是“一个空间”在C ++中通常是一样的“一个以上的空间”。

这反映在语言规范,其中规定(参见2.1 / 1),其在翻译阶段3执行被允许与一个空格字符替换的多个空白字符序列。



Answer 2:

语法和解析C ++的确是相当复杂的语义规则(我想是不错的,我觉得一个被授权说“一塌糊涂”)。 这一事实证明,多年来,不同的编译器的作者那里只是争论什么是合法的C ++,哪些不是。

在C ++中,例如,你可能需要决定什么是他们第一次的语义(可怕的前解析令牌无限多个“最伤脑筋的解析规则”也经常咬新人)。

你的反对意见IMO但是并没有真正意义......例如++有不同的含义,从+ + ,并在帕斯卡尔begin是不一样beg in 。 这是否让帕斯卡尔依赖空间的语言? 是否有独立的空间语言(除brainf * CK)?

关于C ++ 03唯一的问题>> / > >的是,这个错误打字的时候很常见于是他们决定更加复杂增加了语言定义,以解决C ++ 11这个问题。

其中一个空格代替多个空格可以有所作为(东西区分依赖空间和语言不过是起到了任何作用的情况下, > > / >>情况)确实是少数:

  1. 双引号字符串内(但每个人都希望支持的字符串文字,我知道做了同样的是和每一种语言)

  2. 里面单引号(同样,即使东西并不多,C ++程序员知道的是,可以有更多的是单引号内的一个字符)

  3. 在预处理指令,因为它们是基于行工作(换行是一个空白,这让有区别)

  4. 在续行作为注意到了stefanv:继续单行,你可以把一个反斜杠换行符前面,并在这种情况下,语言会忽略这两个字符(你甚至可以在标识符中间做到这一点,即使典型用途只是为了使长预处理宏可读)。 如果你把其他的空白字符反斜杠后但续行没有被识别的换行符之前的(一些编译器接受也无妨,只是检查,如果行的最后一个非空白是一个反斜杠)。 续行也可以使用三字符相当于指定??/反斜杠(任何合理的编译器应该IMO找到一个三字符的时候,因为他们最有可能不是由程序员缩进发出警告)。

  5. 内单行注释//因为还评论的中间有添加新行到其他空格有差别



Answer 3:

喜欢还是不喜欢,但是宏的也都是C ++部分和多线宏的应用反斜杠随后EOL分开, 没有空格应在反斜线和EOL之间
不是一个大问题,但仍然是一个空白例外。



Answer 4:

这是因为在解析器预C ++ 11的限制,这是不再是这种情况。

原因是,这是很难分析>>为模板的结束相比,运营商>>



Answer 5:

虽然C ++ 03 解释>>在所有情况下移位运算符(这是覆盖在流一起使用,但它仍然是移位运算符),在C ++ 11的语言解析器现在将尝试合理时关闭梅开二度。



Answer 6:

  • 嵌套模板参数: set<set<int> >
  • 字符文字: ' '
  • 字符串文字: " "
  • 关键字和标识符的Justoposition: else return x;void foo(){}


文章来源: c++ is a white space independent language, exception to the rule