如何确定此代码符合哪个C标准?

如何确定此代码符合哪个C标准?,c,C,在C实验室中,出现以下uber简单代码: #include <stdio.h> int suma (int a, int b) { return a+b; } int mult (int a, int b) { return a*b; } int main(void) { int a,b; printf ("Operando 1: "); scanf("%d",&a); pr

在C实验室中,出现以下uber简单代码:

#include <stdio.h>

int suma (int a, int b)
{
        return a+b;
}

int mult (int a, int b)
{
        return a*b;
}

int main(void)
{
        int a,b;
        printf ("Operando 1: ");
        scanf("%d",&a);
        printf("Operando 2: ");
        scanf("%d",&b);
        printf("%d+%d=%d\n",a,b,suma(a,b));
        printf("%d*%d=%d\n",a,b,mult(a,b));
        return 0; 
}
#包括
内特苏马(内特a,内特b)
{
返回a+b;
}
int mult(int a,int b)
{
返回a*b;
}
内部主(空)
{
INTA,b;
printf(“操作数1:”);
scanf(“%d”和“&a”);
printf(“操作数2:”);
scanf(“%d”和“b”);
printf(“%d+%d=%d\n”,a,b,suma(a,b));
printf(“%d*%d=%d\n”,a,b,mult(a,b));
返回0;
}

通过查看代码,我应该确定它符合哪个C标准(ANSI、ISO或事实上的K&R)。在阅读之后,我倾向于说它符合三个标准。是这样吗

如果您碰巧使用了
gcc
,使用了
-std=…
-Wall
-pedantic
选项,您可能会更改它期望的标准,如果代码不符合,您可能会收到警告/错误。

如果您碰巧使用了
gcc
,使用了
-std=…
-Wall
-pedantic
选项如果代码不符合要求,您可能会更改它期望的标准,并收到警告/错误。

K&R C在函数声明中不包含参数


例如,请参见。

K&R C在函数声明中不包含参数


例如,请参见。

这不是K&R。K&R函数声明在括号外定义参数,如下所示:

int mult (a, b)
    int a;
    int b;
第一个ANSI标准引入了
void


在我看来,它似乎同时符合ANSI C89和C99。

它不是K&R。K&R函数声明在括号外定义了如下参数:

int mult (a, b)
    int a;
    int b;
第一个ANSI标准引入了
void

在我看来,它似乎同时符合ANSI C89和C99。

我说
C89
ANSI C89
ISO C90

它不是预标准(K&R)C:函数定义在声明中包含参数的类型信息

它遵循C89标准的所有规则和C99标准(*)的所有规则。但是,C99标准规定,
main
如果在没有返回语句的情况下到达结束
}
,则返回0。因此,写这个的家伙必须添加
返回0语句。。。或者这个问题没有多大意义

(*)前两个printf应该有一个'\n'(或调用
fflush(stdout);
来刷新输出我说
C89
ANSI C89
ISO C90

它不是预标准(K&R)C:函数定义在声明中包含参数的类型信息

它遵循C89标准的所有规则和C99标准(*)的所有规则。但是,C99标准规定,
main
如果在没有返回语句的情况下到达结束
}
,则返回0。因此,写这个的家伙必须添加
返回0语句。。。或者这个问题没有多大意义

(*)前2个printf应该有一个'\n'(或调用
fflush(stdout);
来刷新输出

将适用于ANSI C编译器


将适用于ANSI C编译器。

K&R C是否允许将
void
作为参数类型?ANSI或ISO(我忘了是哪个)没有规定
main
必须有
int argc
char**argv
作为参数吗?@我的正确意见是:C99允许
int main(void)
@JUST:我不知道第一个参数,但第二个参数是否定的。C89和C99都要求托管实现允许不带参数的
main
(5.1.2.2.1)。它们还要求托管实现支持
(int,char**)
版本。独立环境可以做他们喜欢的任何事情。@Steve Jessop:托管环境也可以做他们喜欢做的事情,但它被归类为“实现定义的”,即不可移植。我认为正确。我可以发誓,在某一点上,他们强制任何兼容系统使用
int,char**
版本。也许这是一个早期的草案。K&R C是否允许将
void
作为参数类型?ANSI或ISO(我忘了是哪个)没有规定
main
必须有
int argc
char**argv
作为参数吗?@我的正确意见是:C99允许
int main(void)
@JUST:我不知道第一个参数,但第二个参数是否定的。C89和C99都要求托管实现允许不带参数的
main
(5.1.2.2.1)。它们还要求托管实现支持
(int,char**)
版本。独立环境可以做他们喜欢的任何事情。@Steve Jessop:托管环境也可以做他们喜欢做的事情,但它被归类为“实现定义的”,即不可移植。我认为正确。我可以发誓,在某一点上,他们强制任何兼容系统使用
int,char**
版本。也许这是一个早期的草案。问题肯定是,“这符合什么标准?”而不是“这是编写代码的典型方式吗?”。我认为这个问题没有多大意义,不管-(1)谁甚至关心代码是否是K&R C了,(2)谁正式将标准称为ANSI/ISO而不是C89/C99?所以我不认为你的答案应该建立在这个问题有意义的假设上;-)当然,问题是“这符合什么标准?”而不是“这是编写代码的典型方式吗?”。我认为这个问题没有多大意义,不管-(1)谁甚至关心代码是否是K&R C了,(2)谁正式将标准称为ANSI/ISO而不是C89/C99?所以我不认为你的答案应该建立在这个问题有意义的假设上;-)喘息,但那将是欺骗!;)@蒂姆,但是如果这个问题引用了你做的结果,我会更尊重这个问题