这对ANSI C是真的吗?

这对ANSI C是真的吗?,c,ansi,C,Ansi,“const和volatile限定符可以位于任何声明之前。” 我在一个在线测试系列中看到这句话被标记为true。 但在标准C(89)中,我可以看到 declaration: declaration-specifiers init-declarator-listopt ; declaration-specifiers: storage-class-specifier declaration-specifiersopt type-specifier declaratio

“const和volatile限定符可以位于任何声明之前。”

我在一个在线测试系列中看到这句话被标记为true。 但在标准C(89)中,我可以看到

declaration:
     declaration-specifiers init-declarator-listopt ;
declaration-specifiers:
     storage-class-specifier declaration-specifiersopt
     type-specifier declaration-specifiersopt
     type-qualifier declaration-specifiersopt
     function-specifier declaration-specifiersopt
init-declarator-list:
     init-declarator
     init-declarator-list , init-declarator
init-declarator:
     declarator
     declarator = initializer
从上面看来,这句话可能会在一些声明中出现错误

请帮忙

编辑:我知道这对ISO C89或更高版本无效,但请建议对ANSI有效,以便教育机构了解问题缺陷并提供一些证据

类型限定符声明说明符(opt)


允许类型限定符,例如
const
volatile
,后跟声明说明符。下列声明说明符可以是函数声明。

您确实可以将
const
volatile
放在任何声明之前,而不违反C的语法规则。这并不意味着这样的构造有意义,不会被完全忽略,或者不会因为其他原因触发编译错误。这只意味着它不会触发语法错误

C89规范第3.5.3节规定

如果函数类型的规范包含任何类型限定符, 该行为未定义

这意味着将函数声明为
const
volatile
是完全合法的,只要您不实际调用该函数。如果你试着打电话给它,就不知道会发生什么。这是在C语言中可以做的几件事之一,这些事在技术上是合法的语法,但完全没有意义(比如语句
1==3;
x+2;


要在编辑中澄清您的评论,请注意术语“ANSI C”和“C89”指的是同一事物。C的ANSI和ISO标准只在格式上有所不同。这些标准的内容通常被称为“C89”或“C90”(以区别于后来ANSI标准化的C99)。当您说“我知道这对ISO C89或更高版本无效”时,您的语句也包括“ANSI C”。

您没有从语法中粘贴“volatile”和“const”。我们不能说,看看这部分语法,@alinsoar,不偏不倚?你是说部分?请在此搜索术语
const volatile int f(void)有什么问题?@BoPersson:-哈哈,完美地使用了“and”操作符;)限定符可以放在任何声明之前。。。。我明白这一点,但问题在于“any”……语法上说的是“any”(虽然严格来说,限定符是声明的一部分,所以它们不在声明之前)。当然,我也这么认为,因为限定符是可选的,并且只对少数类型的声明有效,比如变量声明等。当然,有一个
常量int foo(int n);
是毫无意义的,如果这是您的意思,那么将忽略限定符。但是在声明中包含它是合法的。