我刚刚开始学习C语言,对return语句的使用及其在C语言中的重要性感到有些困惑。
这是我的代码片段。这在语法上是正确的还是我们必须在使用 int main(( 时返回任何数值 0 或 1?
#include<stdio.h>
int main()
{
int i;
for(i=0;i<10;i++)
printf("n Noooooooooo");
return ;
}
根据 C 2011 标准(草案 N1570(,第 6.8.6.4 条第 1 款:
不带表达式的 return 语句只能出现在返回类型为 void 的函数中。
您的 return 语句没有表达式,出现在返回类型为 int
而不是 void
的 main
函数中。因此,您的程序违反了约束。
main
函数,显然(但似乎不是全部(这个答案假设您指的是托管环境,因为对于独立环境(请参阅 ISO/IEC 9899:2011">§5.1.2.1 独立环境"(,根本没有任何要求,并且在程序启动时调用的函数的名称和类型是实现定义的.回到托管环境,定义C语言的标准,在其最新版本ISO/IEC 9899:2011中,针对C11,以足够严格的方式描述了程序启动功能的要求(§5.1.2.2.1程序启动(。
要尊重的要点基本上是:
main
函数必须返回一个int
。- 只允许 2 种变体:
- 没有参数,如 :
int main(void) { /* ... */ }
- 有 2 个参数,参数元素计数和参数数组如下:
int main(int argc, char *argv[]) { /* ... */ }
- 没有参数,如 :
允许一些实现变化,但只能作为相同参数的不同表示形式(即代替char *argv[]
等效char **argv
,或者针对特定类型的某些typedef
在argc
的int
类型中解析(。
一些主要编译器生产者(通常是 MS(void main() { /* ... */ }
允许的非常常见的定义并不严格符合 C99-C11。
事实上,在函数声明符中使用空括号是一个过时的功能,可以在未来的标准修订版中删除,如">§6.11 未来语言方向"中所述(感谢报告我的不精确性(。事实上,许多编译器都符合 C99-C11 标准,会发出警告。
因此,考虑前面提到的过时将是一个好习惯,使用更标准的声明。
总之,您的声明是错误的,因为:
-
return;
不返回任何值 - (可选(考虑
main()
错过void
(严格的 C99-C11(
0
(零( 表示正常终止(无错误(,任何其他值表示执行错误。
无论如何,为了精确起见,对于那些想要进入规格的人,我在下面报告特定段落的确切文本
5.1.2.2.1 程序启动
程序启动时调用的函数名为 main。 该实现没有为此声明原型 功能。它应以 int 的返回类型定义(强调我的,请参阅下面的 ISO 文档中术语的定义(,并且没有 参数:
int main(void) { /* ... */ } or with two parameters
(此处称为 argc 和 argv,尽管可以使用任何名称,如 它们是声明它们的函数的本地(:
int main(int argc, char *argv[]) { /* ... */ }
或同等学历;(请参阅下面的注释(或以某种其他实现定义的方式。
等效类型的注释说:
注意:因此,int 可以替换为定义为
int
的typedef
名称,或者argv
的类型可以写为char ** argv
,等等
最后,为了消除对术语">应"含义的任何疑问,ISO/IEC 9899:2011规范在§4.0段落"一致性低于标准1"中明确定义了它:
4.0 一致性
1 在本标准中,"应">应解释为 对实施或程序的要求;相反 "不得"应解释为禁止。