“关键字”和“保留字”有什么区别?

57

“关键字”和“保留字”有什么区别呢?

例如,在C++概念提案中,可以看到以下陈述:

此提案引入了五个新的关键字:concept、concept map、where、axiom 和 late check。所有这些关键字也将是保留字。


2
@Piotr 注意,在几个人有机会回答之前接受答案是一个不好的主意。我建议等待至少12个小时。 - anon
@Neil 这真的是一个非常好的被接受的答案 :) - Piotr Dobrogost
2
@Piotr 我并不是在批评这个答案。但是如果你知道它在某种程度上是“好”的,而没有将其与其他可能截然相反的答案进行比较,那么你为什么要首先提出这个问题呢? - anon
@Neil 这种情况下,仅仅阅读答案就能知道它是好的。此外,在我接受最佳答案时,已经有两个明显更差的不同答案了。 - Piotr Dobrogost
好的,MDN使用“保留关键字”这个术语(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords),所以我仍然感到困惑。 - sdfsdf
10个回答

70

关键字在语言中有特殊含义,是语法的一部分。

保留字是指不能用作标识符(变量、函数等)的单词,因为它们被语言保留。

实际上,大多数关键字都是保留字,反之亦然。但由于它们是两个不同的概念,可能会出现一个关键字不是保留字(例如,关键字只在特定上下文中具有意义,因此可以用作标识符),或者保留字不是关键字(例如,因为它被保留用于未来使用)。

更新:以下是其他人提供的一些示例,说明了这种区别:

  • 在Java中,goto 是一个保留字但不是关键字(因此,您根本不能使用它)
  • Fortran没有任何保留字,所有关键字(if、then等)都可以用作标识符

1
所有关键字都是保留字,但并非所有保留字都是关键字,尽管它们之间的区别相当模糊。一些语言具有指令,根据上下文具有特殊含义,并可用作其他位置的标识符。 - Toon Krijthe
2
在Java中,goto是一个保留字,但不是关键字。 - pjp
2
@Gamecat,不,这不是真的。存在根本区别,甚至有现实世界的例子,其中关键字不是保留字(Fortran,Postscript,...其他?)。 - molf
goto 是 Java 中的一个关键字。 - user207421
1
SQL有相当不连贯的关键字和保留字集合。这里是两者完整列表。我认为这是一个很好的例子,可以理解它们之间的区别。 - slashCoder
显示剩余2条评论

21

仅仅为了展示这个区别非常重要:

并不是所有语言的所有关键字都是保留字。在Fortran中,有可能会做到这一点:

if if then then else else
在这种情况下,关键字并不是保留的,但是根据上下文,编译器可以将它们解释为变量。
在该情况下,关键字并不是被保留的,但取决于上下文,编译器可能会将其解释为变量。

2
不是每个关键字都是“保留字”的好例子。谢谢。 - Piotr Dobrogost
1
有趣。这表明Fortran编译器设计者付出了额外的努力,只是为了让开发人员创建混乱的代码 :P - RBT
1
可以使用 if then then then = else else else = then - James Pringle
1
哈哈哈!!.. 真是疯狂。 - maykhid

11

一个很好的例子是Java中的“goto”的区别。它不是语言关键字(即它不是有效的Java),但它是一个保留词。

似乎Java的设计者在告诉我们:“我们不会使用'goto',你也不应该使用它。”


2
不是每个“保留字”都是关键字的好例子。谢谢。 - Piotr Dobrogost
goto 是 Java 中的一个关键字。 - user207421

5

这是错误的:关键字不能用作用户定义的名称(ifelse等)。 - Sean Pianka

1
  • 关键字:它具有一定的意义,我们可以在程序中使用。
  • 保留字:我们不能在程序中使用。它们可能在未来被使用。 例子:goto

1
那些死灵法师是从哪里来的?我也想复活尸体! - user395760

1

我猜关键字是指作为“关键字”使用的单词(例如if,for,switch等),而保留字则是指您不能将其用作变量名称的内容,因为它可能在语言的未来版本中成为关键字。


0

关键字:关键字在编译器中具有一些特殊功能。因此,在编码中不能使用关键字作为标识符。 保留字:保留字是为将来预留的单词。在Java中,const和goto是保留字,目前未被使用,但可能在未来重新引入Java中。 如果我们在这里检查Java语言关键字(https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html),它说Java(我猜是最新的)有50个关键字,包括goto和const。因此,goto和const是保留的关键字。


0

实际上这取决于很多上下文。例如,ISO C++标准指出像“if”、“while”、“int”等都是关键字,并没有使用术语保留字,除了一次在脚注中,可能意思是其他的东西 :-)

标准确实指定了保留名称 - 例如,所有以下划线和大写字母开头的名称都是保留名称。


关键字和(特定的)保留标识符之间可能很快会有一个明显的区别:C++17放弃了标识符“register”的过时提示含义,但仍将其保留为保留标识符,因此人们不能开始调用变量,并且也许它以后将像“auto”一样拥有新的含义(这是值得庆幸的)。 - underscore_d

0
关键字是指在特定的上下文中具有特殊含义的词汇,其定义是语义上的。 保留字是指不能用作标识符(例如变量和函数名称)的单词,其定义是语法上的。
例如,在Java中,所有关键字都是保留字。可能反过来不成立。 goto是保留字,但不被使用且没有功能。
在早期的编程语言如FORTRAN中有关键字但没有保留字。
然而,关键字和保留字可以互换使用。

goto 是 Java 中的一个关键字。关键字是语法上的。 - user207421
对于向前兼容性而言,像goto这样的保留字可能会变成关键字。但是goto并没有特殊的含义。关键字在它们被使用的上下文中具有特定的含义。请参考:https://en.wikipedia.org/wiki/Reserved_word - Yergalem
维基百科与此毫无关系。我正在引用和引证Java语言规范。如果维基百科与之不符,则根据定义是错误的。 - user207421
即使您链接的Java 语言规范也提到goto 作为保留字。虽然它是C ++关键字,但对于Java而言,将其称为保留字更具表达性,因为它没有使用。您所说的关键字是指什么?但保留字是这样的。 - Yergalem

-1

保留字和关键字在GW-BASIC中基本上是相同的,它们具有预定义的含义...这些具有预定义的用途,不能在Basic中用于其他目的或重新定义。关键字不能用作变量名。Basic的一些关键字是...IFTHENWHILE等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接