Jay*_*rod 57
这与C++的模板系统是图灵完备的事实有关.这意味着(理论上)您可以使用可以使用任何其他图灵完整语言或系统的模板在编译时计算任何内容.
这有副作用,一些显然有效的C++程序无法编译; 编译器永远无法决定程序是否有效.如果编译器可以决定所有程序的有效性,它将能够解决停机问题.
请注意,这与C++语法的歧义无关.
编辑: Josh Haberman在下面的评论和博客文章中指出了一个很好的例子,为C++构建一个解析树实际上是不可判定的.由于语法的模糊性,不可能将语法分析与语义分析分开,因为语义分析是不可判定的,语法分析也是如此.
另见(Josh的帖子链接):
Dav*_*ley 12
它可能意味着C++语法在语法上是模糊的,你可以根据上下文写下一些可能意味着不同事物的代码.(语法是对语言语法的描述.它决定了这a + b是一个包含变量a和b的加法运算.)
例如,foo bar(int(x));如所写的,可以是名为bar的变量的声明,类型为foo,其中int(x)是初始化器.它也可以是一个名为bar的函数声明,取一个int,并返回一个foo.这是在语言中定义的,但不是语法的一部分.
编程语言的语法很重要.首先,它是一种理解语言的方法,其次,它是编译的一部分,可以快速完成.因此,与C++具有明确的语法相比,C++编译器更难编写并且使用起来更慢.此外,更容易制作某些类型的错误,尽管一个好的编译器将提供足够的线索.
如果"有些人"包括Yossi Kreinin,那么根据他在这里所写的内容......
考虑这个例子:
Run Code Online (Sandbox Code Playgroud)x * y(z);在两种不同的背景下:
Run Code Online (Sandbox Code Playgroud)int main() { int x, y(int), z; x * y(z); }和
Run Code Online (Sandbox Code Playgroud)int main() { struct x { x(int) {} } *z; x * y(z); }
......他的意思是"你不能通过查看x*y(z)决定它是表达还是声明." 在第一种情况下,它表示"使用参数z调用函数y,然后使用x调用operator*(int,int)和函数调用的返回值,最后丢弃结果." 在第二种情况下,它意味着"y是指向结构x的指针,初始化为指向与z相同的(垃圾和定时炸弹)地址."
假设您有一个COBOLmania,并将DECLARE添加到该语言中.然后第二个会成为
int main() {
DECLARE struct x { x(int) {} } *z;
DECLARE x * y(z);
}
Run Code Online (Sandbox Code Playgroud)
并且会出现可判定性.请注意,可判定式不会使指针到垃圾问题消失.
| 归档时间: |
|
| 查看次数: |
9313 次 |
| 最近记录: |