【问题标题】:Are all of these really keywords in C?所有这些真的是 C 中的关键字吗?
【发布时间】:2016-10-14 18:08:33
【问题描述】:

我是计算机科学专业的学生,​​我们的教授最近举办了一场关于 C 基础知识的演讲。它的脚本声明“关键词是具有固定含义的词,总是小写。”

首先,我知道有_Bool这样的关键字,所以这个说法已经有缺陷了。该脚本还包含大量示例,包括但不限于:

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

这引出了很多问题:

  • 运算符可以归类为关键字吗?
  • 是编译器指令如#include 关键字吗?
  • 可以将main 看作是一个特殊的函数名,可以归类为关键字吗?

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

【问题讨论】:

  • 回答你的第二个问题,stackoverflow.com/questions/81656/…
  • 问问你的教授他的意思。
  • 也许快速浏览一下this,可能有助于回答您的问题。
  • 你在问什么? cc++?
  • C 中,breakcasevoid 是关键字。 &{% 是标点符号。 #include 是两个单独的标记(# 标点符号和 include 标识符)。 main 只是一个标识符。来源:N1570。顺便说一句,永远不要将这些问题同时标记为 C 和 C++,因为它们是不同的语言;例如,_Bool 在 C99 中是关键字,但在 C++ 中不是。

标签: c keyword


【解决方案1】:

有关标准文档的链接,请参阅 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 预处理器中一样,符号也不是关键字。

您的教授名单

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

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

C11

上述标记(区分大小写)被保留(在翻译阶段 7 和 8 中)用作 关键字,不得用于其他用途。

C++14

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

【讨论】:

    【解决方案2】:

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

    运算符不是关键字。 #include 不是关键字。 main 不是关键字(其实可以用main 作为变量名)。

    你会引用 C 规范:

    6.4.1 关键字

    语法

    关键字:其中之一

    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

    【讨论】:

    • 如果您定义为“语言保留的其他合法标识符”,那么它们包含更多内容:基本上所有单词“以下划线开头,后跟另一个下划线或大写字母”都成为关键字。
    • 标准对保留标识符和关键字的描述不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多