所有这些都是C中的关键字吗?

时间:2016-10-14 18:08:33

标签: c keyword

我是计算机科学专业的学生,​​我们的教授最近就C基础知识进行了演讲。它的脚本声明"关键词是具有固定含义的词,总是以小写字母书写。"

首先,我知道有_Bool之类的关键字,因此这个陈述已经存在缺陷。该脚本还包含一系列示例,包括但不限于:

  • break
  • case
  • void
  • main
  • &
  • {
  • #include
  • %

这引出了许多问题:

  • 运营商可以归类为关键字吗?
  • 是编译器说明,例如#include关键字?
  • 可以将main视为特殊的函数名称,它可以归类为关键字吗?

而且,如果我想证明关于C的陈述,我在哪里可以找到引用的官方来源?

2 个答案:

答案 0 :(得分:3)

有关标准文档的链接,请参阅these two个答案。您通常可以安全地使用免费的草稿版本作为参考,而不是相当昂贵的最终文档。至少对于C ++而言,两者之间的差异(主要是)是次要的编辑细节。

C

C11标准在6.4.1节中定义了以下关键字:

auto        if          unsigned
break       inline      void
case        int         volatile
char        long        while
const       register    _Alignas
continue    restrict    _Alignof
default     return      _Atomic
do          short       _Bool
double      signed      _Complex
else        sizeof      _Generic
enum        static      _Imaginary
extern      struct      _Noreturn
float       switch      _Static_assert
for         typedef     _Thread_local
goto        union

没有方便的单一运营商列表,但它们未列为关键字。也没有任何预处理器指令。

C ++

C ++ 14标准在2.12节中定义了以下关键字:

alignas     continue        friend      register          true
alignof     decltype        goto        reinterpret_cast  try
asm         default         if          return            typedef
auto        delete          inline      short             typeid
bool        do              int         signed            typename
break       double          long        sizeof            union
case        dynamic_cast    mutable     static            unsigned
catch       else            namespace   static_assert     using
char        enum            new         static_cast       virtual
char16_t    explicit        noexcept    struct            void
char32_t    export          nullptr     switch            volatile
class       extern          operator    template          wchar_t
const       false           private     this              while
constexpr   float           protected   thread_local
const_cast  for             public      throw

某些运营商的替代符号也被视为关键字:

and     and_eq  bitand  bitor   compl   not
not_eq  or      or_eq   xor     xor_eq

运算符符号在2.13节中列出,但它们不称为关键字。和C预处理器一样,符号也不是关键字。

你教授的名单

严格按照标准的字母你的教授是错的。您问题中列表的摘要列出的不仅仅是关键字。它看起来更像是一个特殊单词和符号列表,具有预定义,作为语言或预处理器中的标记。

当您查看关键字在两个标准中的半显式半定义时,这种解释实际上并不是

C11

  

保留上述令牌(区分大小写)(在翻译阶段7和8中)以供使用   关键字,不得以其他方式使用。

C ++ 14

  

表4中显示的标识符保留用作关键字(即,在第7阶段无条件地将它们视为关键字),但属性标记除外。

答案 1 :(得分:2)

关键字是由语言保留的其他合法标识符。

运营商不是关键字。 #include不是关键字。 main不是关键字(事实上,您可以使用main作为变量名称)。

你会引用C规范:

  

6.4.1关键字

     

<强>语法

     

keyword

之一      

auto   break   case   char   const   continue   default   do   double   else   enum   extern   float   for   goto   if   inline   int   long   register   restrict   return   short   signed   sizeof   static   struct   switch   typedef   union   unsigned   void   volatile   while   _Bool   _Complex   _Imaginary

     

<强>语义

     

保留上述令牌(区分大小写)(在翻译阶段7和8中)用作关键字,否则不得使用。   关键字_Imaginary保留用于指定虚构类型。

来自ISO / IEC 9899:TC3见http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf