【问题标题】:Ambiguous between syntax and semantic error [closed]语法和语义错误之间的歧义[关闭]
【发布时间】:2021-06-25 10:16:42
【问题描述】:

对于 C/C++ 语言,有一个约束,即数组中的每个元素都必须具有相同的类型。所以如果我们用多种类型的元素初始化一个数组,就会发生错误。这是错误语法/语法还是语义错误?

【问题讨论】:

  • C 和 C++ 是不同的语言,另请参阅您应用的标签说明。在任何情况下,请参阅 C++ 标准(或例如 cppreference.com)了解两个错误类之间的区别(如果有)。
  • @Duy Duy 这是一个语义错误。例如 C++ 中初始化器的窄化转换。
  • int a [] = {c,d,e,f}; 在句法和语法上都是正确的。
  • “发生错误” - 这没什么。什么错误?
  • 除非询问两种语言之间的差异或交互,否则不要同时标记 C 和 C++。

标签: grammar semantics


【解决方案1】:

C 词法分析或语法中没有任何东西可以区分 intvoid。两者在 C 语法中只出现一次,在 C 6.7.2 1 中作为 类型说明符。因此,区分这两个代码示例的唯一方法:

void *x[] = { (char *) 0 };

int *x[] = { (char *) 0 };

是通过使用代码的含义,如 C 标准在约束和其他文本中给出的。它们实际上由编译器区分,因为第一个被接受而没有抱怨类型,但第二个导致抱怨数组元素的初始化程序的类型。因此,这是一个语义错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多