这对ANSI C是真的吗?
“const和volatile限定符可以位于任何声明之前。” 我在一个在线测试系列中看到这句话被标记为true。 但在标准C(89)中,我可以看到这对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
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);
是毫无意义的,如果这是您的意思,那么将忽略限定符。但是在声明中包含它是合法的。