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

时间:2018-04-29 16:08:16

标签: c main

我刚刚开始学习C并且对使用return语句及其在C语言中的重要性感到困惑。

这是我的代码段。这在语法上是正确的还是在使用int main()?

时我们必须返回任何数值0或1
#include<stdio.h>

int main()
{
        int i;


        for(i=0;i<10;i++)
              printf("\n Noooooooooo");

        return ;      
 }

2 个答案:

答案 0 :(得分:3)

根据C 2011标准(草案N1570),第6.8.6.4条第1款:

  

没有表达式的return语句只能出现在返回类型为void的函数中。

您的return语句没有表达式,并显示在main函数中,其返回类型为int,而不是void。因此,您的程序违反了约束条件。

答案 1 :(得分:0)

首先让我们澄清一下,因为你引用main函数,显然(但似乎并非一切)这个答案假设你指的是托管环境,因为独立环境(参见 ISO / IEC 9899:2011 §5.1.2.1独立环境”)根本没有要求和在程序启动时调用的函数的名称和类型是实现定义的

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

要遵守的要点基本上是:

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

允许一些实现变体,但仅作为相同参数的不同表示(即,char *argv[]代替char **argv,或某些typedef,用于解析{{1} } {} int}。

一些主流编译器生产商(通常是MS)允许的非常常见的定义argc并非严格遵循C99-C11

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

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

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

  1. void main() { /* ... */ }您没有返回值
  2. 可选择考虑return;错过main()(严格C99-C11)
  3. 你的回报取决于你想要的回报。我们只说通常接受的一般约定是从main返回值void(零)以进行正常终止(无错误),任何其他值表示执行错误。

    无论如何为了精确起见,对于那些想要了解内部规格的人,我在下面报告具体段落中的确切文字

      

    5.1.2.2.1程序启动

         

    程序启动时调用的函数名为main。   该实现声明没有原型   功能。 应定义为返回类型为int (强调我的,请参见下面ISO文档中 一词的定义)并且没有   参数:

    0
         

    (这里称为argc和argv,但可以使用任何名称,如   它们是声明它们的函数的本地符号:

    int main(void) { /* ... */ } or with two parameters
    
         

    或等效的;(见下面的注释)或其他一些实现定义的方式。

    等效类型的注释表示:

      

    注意:因此,int可以被定义为 int main(int argc, char *argv[]) { /* ... */ } typedef名称或int的类型替换可以写成argv,依此类推

    最后为消除对“ ”一词含义的疑问, ISO / IEC 9899:2011 规范明确定义了§4.0一致性在subpar。 1

      

    4.0符合性

         

    1 在本国际标准中,' ''应被解释为   对实施或程序的要求;反过来,   “不得”被解释为禁止。