这在语法上是正确的 C 代码吗?



我刚刚开始学习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 而不是 voidmain 函数中。因此,您的程序违反了约束。

首先,让我们澄清一下,因为您引用了main函数,显然(但似乎不是全部(这个答案假设您指的是托管环境,因为对于独立环境(请参阅 ISO/IEC 9899:2011">§5.1.2.1 独立环境"(,根本没有任何要求,并且在程序启动时调用的函数的名称和类型是实现定义的.

回到托管环境,定义C语言的标准,在其最新版本ISO/IEC 9899:2011中,针对C11,以足够严格的方式描述了程序启动功能的要求(§5.1.2.2.1程序启动(。

要尊重的要点基本上是:

  • main函数必须返回一个int
  • 只允许 2 种变体:
    1. 没有参数,如 : int main(void) { /* ... */ }
    2. 有 2 个参数,参数元素计数和参数数组如下: int main(int argc, char *argv[]) { /* ... */ }

允许一些实现变化,但只能作为相同参数的不同表示形式(即代替char *argv[]等效char **argv,或者针对特定类型的某些typedefargcint类型中解析(。

一些主要编译器生产者(通常是 MS(void main() { /* ... */ }允许的非常常见的定义并不严格符合 C99-C11

事实上,在函数声明符中使用空括号是一个过时的功能,可以在未来的标准修订版中删除,如">§6.11 未来语言方向"中所述(感谢报告我的不精确性(。事实上,许多编译器都符合 C99-C11 标准,会发出警告。

因此,考虑前面提到的过时将是一个好习惯,使用更标准的声明。

总之,您的声明是错误的,因为:

  1. return; 不返回任何值
  2. (可选(考虑main()错过void(严格的 C99-C11(
您返回的内容取决于您想要返回的内容。我们只说一个普遍接受的约定是从 main 返回值 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 在本标准中,"应">解释为 对实施或程序的要求;相反 "不得"应解释为禁止。

相关内容

  • 没有找到相关文章

最新更新